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 :

Formulaire avec symfony


Sujet :

Symfony PHP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 12
    Par défaut Formulaire avec symfony
    Salut à tous,

    J'ai un soucis lors de la création d'un formulaire avec symfony, j'ai une table avec mettons les champs "champ1", "champ2" et "champ3" et j'ai généré le formulaire en fonction du schema de ma table.
    Dans mon formulaire je fais apparaitre les widgets liés à "champ1" et "champ2" et je rajoute 2 widgets ( nommons les champ3-A et champ3-B ) qui ne sont pas liés à la table.
    champ3-A et champ3-B ne sont pas dans le schema de la table car leurs nombres et types sont susceptibles de varier ( la j'en ai mit 2 mais il pourrait y en avoir 3, 4 ou plus )

    J'aimerais pouvoir faire lors de l'enregistrement champ3 = array(champ3-A, champ3-B) mais je ne sais pas dans quelle fonction et comment le faire.

    Merci de votre aide

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 12
    Par défaut
    J'ai réussi en rajoutant ce code dans le processForm

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $var = $form->save();
    $var ->setChamp3(serialize(array("A" => $form->getValue('A'))));
    $var ->save();
    Je sais pas si il y a plus propre ...

  3. #3
    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
    Ce n'est pas très simple, mais si tu suis bien le modèle objet cela ne devrait pas être trop compliquer.

    Tu as deux options, soit tu parts sur le formulaire de base sfFormSymfony, qui n'est pas lié à la base de donnée, là, très simple, tu définis ton formulaire dans la méthode configure(), puis, une fois le forumlaire instancié, tu récupères l'enregistrement et donne les valeurs aux widgets définis (setValue() ) une fois le formulaire revenu et validé ( isValid() ) il ne reste plus qu'à récupérer les valeurs ( getValue() ) et mettre l'enregistrement à jour. Basic mais efficace.

    Une autre méthode, moins basic et plus "propre".

    Dans l'objet form il faut modifier la méthode configure() pour y mettre les widgets dont tu as besoins. Non nécessairement lié à l'objet du modèle. Je ne sais pas comment du définis l'apparence des widgets, a toi de voir. Par contre, il faut absolument définir les validator qui vont avec, sous peine de ne pas pouvoir valider le formulaire au retour. Tu places les données avec un setDefault pour chaque widget. Voilà pour la partie préparation et la partie validation.

    Pour la partie enregistrement pas contre, je ne suis pas entièrement sur, mais je ne dois pas être très loin.

    Il faut modifier la méthode la méthode doSave() on est sur que l'enregistrement est valide.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public function doSave($conn = null)
    {
       $this->setValue('champ3', "array('A' => '" .  $this->getValue('champ3-A') . "', 'B' => '" . $this->getValue('champ3-B') . "')");
       parent::doSave($conn);
    }
    Code non testé, mais à priori je le sens bien.

    Quoique j'aurais plutôt utilisé une méthode de sérialisation pour mettre les données dans le champ.

    Bonne chance,
    Michel

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 12
    Par défaut
    La solution me parait bonne mais le seul problème est que la méthode setValue() n'existe pas ... je travaille avec doctrine je sais pas si c'est une fonction propel ...
    "Call to undefined method ****Form::setValue."

  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
    Je savais qu'il faudrait ruser..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $this->Value['champ3'] = "array('A' => '" .  $this->getValue('champ3-A') . "', 'B' => '" . $this->getValue('champ3-B') . "')");
    devrait marcher. Je pense. Un peu tard pour tester...

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 12
    Par défaut
    pas d'erreur mais pas d'effet non plus. $this->Value['champ1'] n'est pas défini non plus.

  7. #7
    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
    Dans l'objet form, le tableau value[] comporte toutes les valeurs de l'objet actuel. Il doit être renseigné après que les données aient été validé (donc après le bind, si le is_valid() est à true ).

    C'est ce tableau qui est envoyé à l'objet sfDoctrineRecord pour l'enregistrement des modification.

    Dans mes souvenirs, c'est cet objet que j'ai utilisé dans une application pour générer un log des modifications sur certaines tables.

    Vérifie que tu as bien binder et validé les données avant de t'attaquer au tableau.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 12
    Par défaut
    j'ai mis ca dans doSave donc je pense qu'il n'y a pas de soucis la dessus.

  9. #9
    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
    Et cela marche maintenant ?

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 12
    Par défaut
    non justement, $this->Value n'est pas défini dans doSave

  11. #11
    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
    Heu ...

    Le tableau values() est défini dans l'objet sfForm, père de tous les autres objets form.

    Je ne vois pas pourquoi dans une méthode d'un objet enfant le $this->values() ne retournerait rien... ou pire n'existerait pas.

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 12
    Par défaut
    ca a pourtant l'air d'etre le cas ...

    j'ai trouvé un exemple similaire sur un site et ils font cette action dans le processForm aussi, comme je l'ai fait plus haut.

    Autre question, est-il possible de surcharger la fonction configure du formulaire dans plusieurs modules différents ou pour plusieurs actions différentes ?

  13. #13
    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
    La méthode doSave() fait appel à la méthode updateObject() qui fait elle même appel à la méthode processValues().

    Donc si une propriété de l'objet est visible pour processValues(), elle l'est aussi pour doSave.

    Il est juste plus logique de faire cette manipulation dans processValues() que dans doSave.

    La seul manipulation sur fait updateObject() c'est qu'elle donne la possibilité de changer le tableau des valeurs ($this->values) par un autre. Ce que ne fait pas doSave. Donc updateObject récupère le tableau de base ($this->values) et l'envoie ce faire traiter par processValues().

    Si une valeur est modifiée avant le traitement dans la propriété "values" elle sera traitée par processValue() et mise à jour dans l'enregistrement.

    Et la propriété est bien disponible dans doSave.


    Oui, il est possible pour toi de faire un objet form de base, et d'en faire des enfants pour chacun de tes cas.

    A noter que :

    Si ton form de base modifie le configure des éléments qui doivent être repris dans tous les enfants, il faudra penser, dans les enfants, à faire un parent::configure() en début de méthode.

    Si ton form de base ne modifie pas le configure, il ne sert à rien, alors autant partir de l'objet de base "baseMonForm" et d'y mettre le configure qui va bien, pas nécessaire, alors, de faire appel à la méthode du parent, vu qu'elle n'a jamais été initialisée.

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 12
    Par défaut
    Et dans ce cas l'object form enfant du module je le met dans le action.class.php ou dans un fichier que je crée ?

    Sinon je ne parviens tjs pas à accéder à $this->Values ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class TableForm extends BaseTableForm
    {
         public function doSave($conn = null)
    	{
    		$this->Value['champ3'] = 1;
    		parent::doSave($conn);
    	}
      public function configure()
      {	.... }
    }
    et mon champ3 reste vide, de meme impossible de modifier champ1 ou champ2.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public function doSave($conn = null)
    {
    	if(isset($this->Value['champ1'])) die();
    	parent::doSave($conn);
    }
    ne provoque pas l'interruption du script.

  15. #15
    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
    A mon avis, avec $this->values cela marchera mieux (manque le "s", values est au pluriel !).

    J'ai testé et la modification marche avec enregistrement dans la base.

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 12
    Par défaut
    j'ai testé avec le s ça ne fonctionne pas non plus chez moi ...
    edit : ca fonctionne, j'avais pas testé d'enlever la majuscule à values ... merci de ton aide et de ta patience en tout cas

    sinon j'ai encore deux questions, dans le cas de la surcharge de la fonction configure du formulaire je met ca dans quel fichier dans le module ? action.class.php ?

    et sinon j'ai mon formulaire et avant enregistrement j'aimerais demander a la personne de se connecter, est-il possible de stocker le formulaire le temps de se connecter avant validation ? quand je n'utilisais pas symfony je le serializais dans une session pour le récupérer après mais je pense que symfony permet mieux.

  17. #17
    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
    Citation Envoyé par hach22_2 Voir le message
    sinon j'ai encore deux questions, dans le cas de la surcharge de la fonction configure du formulaire je met ca dans quel fichier dans le module ? action.class.php ?
    La surcharge d'une méthode ne s'entend qu'au sein d'un enfant de l'objet.

    Le module est enfant de sfDoctrineRecord, pas bon

    L'"action.class.php" est enfant de sfAction, pas bon

    La méthode configure() est définie dans sfForm, il faut donc un enfant de sfForm, que sont tous les objets formulaire, dans le dossier lib/form/...

    Citation Envoyé par hach22_2 Voir le message
    et sinon j'ai mon formulaire et avant enregistrement j'aimerais demander a la personne de se connecter, est-il possible de stocker le formulaire le temps de se connecter avant validation ? quand je n'utilisais pas symfony je le serializais dans une session pour le récupérer après mais je pense que symfony permet mieux.
    Dans l'idée, il serait mieux que l'utilisateur soit connecté avant de remplir le formulaire, ce qui évite tous problème.

    Je n'ai jamais testé, il est possible de sérialiser le sfWebRequest, mais l'objet form ne comporte pas de méthode serialise().

    On va arriver dans du bricolage.

    Essaye plutôt de faire une identification préalable.

    Où alors, un formulaire non lié à la base (basé sur sfFormSymfony) et de sérialiser les données récupérée dans le tableau getValues(), après validation du formulaire. Les stocker dans le parameterHolder du user. A récupérer après authentification.

    Mais il n'y a pas de procédure "standard" pour ce type de traitement.

  18. #18
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 12
    Par défaut
    si ce n'est pas bon dans l'action.class.php, je parle du fichier pas de la class sfActions, comment faire une méthode configure qui dépende du module exécuté et non de la table concerné ?

  19. #19
    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
    La méthode configure() figurant dans l'objet form, si on veut l'adapter pour un module, il convient de faire un enfant à partir de base<Table>Form pour chaque module a modifier.

    Exemple, dans le module titi on veut accéder particulièrement au form qui dépend de la table achat. Le formulaire normal sera :
    lib/form/doctrine/AchatForm.class.php enfant de
    lib/form/doctrine/base/baseAchatForm.class.php

    Si tu veux un form particulier pour un module particuler, rien ne t'empêche de créer un :
    lib/form/doctrine/titiAchatForm.class.php basé soit sur AchatForm.class.php ou alors à la base sur baseAchatForm.class.php.

  20. #20
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 12
    Par défaut
    ok je te remercie de ton aide. Ca devrait être tout encore merci

Discussions similaires

  1. Réponses: 2
    Dernier message: 04/07/2011, 17h22
  2. Réponses: 9
    Dernier message: 22/06/2011, 16h19
  3. Réponses: 4
    Dernier message: 06/07/2010, 11h53
  4. Réponses: 10
    Dernier message: 10/06/2004, 16h20
  5. Gestion de formulaire avec xml et sans serveur ?
    Par meliane dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 05/05/2004, 19h57

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