Bonjour,
J'ai déjà posté un sujet concernant la pagination d'une recherche mais je tiens à publié mon problème sous un autre angle.
En somme, j'ai un un formulaire de recherche avec un input qui sert à entrer un mot clé. ma recherche se fait
dans mon Controller Dossier
et la fonction recherche() trouve ses résultats dans 2 tables différentes :
La table Dossier et la table Personne
Ma fonction recherche fonctionne correctement et me retourne bien les bons résultats
Si je tape un N° de dossier => redirection sur la vue de ce dossier
Si je tape le prénom ou le nom d'une personne => affichage des personnes correspondantes.
http://localhost/cakephp/dossiers/recherche
Cependant si je tape "michel" cela me retourne beaucoup de résultats et c'est là que le système de pagination rentre en jeu
si je clic sur la page 2
mon URL s'affiche bien correctement:
http://localhost/cakephp/dossiers/recherche/page:2
mais un message d'erreur apparait :
Notice (8): Undefined index: Dossier [APP\Controller\DossiersController.php, line 19]
et cela m'affiche la liste complète des personnes (+ de 11 000 personnes)
ma ligne 19 de mon controller est la récupération des données du formulaire recherche :
$motcle0 = $this->data'Dossier']'motcle'];
Faut-il que dans mes boutons de pagination je change le paginator options pour qu'il envoi à nouveau le mot clé à ma fonction recherche
Ou bien que je mette directement le mot clé en paramètre dans l'URL pour que la pagination fonctionne correctement ?
j'ai essayé un input type hidden qui envoi de nouveau le mot clé à ma fonction recherche mais sans succès ..
affiche carrément tout l'objet :)
debug($this);
et regarde dans la structure ou se trouve ta recherche
ca devrait être $this->Request
debug($this->Request);
ou à l'intérieur $this->Request->data
debug($this->Request->data);
C'est bon j'ai trouvé la solution !
en faite je tes donné le debug de la page 1.
j'aurais du mettre le debug de la page 2
et j'ai ça comme résultats :
data => array()
query => array(
'motcle' => 'MICHEL'
)
donc dans mon DossiersController j'ai mis :
//si la donnée du formulaire existe => récupération du mot clé du form
if(isset($this->data'Dossier']'motcle'])) {
echo $motcle0 = $this->data'Dossier']'motcle'];
}
else {
//sinon prise du mot clé dans le query
$motcle0 = $this->request->query'motcle'];
}
et tout marche bien, la pagination ainsi que le tri : asc/desc
voilà tout :D
Merci pour ton aide précieuse ;)
Bonne continuation...
Si à ce que je semble avoir compris tu veux intégrer ta pagination à ta recherche tu peux faire ceci
$options = array(
'url'=> array(
'controller' => 'dossiers',
'action' => 'recherche',
'?' => 'motcle='.$motcle0
)
);
puis juste passer le tableau à ton paginator
$paginator->options($options)
sinon j'ai pas trop bien saisis d'ou venait ton soucis? est ce que le fait de rajouter une pagination dans l'url bouzille ta recherche, ou change la structure de ton $this->data , ... bref!... mais sinon je penses qu'à ta place je ferais quelques petit debug sur par exemple $this->params (et notammement sur $this->params'pass']) pour voir si j'arrive a récupérer ce que je (donc tu) veux récupérer :) (je sais c'est con de ma part je répond sans trop savoir ce qui bloque) et ensuite agir en conséquence
je m'explique
peut être qut ton mot clé est toujours à la même position dans ton $this->params'pass'] et donc tu n'aura plus besoin de mettre
$motcle0 = $this->data'Dossier']'motcle'];
mais plutot un truc du genre
$motcle0 = $this->params'pass'][0];
that's all
j'espère que ca aidera :)
Merci de t'as réponse.
j'ai appliqué ce que tu m'a dit
$options = array(
'url'=> array(
'controller' => 'dossiers',
'action' => 'recherche',
'?' => 'motcle='.$motcle
)
);
echo $this->Paginator->options($options);
et Quand je clic sur la page 2 j'ai bien :
http://localhost/cakephp-Archtiase/dossiers/recherche/page:2?motcle=MICHEL
seulement je pense que quand je clic sur la page 2, CakePhp retourne dans le DossiersController, action => recherche
et s’aperçoit que la donnée envoyée par le formulaire
$this->data[Dossier][motcle]
n’existe plus et donc il me renvoi un message d'erreur.
il faudrait que j'applique cela au début de :
//si la donnée du formulaire existe => récupération du mot clé du formulaire dans variable $motcle0
if(isset($this->data'Dossier']'motcle'])) {
echo $motcle0 = $this->data'Dossier']'motcle'];
}
else {
//sinon prise du mot clé dans l'URL
$motcle0 = $this->params'pass'][0]; // j'ai mis ça mais je ne sais pas si c'est bien
}
je n'est pas très bien compris l'histoire du $this->params'pass']
pour info :
le debug($this->params'pass']) => array()
le debug de ($this->request):
params => array(
'plugin' => null,
'controller' => 'dossiers',
'action' => 'recherche',
'named' => array(),
'pass' => array(),
'paging' => array(
'Personne' => array(
'page' => (int) 1,
'current' => (int) 20,
'count' => (int) 126,
'prevPage' => false,
'nextPage' => true,
'pageCount' => (int) 7,
'order' => 'Personne.id ASC',
'limit' => (int) 20,
'options' => array(),
'paramType' => 'named'
)
),
'models' => array(
'Dossier' => array(
'plugin' => null,
'className' => 'Dossier'
),
'Personne' => array(
'plugin' => null,
'className' => 'Personne'
),
'Localisation' => array(
'plugin' => null,
'className' => 'Localisation'
)
)
)
data => array(
'Dossier' => array(
'motcle' => 'michel'
)
)
query => array()
url => 'dossiers/recherche'
base => '/cakephp-Archtiase'
webroot => '/cakephp-Archtiase/'
here => '/cakephp-Archtiase/dossiers/recherche'
mais je n'est rien dans le pass...
mon formulaire de recherche est en method='post'.
faut-il que je le change en method='get' ?
heuh??? pourquoi tu veux changer? tes paramètres sont la! (ligne 36 du debug que tu m'as copié)
data => array(
'Dossier' => array(
'motcle' => 'michel'
)
)
donc pour y accéder tu fais
$motcle0 = $this->Request->data'Dossier']'motcle'];