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 :

Liste déroulante filtre Débutant


Sujet :

Symfony PHP

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 188
    Par défaut Liste déroulante filtre Débutant
    Bonjour,

    pour faire simple, j'ai un objet Reunion qui a pour propriétés id, name, town.

    Je souhaite afficher dans une liste déroulante toutes les town déjà entrées en base de données pour permettre un filtrage par ville déjà référencée.

    Dans la classe de mon filtre, j'ai

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
     
    	  $this->widgetSchema['town'] = new sfWidgetFormChoice(array(
    																 'choices'  => Doctrine_Core::getTable('Reunion')->getTowns(),
    																 'label' => 'Town',
    																 ));

    Dans la classe ReunionTable, j'ai cette méthode

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    	 public function getTowns()
    	{
     
    			$q = Doctrine_Query::create()
    			->select('r.town')
    			->from('Reunion r');
     
    		return $q->execute();
    	}

    Dans mon template, j'inclus un partial qui a ce code:

    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
     
     
    <form action="<?php ?>" method="get" >
     
    <table>
    <tfoot>
    <tr>
    <td>
    <input type="submit" value="Save" />
    </td>
    </tr>
    </tfoot>
    <tbody>
    <?php echo $filter ?>
    </tbody>
    </table>
    </form>
    Je me rends compte qu'il affiche par défaut dans ma liste déroulante le name de la réunion et que si je veux afficher la liste des villes, je dois éditer la méthode to_String() et retourner la town.
    Le problème: imaginons que j'ai plusieurs champs comme town dans mon objet et que je veuille compléter mon filtre, j'aurais toujours une unique méthode toString dans l'objet meeting.

    Comment faire alors? Suis-je obligé de créer un objet pour chaque liste déroulante (un objet town, un objet codepostale ... et utiliser la méthode to_String de chaque objet?

    Merci

  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 pense que tu as là la bonne solution.

    Mais rien ne t'oblige à tous mettre dans chaque objet... Tu en fais un principale, et juste des enfants de ton principale pour pouvoir avoir plusieurs _toString().

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 188
    Par défaut
    Je me rends compte que cela donne bien une liste déroulante mais pas un filtre.
    Je suis vraiment surpris qu'il n'y ait pas + de support pour les filtres en front end.

    J'ai tenté de tweeker le filtre l'admin côté backend et de le mettre en front end.
    Mais c'est un peu le bordel car les actions sont à recoder mais on ne sait ps trop quoi changer.

    De plus, je ne sais pas trop comment retirer les boutons edit et delete car je veux juste une liste

    Personne a sérieusement un vrai tutorial là dessus?

    Merci.

  4. #4
    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 crois que je commence a comprendre.

    Tu veux une liste avec des fonctions de filtre. Un peu comme dans l'admin, mais en plus souple.

    J'ai un projet dans ce sens, c'est vraiment à l'état bricolage, mais cela marche, filtre et tris sans avoir a refaire des tonnes de code à chaque module (génération automatique des entête de colonnes avec filtres possible sur certaines colonnes et filtres pour certaines colonne sur la deuxième ligne. Puis les données avec une pagination.

    C'est plus de l'alpha que fonctionnel, mais, c'est un bon début.

    Est-ce cela que tu recherches ?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 188
    Par défaut
    Oui, exactement!
    Je suis vraiment intéressé Michel.

    Merci.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 188
    Par défaut
    Je recommence:

    J'ai une liste de catégories dans mon filtre et une liste de trees qui s'affiche.
    Chaque tree appartient à une ou plusieurs catégories.

    Je veux pouvoir choisir une catégorie dans mon filtre et afficher les trees qui correspondent.

    Voici mon action qui affiche dans un premier temps tous les trees.
    Dans un deuxième temps, après validation du filtre, elle est sensée me sélectionnée les bon trees.
    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
     
     
    public function executeIndex(sfWebRequest $request)
    {
     
    $this->zulu_trees = Doctrine::getTable('ZuluTree')->retrieveFutureTree();
     
    $this->filter = new ZuluTreeFormFilter();		
     
    if($request->isMethod('post')) { 
     
    $this->filter->bind($request->getParameter($this->filter>getName())); 
     
    	if ($this->filter->isValid()) {
     
    		$this->setFilters($this->filter->getValues());
     
    		// ($this->filter->getValues())  retourne l'id de la category
     
    	}
     
     
    } 
    }
    Voici mon partial _filter.php qui est inclus dans le indexSuccess.php

    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
     
    <?php use_stylesheets_for_form($filter) ?>
    <?php use_javascripts_for_form($filter) ?>
     
    <form action="<?php echo url_for('tree/index'); ?>" method="post
    " id="<?php echo $filter->getName() ?>" >
     
    <table>
    <tfoot>
    <tr>
    <td>
    <input type="submit" value="Filtrer" />
    </td>
    </tr>
    </tfoot>
    <tbody>
    <?php echo $filter ?>
    </tbody>
    </table>
    </form>

    indexSuccess.php :

    J'inclus mon filtre et la liste de trees.

    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
     
     
    <?php include_partial('filter', array('filter' => $filter)) 
    	?>
     
     
    <table>
      <thead>
        <tr>
          <th>Id</th>
          <th>Name</th>
    	  <th>Categories</th>
          <th>Town</th>
          <th>Postalcode</th>
          <th>Date</th>
        </tr>
      </thead>
      <tbody>
        <?php foreach ($zulu_trees as $zulu_tree): ?>
        <tr>
          <td><a href="<?php echo url_for('tree/show?id='.$zulu_tree->getId()) ?>"><?php echo $zulu_tree->getId() ?></a></td>
          <td><?php echo $zulu_tree->getName() ?></td>
         <td>
            <?php foreach ($zulu_tree->getZuluCategories() as $category)
    		 echo $category. " ";
    		 ?>
          </td>
          <td><?php echo $zulu_tree->getTown() ?></td>
          <td><?php echo $zulu_tree->getPostalcode() ?></td>
    	  <td><?php echo $zulu_tree->getDate() ?></td>
        </tr>
        <?php endforeach; ?>
      </tbody>
    </table>



    Je sais pas comment récupérer la liste des mes trees bien filtrées.
    Comment faire correspondre mon $zulu_trees avec la liste de trees filtrées?

    Merci beaucoup

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 188
    Par défaut
    Personne ne sait me répondre ?

  8. #8
    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
    Rien de vraiment stable.

    Objectif faire facilement une liste d'enregistrement avec des tris et des filtres sur certaines des colonnes. On reste sur les objets de base de symfony, le filter pour le filtre.

    Je vais essayer de mettre ce qu'il faut pour que tu essayes, mais c'est un peu brouillon et ne peut constituer un article bien fait.

    Les codes a ne pas modifier (quoique).

    Partial qui permet l'affichage des entêtes de colones
    apps/<application>/module/generic/template/_listTh.php
    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
     
    <!-- Entête du tableau -->
    <tr>
        <?php foreach ($fields as $field) : ?>
        <th class="<?php echo 'col_' . $field['name'] ?>">
                <?php if ($field['sort']) :?>
                    <?php if($sort == $field['name']): ?>
            <a href="<?php echo url_for($route . '?sort=' . $field['name'] . '&sort_type=' . ($sort_type == 'asc' ? 'desc' : 'asc')) ?>" class="<?php echo $sort_type ?> active" title="<?php echo __('X_tries_X', '', $translate) . __($field['name'], '', $translate) ?>">
                            <?php echo __($field['name'], '', $translate) ?>
                            <?php if($sort_type == 'asc'): ?>
                <img src="/images/arr_up.gif" alt="Up" title="Up" />
                            <?php else: ?>
                <img src="/images/arr_down.gif" alt="Dw" title="Dw" />
                            <?php endif ; ?>
            </a>
                    <?php else: ?>
            <a href="<?php echo url_for($route . '?sort=' . $field['name'] . '&sort_type=asc') ?>" class="<?php echo $sort_type ?>" title="<?php echo __('X_tries_X', '', $translate) . __($field['name'], '', $translate) ?>">
                            <?php echo __($field['name'], '', $translate) ?>
            </a>
                    <?php endif ; ?>
                <?php else: ?>
                    <?php echo __($field['name'], '', $translate) ?>
                <?php endif ; ?>
        </th>
        <?php endforeach ; ?>
        <th>
            <?php echo __('Actions', '', $translate) ?>
        </th>
        <?php if ($filter->hasGlobalErrors() || $filter->hasErrors()): ?>
            <tr>
                <th colspan="<?php count($fields) ?>">
                    <?php echo $filter->renderGlobalErrors() ?>
                    <p>error</p>
                </th>
            </tr>
        <?php endif; ?>
    <tr class="filter">
    <form action="<?php echo url_for('@dossiers', array('action' => 'filter')) ?>" method="get">
        <?php foreach ($fields as $field) : ?>
        <?php if(!($field['name'] == 'actions')): ?>
            <th>
                <?php if(isset($filter[$field['name']])): ?>
                    <?php echo $filter[$field['name']]->render() ?>
                    <?php if($filter[$field['name']]->hasError()): ?>
                        <br />
                        <p>la gaffe !</p>
                    <?php endif; ?>
                <?php endif ; ?>
            </th>
        <?php endif ; ?>
        <?php endforeach ; ?>
        <th>
            <?php echo $filter->renderHiddenFields() ?>
            <input type="submit" value="<?php echo __('X_filter_X', array(), 'stdFilter') ?>" />
            <?php echo link_to(__('X_reset_X', '', 'stdFilter'), '@dossiers?filter_reset=yes', array('action' => 'index'), array('method' => 'get', 'class' =>  'filter-button', 'id' => 'filter_reset')) ?>
        </th>
    </form>
    </tr>
    Le partial pager qui affichera les changements de pages (si nécessaire)
    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
     
    <?php if ($pager->haveToPaginate()): ?>
      <div class="pagination">
        <a href="<?php echo url_for($route . '?page=1') ?>" title="<?php echo __('First page', '', 'pager') ?>" >
          <<
        </a>
     
        <a href="<?php echo url_for($route . '?page=' . $pager->getPreviousPage() )?> title="<?php echo __('Previous page', '', 'pager') ?>"">
           <
        </a>
     
        <?php foreach ($pager->getLinks() as $page): ?>
          <?php if ($page == $pager->getPage()): ?>
            <?php echo $page ?>
          <?php else: ?>
            <a href="<?php echo url_for($route . '?page=' . $page) ?>"><?php echo $page ?></a>
          <?php endif; ?>
        <?php endforeach; ?>
     
        <a href="<?php echo url_for($route . '?page=' . $pager->getNextPage() )?> title="<?php echo __('Next page', '', 'pager') ?>" >
          >
        </a>
     
        <a href="<?php echo url_for($route . '?page=' . $pager->getLastPage()) ?>" title="<?php echo __(' Last page', '', 'pager') ?>" >
          >>
        </a>
      </div>
    <?php endif; ?>
    Bon, il y a des images éventuellement à mettre en place.


    Ici on a du code qu'il faut modifier.

    Le filter ou on ne va garder que les filter que l'on veut et éventuellement faire des listes déroulantes...

    Le code de action.class.php du moins la partie qui va afficher la liste, trier et filtrer. La table de base s'appelle "dossier" c'est bon pour les modifications à apporter.

    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
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
     
    class dossierActions extends sfActions
    {
     
    //Nom du module pour le stockage des données propre au module.
        protected $name_module = 'dossier';
     
        public function preExecute()
        {
     
        }
     
        /*
         * Retourne la liste des champs et ceux qui peuvent être triés
         * A MODIFIER SUR UN NOUVEAU DOC
        */
        function getFieldsTries()
        {
            return array(
                    array('name' => 'nom', 'sort' => TRUE),
                    array('name' => 'type', 'sort' => FALSE)
            );
        }
     
        public function executeIndex(sfWebRequest $request)
        {
    // Enregistre les paramètres de tris et les récupères
            $this->sort = $this->getSort();
            if ($request->getParameter('sort'))
            {
                $this->setSort(array('sort' => $request->getParameter('sort'), 'type' => $request->getParameter('sort_type')));
                $this->sort = $this->getSort();
            }
     
    // Remise a zéro des filtres
            if ($request->getParameter('filter_reset','no') == 'yes')
            {
                $this->getUser()->setAttribute('filter', array(), $this->name_module);
            }
    // Récupère le numéro de la page
            $this->CurrentPage = $request->getParameter('page', 1);
    // Vérifie les paramètres de filtre et enregistre les paramètres s'ils sont valides
            $this->filter = new DossiersFormFilter();
            if ($request->getParameter($this->filter->getName()))
            {
                $this->filter->bind($request->getParameter($this->filter->getName()));
                if ($this->filter->isValid())
                {
                    $this->getUser()->setAttribute('filter', $this->filter->getValues(), $this->name_module);
                    $this->CurrentPage = 1;
                    //XXXXX traiter les erreurs dans le filtre
                }
            }
            else
            {
                $this->filter->bind($this->getUser()->getAttribute('filter', array(), $this->name_module));
            }
     
            //récupère les champs d'entête et les filtres
            $this->FieldsTries = $this->getFieldsTries();
     
     
     
     
            $this->pager = new sfDoctrinePager(
                    $this->name_module,
                    sfConfig::get('app_max_par_page')
            );
            $this->pager->setQuery($this->makeQuery());
            $this->pager->setPage($this->CurrentPage);
            $this->pager->init();
        }
     
        /*
         * Défini le filtre par défault
        */
        protected function setDefaultSort()
        {
            $fields = $this->getFieldsTries();
     
            foreach ($fields as $field)
            {
                if ($field['sort'])
                {
                    $sortF = array('sort' => $field['name'], 'type' => 'asc');
                    $this->getUser()->setAttribute('sort', $sortF, $this->name_module);
                    return $sortF;
                }
                else
                {
                    throw new sfException('Impossible to define default sort');
                }
            }
        }
     
        /*
         * Met en place les paramètres du tris pour ce module
        */
        protected function setSort(array $sort)
        {
            // Mise en place du filtre par défaut si l'autre n'est pas authorisé...
            $sortF = $this->setDefaultSort();
     
            // recherche des champs authorisés au filtre.
            $fields = $this->getFieldsTries();
     
            foreach ($fields as $field)
            {
                if ($field['name'] == $sort['sort'] && $field['sort'])
                {
                    $sortF['sort'] = $sort['sort'];
                }
            }
     
            $sortF['type'] = $sort['type'] == 'desc' ? 'desc' : 'asc';
     
            $this->getUser()->setAttribute('sort', $sortF, $this->name_module);
        }
     
        /*
         * Récupère les paramètres de tris éventuellement stocké
        */
        protected function getSort()
        {
            if (is_null($sort = $this->getUser()->getAttribute('sort', null, $this->name_module)))
            {
                $this->setDefaultSort();
            }
            return $this->getUser()->getAttribute('sort', null, $this->name_module);
        }
     
        protected function makeQuery()
        {
            return DossiersTable::prepaDossierForUser($this->sort, $this->filter->getQuery());
        }
    La il y a des choses a adapter à chaque tables :
    • getFieldsTries : retourne la liste des entêtes de colonnes (qui seront utilisés par _listTH ) pour générer les colonnes et celles qui pourront être triée. La première est considéré comme le tris par défaut. Il faut une colonne qui autorise le tri.
    • Les filtres sont affichés en fonction de l'objet filter, si un filtre y est défini, il est affiché en dessous de l'entête.


    Et on fini avec l'objet qui devra subir le plus de modification, le template
    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
     
    <div id="contenu_center_list">
     
    <h1><?php echo __('X_list_dossier_X', '', 'dossier') ?></h1>
     
    <div class="mini_menu">
        <a href="<?php echo url_for('dossiers_new') ?>" title="<?php echo __('X_new_help_X', '', 'dossier') ?>">
            <?php echo __('X_new_X', '', 'dossier') ?>
        </a>
    </div>
     
    <?php include_partial('generic/pager',
            array('pager' => $pager,
                'page' => $CurrentPage,
                'route' => '@dossiers'
            )) ?>
     
    <table>
        <thead>
            <?php include_partial('generic/ListTh', 
                    array(
                        'fields' => $FieldsTries,
                        'translate' => 'dossier',
                        'route' => '@dossiers',
                        'sort' => $sort['sort'],
                        'sort_type' => $sort['type'],
                        'filter' => $filter
                        ))?>
        </thead>
     
        <tbody>
            <?php $ligne = 0; ?>
            <?php foreach($pager->getResults() as $row): ?>
            <tr class="<?php echo ((++$ligne % 2) == 0) ? 'even' : 'odd' ?>">
                <td><?php echo $row->getNom() ?></td>
                <td><?php echo __($row->getType(), '', 'dossier') ?></td>
                <td>
                    <?php if($row->getType() == 9): ?>
                    Editer Supprimer
                    <?php endif ; ?>
                </td>
                </tr>
            <?php endforeach ; ?>
        </tbody>
    </table>
    <?php include_partial('generic/pager',
            array('pager' => $pager,
                'page' => $CurrentPage,
                'route' => '@dossiers'
            )) ?>
     
    </div>
    ou il faudra modifier toute la partie tbody.

    Dernière chose, il faut adapter le route pour qu'il accepte les paramètres nommés.

    Ceci n'est qu'un essai.

Discussions similaires

  1. [AC-2003] Listes déroulantes filtrées par formulaire
    Par Piou2fois dans le forum IHM
    Réponses: 12
    Dernier message: 18/07/2012, 16h57
  2. [MySQL] Listes déroulantes dynamiques (débutant)
    Par Guns Of The Patriots dans le forum PHP & Base de données
    Réponses: 26
    Dernier message: 09/06/2010, 14h17
  3. Réponses: 0
    Dernier message: 03/03/2008, 13h02
  4. [Struts] - débutante - liste déroulante
    Par alexx dans le forum Struts 1
    Réponses: 3
    Dernier message: 18/04/2005, 16h01
  5. [ JSP ][ Débutant ] Liste déroulante + actualisation de page
    Par captainpouet dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 17/04/2004, 20h51

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