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 ..

7 réponses


BenFarhat
Réponse acceptée

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);
maxime014
Auteur
Réponse acceptée

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'];

parfait :)