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 :

Filter & sfWidgetFormChoice


Sujet :

Symfony PHP

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2009
    Messages : 33
    Par défaut Filter & sfWidgetFormChoice
    Bonjour, je suis novice en symfony, je rencontre un problème pour faire marcher un filter.

    Dans mon formulaire j'ajoute un jour de la semaine en base avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->setWidget( 'permanence', new sfWidgetFormChoice(array('choices'=>array(''=>'','Lundi'=>'Lundi','Mardi'=>'Mardi','Mercredi'=>'Mercredi','Jeudi'=>'Jeudi','Vendredi'=>'Vendredi','Samedi'=>'Samedi')),array('style'=>'width: 230px;')));
    Jusque là tout vas bien, ensuite je veux faire un filtre dessus.

    J'ai ça comme filtre et validator:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $this->setWidget( 'permanence', new sfWidgetFormChoice(array('choices'=>array(''=>'','Lundi'=>'Lundi','Mardi'=>'Mardi','Mercredi'=>'Mercredi','Jeudi'=>'Jeudi','Vendredi'=>'Vendredi','Samedi'=>'Samedi')),array('style'=>'width: 160px;')));
     
     'permanence'                        => new sfValidatorPass(array('required' => false)),
    et il filtre rien, j'ai la liste entière. Si je remplace le sfWidgetFormChoice du filtre par le 'permanence' => new sfWidgetFormFilterInput(), de base et que je tape le jour de la semaine, ça marche.

    Quelqu'un peut m'expliquer comment faire fonctionner ma liste?

    Merci

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2009
    Messages : 33
    Par défaut
    personne?

  3. #3
    Membre Expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Par défaut
    Bonjour,

    Je suis pas un expert symfony mais je te donne une piste:

    Dans la fonction configure de la classe construisant ton formulaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $this->setWidget( 'permanence', new sfWidgetFormChoice(array('choices'=>array(''=>'','Lundi'=>'Lundi','Mardi'=>'Mardi','Mercredi'=>'Mercredi','Jeudi'=>'Jeudi','Vendredi'=>'Vendredi','Samedi'=>'Samedi')),array('style'=>'width: 160px;')));
    $this->widgetSchema->setNameFormat('formTest[%s]');
    Ensuite Dans le contrôleur
    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
     
               $this->form  = new classeDeTaForm();
     
                // Je suppose par exemple un POST de la form sur le submit
                if($request->isMethod(sfWebRequest::POST))
                {
                    // Bind du formulaire -> épuration des valeurs du formulaire et du tableau 'formTest' en passant par les validateurs
                    // isValid sert donc au résultat des sfValidator des widgets.
                    $this->form->bind($request->getParameter('formTest'), null);
                    if($this->form->isValid())
                    {
                     // Ici ton traitement
                     $tabRet =  $request->getParameter('formTest');
                     // $tabRet['permanence'] te donnera la valeur de la liste
                     }
                }

  4. #4
    Membre émérite Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Par défaut
    Je n'ai pas compris la moitié de la question initiale mais pourquoi utiliser un sfValidatorPass() pour valider le contenu du widget ? Un sfValidatorChoice() bien initialisé serait plus approprié. Pas impossible que ce soit aussi à l'origine de ton problème vu la façon dont sont examinés les champs du filtre.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2009
    Messages : 33
    Par défaut
    j'ai deja essayé avec ce validator:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     $this->setValidator('permanence',new sfValidatorChoice(array('required' => false, 'choices' =>array('','Lundi','Mardi','Mercredi','Jeudi','Vendredi','samedi'))));
    ça ne change rien il ne filtre pas.

    j'ai pas l'impression que le validateur soit le problème.
    On dirait que la liste déroulante n’envoie pas le bon mot à filtrer puisque qu'avec un type text classique le filtre fonctionne ...

  6. #6
    Membre émérite Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Par défaut
    Hmmm... Curieux... Est-ce que la classe qui gère ton filtre a surchargé la méthode qui analyse ta colonne 'permanence' ? (une méthode qui doit s'appeler addPermanenceColumnQuery d'après le nom de ton widget)

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2009
    Messages : 33
    Par défaut
    Euh non, comment doit elle être surchargé?

  8. #8
    Membre Expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Par défaut
    j'ai pas l'impression que le validateur soit le problème.
    On dirait que la liste déroulante n’envoie pas le bon mot à filtrer puisque qu'avec un type text classique le filtre fonctionne ...
    Je ne comprends pas trop ce que vous cherchez à faire ?
    Le validateur est utilisé uniquement lors de la modification du champ dans le formulaire (vérification et validation suivant une à plusieurs régles en utilisant le' validator + And'). De même, nous pouvons aussi valider les données sur l'envoi du formulaire (le submit) par un validateur sfValidatorCallback.

    En dernier, vous récupérez comment dans le cas de l'input texte (voir code), si c'est juste pour une donnée, c'est pareil

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2009
    Messages : 33
    Par défaut
    J'ai créé la methode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
      public function addPermanenceColumnQuery(Doctrine_Query $q, $field,$value)
      {
        if($value) 
        {
          $a = $q->getRootAlias();
          $q->Where('permanence = ?',$value);
          return $q;
        }
     
      }
    Et le filtre fonctionne c'est déjà pas mal, sauf qu'il ne prend pas en compte les autres filtres. Ya un moyen de lui faire prendre en compte les autres filtre? Parce que je peux pas récupérer les valeurs des autres champs pour améliorer ma requete si?

  10. #10
    Membre Expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Par défaut
    En fait, c'est ce que disait au début: lors de la création des widgets, je donne un nom au shéma contenant tous les champs. Ensuite, c comme un tableau avec comme index le nom de chaque widget.
    Dans ce cas tu auras toutes les valeurs ...

    Bon, j'ai pas fait des milles de projets en sF mais pour mes formulaires et les retours, c'est comme cela que je fais

  11. #11
    Membre émérite Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Par défaut
    Groumf. Par défaut, tu ne devrais pas avoir à créer cette méthode. Je pensais qu'elle avait peut-être été surchargée et qu'elle était bogguée, mais mon hypothèse n'est pas la bonne de toute évidence.

    Essaye de récupérer la requête passée par le filtre dans tes logs, qu'on voie exactement pourquoi il remonte toute la liste au lieu de la filtrer sur le champ 'permanence'. Il doit y avoir une erreur dans ton schema, ou quelque chose du genre.

    NB : pour ajouter une clause à une requête existante, utiliser andWhere() plutôt que where().

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2009
    Messages : 33
    Par défaut
    Bon alors, avec le andWhere tout fonctionne il filtre avec aussi les autres champs. Problème à moitié résolu.

    J'ai retiré ma méthode perso et regardé mes log sql, et effectivement il ignore totalement mon champs (n'apparait pas dans la requete)

    @Fench les champs sont normalement ajouté automatiquement au shéma

  13. #13
    Membre Expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Par défaut
    @Fench les champs sont normalement ajouté automatiquement au shéma
    Of course , en fait le but est de retrouver tous les champs de la form dans un tableau que l'on nome.

  14. #14
    Membre émérite Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Par défaut
    Citation Envoyé par Parmenion Voir le message
    J'ai retiré ma méthode perso et regardé mes log sql, et effectivement il ignore totalement mon champs (n'apparait pas dans la requete)
    Il y a donc apparemment quelque chose qui modifie la requête du filtre. Tu as surchargé le postBuildQuery() ?

    En tout cas, c'est forcément un éléphant : sur un filtre basique avec un champ basique, il n'y a aucune acrobatie à faire pour que ça marche.

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2009
    Messages : 33
    Par défaut
    non, je vais détailler ce que j'ai fais pour que tu puisse spotted ma connerie.

    Déjà je bosse sur un projet existant, j'ai ajouté le champ permanence en base. Je l'ai ensuite ajouté au model à la main ainsi qu'au form et filter (en calquant sur des champs du même type fonctionnel)

    Donc comme j'ai pas build le filter avec la commande synfony, il y a peut etre d'autre fichier autre que baseformfilter qui sont généré?

  16. #16
    Membre émérite Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Par défaut
    A la main ????

    Ca, pour un éléphant, c'est un éléphant...

    Oui, sont re-générés au moins les fichiers des dossiers 'base' dans filter, form et model.

    Je te déconseille formellement de procéder comme tu l'as fait, tu prends des risques en faisant à la main (et sans doute incomplètement) le boulot de symfony.

    Pour ajouter un champ en base sur un projet déjà en production :

    1 - mise à jour du schema .yml indispensable
    2 - générer une migration (doctrine:generate-migrations-diff)
    2bis - vérifier le script de migration (symfony est fâché avec les colonnes de type 'text' par exemple, il faut parfois corriger à la main)
    3 - migrer la base (doctrine:migrate)
    4 - mettre les fichiers à jour (doctrine:build --all-classes)

    Commence par reconstruire tout ça comme c'est prévu dans symfony avec la mise à jour du schema.yml et un doctrine:build --all-classes. Ca devrait aller mieux après.

    Et jette un oeil sur les tutos Jobeet (au moins) pour récupérer les bases sur tous ces points, sinon tu vas droit dans le mur

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2009
    Messages : 33
    Par défaut
    Tien je connaissais pas la fonction migration de symfony, c'est d'ailleurs pour ça que je l'ai fais à la main parce que tout rebuild à partir du shema c'est bien lourd.

    Sinon c'est bien dans ces fichiers que j'ai rajouté le champs à la main.

    ça fonctionne parfaitement pour le model et le form, pourquoi pas le filter ?_?

    Je vais essayer avec la migration.

Discussions similaires

  1. INSO Filter : "USER-defined exception" avec ctx_do
    Par Wiztiti dans le forum Oracle
    Réponses: 2
    Dernier message: 01/06/2004, 16h14
  2. propriete filtered
    Par crocodingo dans le forum Bases de données
    Réponses: 9
    Dernier message: 15/02/2004, 20h08
  3. CFileDialog Filter
    Par Patrick Beaudoin dans le forum MFC
    Réponses: 4
    Dernier message: 07/09/2002, 09h51

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