Bonjour à tous !

Je voudrais filtrer les données d'une vue index pour un controller Occupations

Dans ma vue index j'ai donc par defaut un tableau avec toutes les occupations.

Je voudrais pouvoir afficher seulement celles qui sont "en cours" et celles qui sont "terminées" en cliquant sur des boutons citués au dessus de mon tableau.

La méthode que j'utilise pour le moment est de creer 3 liens dans ma vue :

<p>
    <span><?php echo $this->Html->link(__('En cours', true), array('action' => 'filter_active')); ?></span>
    <span><?php echo $this->Html->link(__('Terminées', true), array('action' => 'filter_active')); ?></span>
    <span><?php echo $this->Html->link(__('Tout', true), array('action' => 'index')); ?></span>
</p>

qui renvoies vers 3 actions de mon controller Occupations :

public function index() {
        // similaire à un findAll(), mais récupère les résultats paginés
        $data = $this->Paginator->paginate('Occupation');
        $this->set('data', $data);
    }

    // filtre pour l'index - Locations en cours
    public function filter_active() {
        $data = $this->Paginator->paginate(
            'Occupation',
            array('Occupation.sortie' => null)
        );
        $this->set('data', $data);
    }

    // filtre pour l'index - Locations terminées
    public function filter_older() {
        $data = $this->Paginator->paginate(
            'Occupation',
            array('Occupation.sortie' != null)
        );
        $this->set('data', $data);
    }

Il me reste donc à créer les vues correspondantes pour afficher les résultats mais n'y à t'il pas une meilleure méthode ? comme peut être tout gérer directement dans la fonction index de mon controller Occupation et tout afficher dans la vue index correspondante ? Je dois pouvoir récupérer le clic du lien avec un GET dans mon action index, non ?

Merci d'avance pour vos avis éclairés.

3 réponses


kozzy34
Auteur
Réponse acceptée

J'ai finalement réglé mon problème tout seul ;)

voici la fonction :

public function index() {

        $filter = $this->params['url'];

        if(!empty($filter)) {
            if($filter['filter'] == 'active') {
                $data = $this->Paginator->paginate(
                    'Occupation',
                    array('Occupation.sortie' => null)
                    );
                    $this->set('data', $data);
            } else {
                $data = $this->Paginator->paginate(
                    'Occupation',
                    // LA SOLUTION !!!!
                    array('Occupation.sortie IS NOT NULL')
                    );
                $this->set('data', $data);
            } 
        } else {
            $data = $this->Paginator->paginate('Occupation');
            $this->set('data', $data);
        }
    }
kozzy34
Auteur

J'ai tenté de faire passer des paramètres dans l'url puis de récupérer ce paramètre dans mon controller en enfin d'effectuer une pagination en fonction de ce paramètre.

j'arrive bien à récupérer mon paramètre avec

$filter = $this->params['url'];

Mais ensuite ma fonction index ne fait rien de plus.....

public function index() {

        $filter = $this->params['url'];
        debug($filter);

        if($filter == 'active') {
            $data = $this->Paginator->paginate(
                'Occupation',
                array('Occupation.sortie' => null)
                );
            $this->set('data', $data);
        } elseif($filter == 'older') {
            $data = $this->Paginator->paginate(
                'Occupation',
                array('Occupation.sortie' != null)
                );
            $this->set('data', $data);
        } else {
            // similaire à un findAll(), mais récupère les résultats paginés
            $data = $this->Paginator->paginate('Occupation');
            $this->set('data', $data); 
        }  

    }
kozzy34
Auteur

J'ai réussi de cette manière, il n'y a que la condition pour afficher seulement les occupations terminées qui ne fonctionne pas

public function index() {

        $filter = $this->params['url'];

        if(!empty($filter)) {
            if($filter['filter'] == 'active') {
                $data = $this->Paginator->paginate(
                    'Occupation',
                    array('Occupation.sortie' => null)
                    );
                    $this->set('data', $data);
            } else {
                $data = $this->Paginator->paginate(
                    'Occupation',
                    // PROBLEME AVEC CETTE CONDITION !!!!
                    array('Occupation.sortie' != null)
                    );
                $this->set('data', $data);
            } 
        } else {
            $data = $this->Paginator->paginate('Occupation');
            $this->set('data', $data);
        }

    }