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 :

[Form] Comment faire un XxxType élégant ?


Sujet :

Symfony PHP

  1. #1
    Inscrit
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 319
    Points : 476
    Points
    476
    Par défaut [Form] Comment faire un XxxType élégant ?
    Salut,

    En travaillant sur mes formulaires, j'ai "bloque" sur un point assez bete en fait.

    Lorsque je veux ajouter une Entry, j'ai besoin de le faire dans un contexte. Je m'explique : je peux attacher un User a cette Entry, mais un User qui fait parti du Wrap de la session. Typiquement mon formulaire Entry, lorsqu'il m'affiche la choiceList des User, ne devrait m'afficher que la liste des User qui ont pour wrap_id l'id du Wrap de ma session.

    Premiere etape, je passe mon id de wrap a mon EntryType, pour ensuite pouvoir faire new EntryType($wrap_id). Ainsi il a toutes les cartes en main.

    Mon probleme : que faire ensuite ? Comment limiter le choix des User a ceux qui ont le bon wrap_id ?

    1/ Ajouter une condition dans le entityChoiceList. Du genre (j'ai pas la syntaxe exacte) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ->add('user', 'entity', array('class' => 'AssoUserBundle:User', 'queryBuilder' => '->where("wrap" => $wrap_id)'))
    2/ Passer a mon EntryType mon UserManager et faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ->add('user', 'entity', array('class' => 'AssoUserBundle:User', 'choices' => $UserManager->getForChoiceList($wrap_id)))
    3/ Passer a mon EntryType l'objet Wrap entier (pas seulement l'id), et faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ->add('user', 'entity', array('class' => 'AssoUserBundle:User', 'choices' => $wrap->getUsersForChoiceList()))
    4/ Autre ?

    Le 1/ m'ennuie car il n'utilise pas tout ce que je peux construire dans ma relation wrap - user (du genre les User pas encore active par exemple, je devrais rajouter a la main is_activated = true). Le 2/ m'ennuie car je devrais passer le UserManager a l'EntryType, ca m'oblige a en faire un service. Le 3/ m'ennuie car ce n'est pas dans Wrap que doit se trouver cette methode, mais dans WrapManager. Cependant, c'est celui qui me plait le plus pour l'instant.

    Est-ce que vous avez deja rencontre ce cas ? Quel est votre avis ?

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    383
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 383
    Points : 658
    Points
    658
    Par défaut
    Comment instancies tu ton EntryType?
    Que penses tu de balancer l'objet que tu veux en construct et de le garder dans une variable protected?
    Un petit si la réponse convient. Merci.

  3. #3
    Inscrit
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 319
    Points : 476
    Points
    476
    Par défaut
    Je voudrais creer mon formulaire simplement, du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $form = $this->createForm(new EntryType($wrap_id));
    Ou bien s'il le faut (l'objet et pas seulement son id) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $form = $this->createForm(new EntryType($wrap));
    Et je stocke bien $wrap ou $wrap_id en protected dans mon EntryType oui.

    Mais je vois pas ce que tu veux dire ? Mon probleme est apres, dans la methode EntryType->buildForm().

  4. #4
    Inscrit
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 319
    Points : 476
    Points
    476
    Par défaut
    En cherchant encore j'ai trouve la bonne solution je pense :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ->add('user', 'entity', array(
    	'class'         => 'AssoUserBundle:User',
    	'query_builder' => function($rep) use($wrap_id) { return $rep->getQueryChoicelist($wrap_id); } )
    ))
    Avec l'option query_builder, EntityChoiceList passe en argument le UserRepository, ainsi je peux faire la bonne requete depuis la. Pas besoin d'injecter mon UserManager (le repository en fait), et le tout est bien propre.

    Qqn confirme ?

    La doc sur les formulaires c'est pas encore ca hein... Je galere sur pas mal d'autres points la.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    383
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 383
    Points : 658
    Points
    658
    Par défaut
    Cela me parait bien; et propre.

    Pour les autres points ou tu galères, ce serait pas mal de les noter/répertorier; si tu as du temps. Cela serait utile pour tout le monde.

    merci, on avance.
    Un petit si la réponse convient. Merci.

Discussions similaires

  1. [2.x] [Form] comment faire accepter les balise form->isValid
    Par keokaz dans le forum Symfony
    Réponses: 2
    Dernier message: 13/08/2012, 23h44
  2. Comment faire une Form MDI dynamiquement modale ?
    Par eponette dans le forum Composants VCL
    Réponses: 5
    Dernier message: 30/09/2005, 10h14
  3. Comment faire pour faire glisser un objet dans une form ?
    Par Olun dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 05/09/2005, 17h49
  4. Comment faire pour qu'une Form reste en avant-plan?
    Par Bodom-Child dans le forum C++Builder
    Réponses: 3
    Dernier message: 25/08/2005, 10h28
  5. comment faire communiquer deux form MDI?
    Par eponette dans le forum Langage
    Réponses: 3
    Dernier message: 17/08/2005, 12h20

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