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 :

Problème de mergeform et setNameFormat [1.x]


Sujet :

Symfony PHP

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 162
    Par défaut Problème de mergeform et setNameFormat
    Bonjour à tous,

    Mon but et d'avoir l'équivalent de 3 formulaires identiques dans un seul form (une seule soumission)

    Du style :

    FormA : Nom, prenom ....
    FormB : Nom, prenom ....
    FormC : Nom, prenom ....

    J'ai donc un formulaire "source" et des formulaires qui héritent du formulaire source. Le problème est que je n'arrive pas à préfixer mes 3 forms pour différencier les champ. Je pensais pouvoir faire un setNameFormat dans chaque class de mes formulaires et ainsi obtenir:

    FormA : formA[Nom],formA[prenom] ....

    Au final après le merge des mes forms les champs sont écrasés et il me reste que 1 form au lieu des 3.

    Quelqu'un aurait une idée pour préfixer mes champs ?

    Merci d'avance

    ps : Ces formulaires n'appartiennent pas à un model.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 396
    Par défaut
    Pourrais-tu donner le code de ton/tes Forms ?
    Selon ce que je comprends de ce que tu veux faire, j'aurais tendance à dire que tu n'as besoin de deux Forms :
    - un de base ;
    - un qui englobe 3 formulaires de base.

    Sachant que quand tu fais un embedForm, tu dois donner un nom à ton formulaire embarqué, je ne vois pas comment il pourrait écraser quoique ce soit ?
    (j'ai mis le embedForm en gras car si tu utilises un mergeForm, c'est peut-être de là que vient ton erreur)

  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
    Et rajoute un bout (ou le tous) de don shema.yml

    Dans quel form veux-tu faire tes embed ? Issu de où ?

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 162
    Par défaut
    Citation Envoyé par bilbonec Voir le message
    Pourrais-tu donner le code de ton/tes Forms ?
    Selon ce que je comprends de ce que tu veux faire, j'aurais tendance à dire que tu n'as besoin de deux Forms :
    - un de base ;
    - un qui englobe 3 formulaires de base.

    Sachant que quand tu fais un embedForm, tu dois donner un nom à ton formulaire embarqué, je ne vois pas comment il pourrait écraser quoique ce soit ?
    (j'ai mis le embedForm en gras car si tu utilises un mergeForm, c'est peut-être de là que vient ton erreur)
    Merci en effet le embedform marche mieux !!

    Donc quelle est l'utilité" du mergeform (mise a part de prendre les champs d'un formA et de les rajouter au formB) car le embed fait "le même genre" d'action mise à part qu'il rajoute une sorte de dimension au form ?

    @mimi le form est un form généré à la mano dans une class form (pas de yml, bdd....)

    Merci à vous

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 396
    Par défaut
    Le fait de poser cette question me fait réaliser qu'il n'est peut-être pas tout à fait logique de passer par un embedForm dans ton cas.

    En effet, on aura plutôt tendance à utiliser un embedForm quand tu as un objet imbriqué dans un autre (typiquement : quand tu as déclaré une relation entre les deux dans ton schema) ; alors qu'on aura plutôt tendance à merge 2 forms lorsque ceux-ci sont indépendants l'un de l'autre mais que tu veux les rassembler dans un même formulaire.

    Du coup, regardons d'un peu plus près la méthode mergeForm :
    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
      /**
       * Merges current form widget and validator schemas with the ones from the
       * sfForm object passed as parameter. Please note it also merge defaults.
       *
       * @param  sfForm   $form      The sfForm instance to merge with current form
       *
       * @throws LogicException      If one of the form has already been bound
       */
      public function mergeForm(sfForm $form)
      {
        if (true === $this->isBound() || true === $form->isBound())
        {
          throw new LogicException('A bound form cannot be merged');
        }
     
        $form = clone $form;
        unset($form[self::$CSRFFieldName]);
     
        $this->defaults = $form->getDefaults() + $this->defaults;
     
        foreach ($form->getWidgetSchema()->getPositions() as $field)
        {
          $this->widgetSchema[$field] = $form->getWidget($field);
        }
     
        foreach ($form->getValidatorSchema()->getFields() as $field => $validator)
        {
          $this->validatorSchema[$field] = $validator;
        }
     
        $this->getWidgetSchema()->setLabels($form->getWidgetSchema()->getLabels() + $this->getWidgetSchema()->getLabels());
        $this->getWidgetSchema()->setHelps($form->getWidgetSchema()->getHelps() + $this->getWidgetSchema()->getHelps());
     
        $this->mergePreValidator($form->getValidatorSchema()->getPreValidator());
        $this->mergePostValidator($form->getValidatorSchema()->getPostValidator());
     
        $this->resetFormFields();
      }
    A voir les deux boucles foreach, j'ai l'impression effectivement qu'il écrase les champs qui auraient le même intitulé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->widgetSchema[$field] = $form->getWidget($field);
    Je vais regarder le widgetSchema->getPositions() de plus près car cette conclusion m'étonne.

  6. #6
    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
    Globalement l'embedForm est plutôt destiné à fusionner un pou plusieurs enregistrement d'une table enfant dans la table parrent, il est plutôt conçu pour être utiliser avec des objets sfDoctrineForm (ou propel). Hors de ce cadre, la sauvegarde des données va être, un peu, chaude à gérer (mais pas impossible).

    Le mergeForm permettrait plutôt de fusionner deux vues partiel d'une même table, soit pour des raisons d'héritage (voir héritage dans doctrine), soit parce que l'on a une grande table, et que l'on veut parfoir l'édite en parties, parfois entièrement. On fera alors plusieurs form de la même table, et suivant les besoins, on va merger ce qui est nécessaire.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 162
    Par défaut
    Citation Envoyé par Michel Rotta Voir le message
    Globalement l'embedForm est plutôt destiné à fusionner un pou plusieurs enregistrement d'une table enfant dans la table parrent, il est plutôt conçu pour être utiliser avec des objets sfDoctrineForm (ou propel). Hors de ce cadre, la sauvegarde des données va être, un peu, chaude à gérer (mais pas impossible).

    Le mergeForm permettrait plutôt de fusionner deux vues partiel d'une même table, soit pour des raisons d'héritage (voir héritage dans doctrine), soit parce que l'on a une grande table, et que l'on veut parfoir l'édite en parties, parfois entièrement. On fera alors plusieurs form de la même table, et suivant les besoins, on va merger ce qui est nécessaire.
    Le embed fonctionne.

    Dans mon cas les données sont envoyées via un webservices, donc en gros je soumets > je récupère > je trie > j 'envoie

    Merci pour vos réponse

  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
    Il ne s'agissait que d'une explication global sur le fonctionnement des deux méthodes.

    Si tous marche, un passage sur le permettra de le signaler

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 162
    Par défaut
    Citation Envoyé par Michel Rotta Voir le message
    Il ne s'agissait que d'une explication global sur le fonctionnement des deux méthodes.

    Si tous marche, un passage sur le permettra de le signaler
    Je reviens après une pause week end

    Niveau affichage c'est ok mais ... pour récupérer les valeurs de mes différents "embedform" ça pose problème !

    Si je fais un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
          $this->form->bind($request->getParameter($this->form->getName()),$request->getFiles($this->form->getName()));
    $postValues = $this->form->getValues();
    Mon $postValues est vide. Par contre si je fais un dump de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $request->getParameter($this->form->getName())
    J'ai bien mes valeurs

    faut il rajouter quelque chose au niveau du bind() ?

    Merci d'avance

  10. #10
    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
    En fait, je n'ai jamais tenté de sauvegarder directement les données des form embed.

    J'ai toujours utilisé des form basé sur doctrine et la sauvegarde est automatisée.

    Le ->getValues() ne fait référence qu'au données du form de base, pas aux données des forms embed qui ont leurs propre getValues(). Il faudrait donc trouver comment retrouver les forms embedded...

    Je pense qu'une construction dans le genre :
    $ValuesMyEmbed = $this->form->getEmbededForm('MyEmbed')->getValues();
    devrait permettre de retrouver les données validées d'un sous formulaire.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 162
    Par défaut
    Citation Envoyé par Michel Rotta Voir le message
    En fait, je n'ai jamais tenté de sauvegarder directement les données des form embed.

    J'ai toujours utilisé des form basé sur doctrine et la sauvegarde est automatisée.

    Le ->getValues() ne fait référence qu'au données du form de base, pas aux données des forms embed qui ont leurs propre getValues(). Il faudrait donc trouver comment retrouver les forms embedded...

    Je pense qu'une construction dans le genre :
    $ValuesMyEmbed = $this->form->getEmbededForm('MyEmbed')->getValues();
    devrait permettre de retrouver les données validées d'un sous formulaire.
    Presque

    La fonction "getEmbeddedForm" existe et apparemment il me trouve bien l'objet (je dis apparemment car mon apache plante vu la taille de l'objet ^^ ) par contre quand je fais un getValues toujour rien !

    Merci pour ta réponse

  12. #12
    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
    Le getEmbededForm() retourne l'objet formulaire (a noter le getEmbededForms() qui retourne un array des objets formulaires et permettrait de les traiter dans une boucle foreach.

    Je ne vois pas pourquoi le seul fait de récupérer un pointeur sur un form pourrait provoquer un dépassement de mémoire, il n'y a pas copie d'objet, juste transmission du pointeur.

    Et la méthode getValues() est bien définie dans sfForm, ce qui est retournée par le getEmbededForm.

    Maintenant, es-tu sur que tes données sont "propre" ? As-tu fais un isValid() après le bind ?

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 162
    Par défaut
    Citation Envoyé par Michel Rotta Voir le message
    Le getEmbededForm() retourne l'objet formulaire (a noter le getEmbededForms() qui retourne un array des objets formulaires et permettrait de les traiter dans une boucle foreach.

    Je ne vois pas pourquoi le seul fait de récupérer un pointeur sur un form pourrait provoquer un dépassement de mémoire, il n'y a pas copie d'objet, juste transmission du pointeur.

    Et la méthode getValues() est bien définie dans sfForm, ce qui est retournée par le getEmbededForm.

    Maintenant, es-tu sur que tes données sont "propre" ? As-tu fais un isValid() après le bind ?
    Je ne savais pas que pour faire un getValues() il fallait que le form soit valid Et en ayant un form valid tout est ok ! Je n'ai même pas besoin faire un getEmbeddedForm ...
    Une explication sur le fait que le form doit être valide pour faire un getValues()?

    Encore Merci

  14. #14
    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 coupolites Voir le message
    Une explication sur le fait que le form doit être valide pour faire un getValues()?
    Le bind ne fais pas que lier des valeurs, en fait, il passe tous les validator en revue. Le validator retourne soit une interruption si la donnée ne peut être validée, qui est récupérée et stockée, soit une donnée nettoyée à mettre dans le tableau des values. Si, en fin de procédure, un champ n'a pas retourné de value, mais une erreur, le tableau des values est vidé (ou pas remplis, je ne sais plus).

    Donc, si le form n'est pas valide, il n'est pas possible de récupérer la moindre données, ce qui est logique.

    Si c'est bon pour toi, n'oublie pas le !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [1.x] MergeForm Doctrine => problème de primary key relation
    Par ferou dans le forum Symfony
    Réponses: 0
    Dernier message: 13/04/2012, 17h01
  2. Problème d'installation oracle 8.1.7 sous NT
    Par Anonymous dans le forum Installation
    Réponses: 7
    Dernier message: 02/08/2002, 14h18
  3. Problème d'impression
    Par IngBen dans le forum C++Builder
    Réponses: 7
    Dernier message: 22/05/2002, 11h37
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10
  5. Réponses: 6
    Dernier message: 25/03/2002, 21h11

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