Bonjour à tous,

Je suis un peu confu. J'ai réussi à faire fonctionner la fonctionnailé Paginator

$this->paginate = array('Article'=>array('limit'=>12,'order'=>'name ASC'));
            $d'articles'] = $this->Paginate('Article',array('type'=>'article','online'=>1,'created <= NOW()','or' => $conditions));

depuis le ArticlesController -> admin_index()et ca fonctionne.

Actuellement, j'ai mis ce formulaire dasm mon layout default.ctp, afin d'avoir un champ de rechercher

<?php
echo $this->Form->create(null, array(
                        'url' => array(
                            'controller' => 'searches', 
                            'action' => 'index',
                            'member' => false
                            ),
                        'class'=>'navbar-form',
                        'novalidate',
                        'role'=>'search'
                        )); 
?>
<?php echo $this->Form->input('key',array('label'=>false,'class'=>'form-control','placeholder'=>__("Chercher"))); ?>
<?php echo $this->Form->input('cat',array('label'=>__(" uniquement dans les articles"),'type'=>'checkbox','checked'=>'checked')); ?>
        <!--
        <span class="input-group-btn">
                <button class="btn btn-default" type="submit">Search</button>
            </span>
        -->
        <?php
        $options = array(
            'label' => null,
            //'class' => 'btn btn-default',
            'div' => array(
                'class' => '',
                'style' => 'display:none'
            )
        );
        echo $this->Form->End($options); 
?>

J'ai aussi créé un nouveau controller SearchesController qui a une action, voici le code

<?php
class SearchesController extends AppController{

    function index(){
        $data = current($this->request->data);
        #debug($data);

        if($this->request->is('put') || $this->request->is('post') ){

            $search_terms = explode(' ', $data'key']);
            $search_terms = array_diff($search_terms,array(''));
            if(!$data'cat']){
                /**
                * Search in Page table (En preparation
                **/     
            }
            /**
            * Search in Articles table
            **/ 
            $conditions = array();
            foreach($search_terms as $search_term){
                $conditions] = array('Article.name Like' =>'%'.$search_term.'%');
                $conditions] = array('Article.content Like' =>'%'.$search_term.'%');
                $conditions] = array('Article.noarticle Like' =>'%'.$search_term.'%');
            }

            $this->loadModel('Article');
            $this->Article->contain('Tag');
            $this->paginate = array('Article'=>array('limit'=>12,'order'=>'name ASC'));
            $d'articles'] = $this->Paginate('Article',array('type'=>'article','online'=>1,'created <= NOW()','or' => $conditions));
           /*
            $d'articles'] = $this->Article->find('all', array(
                'conditions' => array(
                    'online'=>'1',
                    'type'=>'article',
                    'created <= NOW()',
                    'OR' => $conditions
                    )//,
            //  'fields'=> array('name','content','noarticle','created','id','type','slug')
            ));
            */

            if(!$data'cat']){
                $d'search'] = array_merge($d'pages'],$d'articles']);    
                $this->set($d);
            }else{
                //$d'articles'];
                //debug($d);
                $this->set($d);
                $this->render('/Articles/thumbnails');
            }

            // SEND THE VALUES TO THE VIEW

        }else{
            echo 'e';
        }
    }
}

Qu'es-ce qu'il se passe quand j'entre un critere de recherche et je tape sur la touche enter?
Ben ca fonctionne, ceci

$this->set($d);
                $this->render('/Articles/thumbnails');

me retourne les bon éléements dans le template 'thumbnails.ctp' qui se trouve dans le dossier de la vue 'Articles'.

Aussi, la pagination s'affiche aussi bien. Dans mon cas j'ai 5 pages, donc de 1 à 5 et mopn url est la suivante

http://localhost:8888/cakephp/searches

Si je veux voir la suite du resultat de ma recherche et je clique sur le line '2', la ca bug.
Mon URl est maintenant comme celle ci:

http://localhost:8888/cakephp/searches/index/page:2

et il m'affiche ce message d'erreur:

Notice (8): Undefined variable: search [APP/View/Searches/index.ctp, line 5]

Si mon paginator fonctionne bien si je reste dans le meme controller

Avez-vous une idée pour faire un fonctionnalité de recherche et corriger mon paginator?

Merci beaucoup

2 réponses


pierrot10
Auteur
Réponse acceptée

J'ai résolu mon problème
En fait le problème venais du fait que lorsque je tapais un mot dans mon champs de recherche, la valeur était envoyée en post

$data = current($this->request->data);

        if($this->request->is('put') || $this->request->is('post') ){

Puis en suite, quand je cliquais sur le 2 de la pagination, l'envoi n'est plus envoyé par un formulaire, mais par une variable via une URL.
Donc cette condition

if($this->request->is('put') || $this->request->is('post') ){

n'était plus respectée.

J'ai donc utilisé les sessions pour "mémorisé" le critère de recherce
Résultat final:

<?php
class SearchesController extends AppController{

    function index(){
        $data = current($this->request->data);

        if($this->request->is('put') || $this->request->is('post') ){

        $search_terms = explode(' ', $data'key']);
            $search_terms = array_diff($search_terms,array(''));
            $this->Session->write('Search.terms',$search_terms);
        }
        $conditions = array();
        foreach($this->Session->read('Search.terms') as $search_term){
            $conditions] = array('Article.name Like' =>'%'.$search_term.'%');
            $conditions] = array('Article.content Like' =>'%'.$search_term.'%');
            $conditions] = array('Article.noarticle Like' =>'%'.$search_term.'%');
        }

        $this->loadModel('Article');
        $this->Article->contain('Tag');
        $this->paginate = array('Article'=>array('limit'=>12,'order'=>'name ASC'));
        $d'search'] = $this->Paginate('Article',array('type'=>'article','online'=>1,'created <= NOW()','or' => $conditions));
                #debug($d);
        $this->set($d);
$this->render('/Articles/thumbnails');
    }
}

J'ai encore un dernier problème par rapport a ce code corrigé. Je manque encore de connaissances et de la peine sur les liaisons des tables.

J'aimerais que la recherche soit faite aussi bien dans la table 'article' que dans la table 'page' . Comment puis-je corrigé ceci?

Milles mercis

Bonjour.
Je ne voulais pas te répondre, mais bon ...
Déjà, pour commencer, que donne le debug lors de la requête via la pagination ?
Ensuite, tu dis et tu as mis dans ton controller que l'affichage se fait à priori sur la vue thumbnails de ton dossier Articles , mais sur l'erreur de la pagination, il est indiqué que tu aurais une erreur à la ligne 5 de ta vue index dans Articles.
J'ai du mal à comprendre là, par contre il semble évident qu'il perd la valeur de la variable $search.
Ce n'est pas étonnant, vu que tu envois la valeur de la variable $cat lors de l'envoi du formulaire et que tu ne défini ta variable $search uniquement que quand la variable $cat n'est pas vide et tu dois en perdre la valeur lors de la pagination.
Il serait peut-être de mise de sauvegarder la valeur de $cat en Session via un write et en récupérer la valeur via un read de la Session pour en faire transiter la valeur.

Bref, je ne vais pas approfondir ni préciser plus, étant donné que nos aides semblent t'être inutiles.