IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

[sfPager][sfFilter] Pagination et Filtre sur le Frontend


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de guiyomh
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 328
    Par défaut [sfPager][sfFilter] Pagination et Filtre sur le Frontend
    Bonjour,
    j'ai fais une action qui liste les données de ma base de donnée. j'ai réussit à la paginer avec "sfDoctrinePager". Mais maintenant je souhaiterais appliquer un filtre sur cette liste.

    J'ai utiliser le filtre généré par l'admin, ça fonctionne bien pour la première page.
    Mais lorsque je souhaite passer à la deuxième page, je perds le filtrage.

    Comment faire pour conserver le filtrage de page en page ?

    voici le bout de code sans l'objet filtre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    public function executeList( sfWebRequest $request){
          $this->pager = new sfDoctrinePager('Vehicule',15);
          $this->obj = $this->getRoute()->getObject();
          $q = Doctrine_Core::getTable('Vehicule')->createQuery('v')
              ->where('v.date_to >= ?',date('Y-m-d H:i:s',time()))
              ->orderBy('created_at DESC');
          if('Categorie' == $nameClass = get_class($this->obj)){
              $q->andWhere('categorie_id = ?', $this->obj->id);
              $this->route = 'categorie';
          }
          elseif('Typeprestation' == $nameClass){
              $q->andWhere('typeprestation_id = ?', $this->obj->id);
              $this->route = 'prestation';
          }
          else{
              throw new Exception('Class non définit');
          }
    //      echo $q; exit;
     
          $this->pager->setQuery($q);
          $this->pager->setPage($request->getParameter('page', 1));
          $this->pager->init();
          //$this->vehicules = $this->getRoute()->getObject()->Vehicule;
      }
    J'ai essayer plein de truc pour conserver le filtrage notamment en stockant les donnée du filtre dans l'objet user. Mais j'ai un autre soucis à ce moment là, il semblerait que ma requête post ne trouve pas la bonne "route" du coup je tombe sur une erreur 500.

    Please help me !

    //EDIT
    je rajoute ma route :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    categorie:
      url:  /categorie/:libelle/:id/*
      class:   sfDoctrineRoute
      options: { model: Categorie, type: object }
      param: { module: annonce, action: list }
      sf_method: post
     
    prestation:
      url:  /prestation/:libelle/:id/*
      class:   sfDoctrineRoute
      options: { model: Typeprestation, type: object }
      param: { module: annonce, action: list }
    Maintenant je m'y prends surment comme un manche pour faire ça. Donc s'il y a une meilleur façon je suis preneur.

  2. #2
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Je vais te proposer trois pistes, à toi de choisir la voies que tu veux prendre, on pourra toujours approfondir ensuite.

    Première voie, celle de la facilité, utiliser l'admin générateur.

    Deuxième voie, celle de l'analyse, utiliser un objet filter pour récupérer les données du filtre, les valider et générer la requête qui va bien automatiquement... Il est simple alors avec un ->getValues() de récupérer un array() des valleurs et de le sauvegarder dans le sfUser, pour les récupérer et réinitialiser l'objet lors de la session suivante, c'est la solution utilisée dans l'admin générteur. Une bonne solution pour s'en inspirer est de générer un admin générateur de test sur une table quelconque et d'aller dans le cache pour analyser le code généré.

    Troisième voie, si tu tiens à garder la tienne, je stockerais mes données de filtre dans un array.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    $tests = array( 'date' => 
                            array(
                                'champ' => 'v.date_to',
                                'type' => '>=',
                                'value' => 'date('Y-m-d H:i:s',time())'
                             ),
                        'Categorie' =>
                             array(
                                'champ' => 'categorie_id',
                                'type' => '=',
                                'value' => '2'     // récupéré par ton $this->obj->id
                              )
                 );
     
    // on peut monter le filtre par un :
    $q = Doctrine_Core::getTable('Vehicule')->createQuery('v')
         ->orderBy('created_at DESC');
    foreach ( $tests as $test )
    {
       $q->addWhere($test['champ'] . ' ' . $test['type'] . ' ?', $test['value']);
    }
     
    // pour stocker les filtres dans le sfUser
    $this->getUser()->setAttribute('Filtre', $tests, 'NomDuModule');
     
    // et pour récupérer les données
    $this->getUser()->getAttibute('Filtre', null, 'NomDuModule');
    Note que le tableau facilite la création de la requête.
    Ton code, avec quelques modifications, permettra parfaitement de récupérer les données et les mettre dans le tableau.


    La solution deux à ma préférence.

  3. #3
    Membre éclairé Avatar de guiyomh
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 328
    Par défaut
    Bonjour, merci pour la réponse.
    La solutions 2 a aussi ma préférence.

    j'avais déjà commencer à l'implémenter, mais je ne trouvais pas les classe générer par l'admin generator. J'avais pas pensé à regarder dans le cache. J'y vais de suite. Je vous tiendrais au courant.

  4. #4
    Membre éclairé Avatar de guiyomh
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 328
    Par défaut
    Bonjour, j'ai donc revue entièrement mon controller.

    voici à quoi l ressemble :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
     
    <?php
     
    /**
     * categorie actions.
     *
     * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
     */
    class categorieActions extends sfActions {
     
        public function executeIndex( sfWebRequest $request) {
            // pager
            if ($request->getParameter('page')) {
                $this->setPage($request->getParameter('page'));
            }
            $this->obj = $this->getRoute()->getObject();
            $this->setObject($this->obj);
            $this->stars = Doctrine_Core::getTable('Vehicule')->getStar();
            $this->pager = $this->getPager();
            //$this->vehicules = $this->getRoute()->getObject()->Vehicule;
        }
     
        protected function getPager() {
            $pager = new sfDoctrinePager('Vehicule',5);
            $pager->setQuery($this->buildQuery());
            $pager->setPage($this->getPage());
            $pager->init();
            return $pager;
        }
     
        protected function buildQuery() {
            if (null === $this->filters) {
                $this->filters = new VehiculeFormFilter();
            }
            $request = sfContext::getInstance()->getRequest();
            $this->filters->bind($this->getFilters());
            $query = $this->filters->buildQuery($this->getFilters());
            $query->where('date_to >= ?',date('Y-m-d H:i:s',time()))
                ->orderBy('created_at DESC')
                ->andWhere('categorie_id = ?', $request->getParameter('id',1));
            $this->route = 'categorie';
    //        $event = $this->dispatcher->filter(new sfEvent($this, 'front.build_query_categorie'), $query);
    //        $query = $event->getReturnValue();
            return $query;
        }
     
        protected function getFilters() {
            return $this->getUser()->getAttribute('front.vehicule.categorie.form.filters', array(),'front_module');
        }
     
        protected function setPage($page) {
            $this->getUser()->setAttribute('front.vehicule.categorie.page', $page, 'front_module');
        }
     
        protected function setObject($obj){
            $this->getUser()->setAttribute('front.vehicule.categorie.object', $obj, 'front_module');
        }
     
        protected function getObject(){
            return $this->getUser()->getAttribute('front.vehicule.categorie.object', null, 'front_module');
        }
     
        protected function getPage() {
            return $this->getUser()->getAttribute('front.vehicule.categorie.page', 1, 'front_module');
        }
     
        public function executeFilter(sfWebRequest $request) {
            $this->setPage(1);
            $obj = $this->getObject();
            if ($request->hasParameter('_reset')) {
                $this->setFilters(array());
                $this->redirect('@categorie?libelle='.$obj->libelle.'&id='.$obj->id);
            }
     
            $this->filters = new VehiculeFormFilter();
     
            $this->filters->bind($request->getParameter($this->filters->getName()));
            if ($this->filters->isValid()) {
                $this->getUser()->setAttribute('front.vehicule.categorie.form.filters', $this->filters->getValues(), 'front_module');
     
                $this->redirect('@categorie?libelle='.$obj->libelle.'&id='.$obj->id);
            }
            $this->obj = $this->getObject();
            $this->stars = Doctrine_Core::getTable('Vehicule')->getStar();
            $this->pager = $this->getPager();
            $this->setTemplate('index');
        }
    }
    il me reste encore un problème sur le filtrage, j'ai une erreur de type csrf token: Required.. Je comprends pas d'ou ça peux sortir. j'ai même pas soumis le formulaire.

    Une idée ?

    //Edit
    voici le partial qui fais le rendu de mon formulaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    <div class="box">
        <div class="box_content">
            <div class="titre">
                <h3>Filtre</h3>
                <div class="tl"><!-- --></div>
                <div class="bl"><!-- --></div>
                <div class="tr"><!-- --></div>
                <div class="br"><!-- --></div>
            </div>
            <div class="content">
     
                <form action="<?php echo url_for(array('module'=>$sf_request->getParameter('module'),'action'=>'filter')) ?>" method="post" >
                  <table>
                    <tfoot>
                      <tr>
                        <td colspan="2">
                          <?php echo $filters->renderHiddenFields() ?>
                          <input type="submit" value="Filtrer" />
                        </td>
                      </tr>
                      <tr>
                          <td colspan="2">
                              <a href="<?php echo url_for(array('module'=>$sf_request->getParameter('module'),'action'=>'filter','_reset'=>1)) ?>">Annuler le filtre</a>
                          </td>
                      </tr>
                    </tfoot>
                    <tbody>
                      <?php echo $filters ?>
                    </tbody>
                  </table>
                </form>
     
                <div class="clear"><!-- --></div>
                <div class="tl"><!-- --></div>
                <div class="bl"><!-- --></div>
                <div class="tr"><!-- --></div>
                <div class="br"><!-- --></div>
            </div>
        </div>
        <div class="tl"><!-- --></div>
        <div class="bl"><!-- --></div>
        <div class="tr"><!-- --></div>
        <div class="br"><!-- --></div>
    </div>

  5. #5
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Étonnant, en effet, tu as l'erreur à quel moment, comment est-elle matérialisée ?

  6. #6
    Membre éclairé Avatar de guiyomh
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 328
    Par défaut
    Bonjour,

    Ma page est composé de 2 colonnes une principale avec ma liste, et un secondaire avec mon formulaire de filtrage.

    Et juste au dessus du formulaire de filtrage j'ai un message d'erreur : "csrf token: Nécessaire."

    Mais je me demande si celà ne vient pas de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->filters->bind($this->getFilters());
    dans la methode "buildQuery". Car au tout début le ça retour un tableau vide, car il n'y a jamais eu de filtrage.

    Faut que je trouve un moyen pour ne pas initialiser le filtre avec un tableau vide s'il n'y a pas de valeur de filtre stocké dans la session. Je pense que ça viens de là. Dis-moi si je me trompe.

Discussions similaires

  1. Checkbox sur un gridview paginé et filtré
    Par sorlok dans le forum ASP.NET
    Réponses: 4
    Dernier message: 13/05/2008, 11h50
  2. Filtre sur un ADODataSet
    Par dleu dans le forum Bases de données
    Réponses: 6
    Dernier message: 21/12/2004, 17h58
  3. Pb Filtre sur ADOTable
    Par liazidf dans le forum Bases de données
    Réponses: 1
    Dernier message: 08/11/2004, 11h34
  4. Filtre sur une base Paradox
    Par mika dans le forum Bases de données
    Réponses: 2
    Dernier message: 11/03/2004, 11h51
  5. [Sybase] filtre sur caractères spéciaux
    Par montelieri dans le forum Sybase
    Réponses: 4
    Dernier message: 07/04/2003, 16h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo