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 :

Multi formulaire dynamique


Sujet :

Symfony PHP

  1. #1
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 141
    Points : 79
    Points
    79
    Par défaut Multi formulaire dynamique
    Bonjour,

    Je sais pas si le titre de mon post est explicite mais voici le cas concret.
    Mon client veut permettre à ses collaborateurs de saisir une multitudes de gencode (EAN 13) pouvant aller de la saisie d'un seul gencode à n.

    A l'affichage du formulaire, on a au départ une seule ligne et les formulaires suivants sont ajouté un à un dès que l'utilisateur saisie un gencode.

    J'ai suivi les explications du site officiel

    Et donc je me retrouve avec plusieurs fichiers forms
    1. GencodeCollectionForm
    2. GencodeMasterForm
    3. GencodeChildrenForm
    4. GencodeChildForm


    Oui y a des Code Masters et un code master peut avoir des filles ...

    Au submit du formulaire, j'ai l'erreur suivante 'Unexpected extra form field named "0".'

    Bien sur je peux contourner le problème en n'utilisant pas la méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->form->bind($request->getParameter('monform'))
    et faire mes controles à la main mais c'est pas top.

  2. #2
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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
    Points : 8 486
    Points
    8 486
    Par défaut
    Tu veux faire des embed dans des forms en embed ?
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

  3. #3
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 141
    Points : 79
    Points
    79
    Par défaut
    C'est exactement cela ...

    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
     
    class GncGencodeCollectionForm extends sfForm
    {
      public function configure()
      {
        if (!$gencode = $this->getOption('master'))
        {
          throw new InvalidArgumentException('You must provide a gencode object.');
        }
     
        for ($i = $this->getOption('start', 0); $i < $this->getOption('size', 1); $i++)
        {
          $gencode_master = new AoGencode();
          $gencode_master->AoGencode = $gencode;
     
          $form = new GncGencodeMasterForm($gencode_master, array('alt' => $i));
     
          $this->embedForm($i, $form);
        }
     
        $this->widgetSchema->setNameFormat('gnc_collection[%s]');
        $this->errorSchema = new sfValidatorErrorSchema($this->validatorSchema);
     
      }
    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
     
    class GncGencodeMasterForm extends BaseAoGencodeForm
    {
      public function configure()
      {
        $this->setWidgets(array(
          'code_article' => new sfWidgetFormInputText(
            array(),
            array(
              'class' => 'master_code_article',
              'size' => 8,
              'alt' => $this->getOption('alt'),
              'rel' => 'code_article',
              'onchange' => 'loadArticleFocusOut(this)',
              // PROPOSITION
              //'onkeyup' => 'addGencodeMaster(this);loadArticleByLength(this);')),
              'onkeyup' => 'loadArticleByLength(this);')),
          'gencode' => new sfWidgetFormInputText(
            array(),
            array(
              'class' => 'gencode',
              'maxlength' => 13,
              'size' => 13,
              'alt' => $this->getOption('alt'),
              'onkeyup' => 'gencodeIsAvailable(this);')),
          'exist' => new sfWidgetFormInputHidden(
            array(),array('value' => '','class' => 'exist')),
          'libelle' => new sfWidgetFormInputHidden(
            array(),array('value' => '','class' => 'libelle')),
        ));
     
        $this->setValidators(array(
          'code_article' => new sfValidatorString(array('required' => false)),
          'gencode' => new sfValidatorNumber(
            array('required' => false),
            array('invalid' => 'Le gencode doit être composer de numéro.'))
        ));
     
        $form = new GncGencodeChildrenForm(null, array(
          'master' => $this->getObject(),
          'size'    => 1,
          'start' => $this->getOption('start', 0)
        ));
     
        $this->embedForm('children', $form);
      }
    }
    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
     
    class GncGencodeChildrenForm extends sfForm
    {
      public function configure()
      {
        if (!$gencode = $this->getOption('master'))
        {
          throw new InvalidArgumentException('You must provide a gencode object.');
        }
     
        for ($i = $this->getOption('start', 0); $i < $this->getOption('size', 2); $i++)
        {
          $gencode_child = new AoGencode();
          $gencode_child->AoGencode = $gencode;
     
          $form = new GncGencodeChildForm($gencode_child, array('alt' => $i));
     
          $this->embedForm($i, $form);
        }
      }
    }
    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
     
    class GncGencodeChildForm extends BaseAoGencodeForm
    {
      public function configure()
      {
        $current = $this->getOption('alt',0);
     
        $libelle_attributes = array(
          'class' => 'child_libelle',
          'size' => 35,
          'maxlength' => 30,
          'alt' => $current,
          'onkeyup' => 'addGencodeChild(this);'
        );
     
        $gencode_attributes = array(
          'class' => 'child_gencode',
          'maxlength' => 13,
          'size' => 13
        );
     
        if ($this->getOption('parent_id') != null)
        {
          $parent_id = $this->getOption('parent_id');
          $str_id_attr = 'gencode_'. $parent_id . '_children_'. $current. '_';
          $str_name_attr = 'gencode['. $parent_id . '][children]['. $current. '][';
     
          $libelle_attributes['id'] = $str_id_attr . 'libelle' ;
          $libelle_attributes['name'] = $str_name_attr . 'libelle]';
     
          $gencode_attributes['id'] = $str_id_attr . 'gencode' ;
          $gencode_attributes['name'] = $str_name_attr . 'gencode]';
        }
     
        $this->setWidgets(array(
          'libelle' => new sfWidgetFormInputText(array(), $libelle_attributes),
          'gencode' => new sfWidgetFormInputText(array(), $gencode_attributes),
        ));
     
        $this->setValidators(array(
          'libelle' => new sfValidatorString(array('required' => false),array()),
          'gencode' => new sfValidatorString(array('required' => false),array()),
        ));
      }
    }
    Voila ... c'est très tirer par les cheveux mais je ne vois pas comment faire pour respecter ce que veut mon boss.

    Ma grosse problématique est de controler ces champs ...
    Que mon formulaire soit simple ou utilise la méthode embed, la méthode bind s'utilise de la meme facon.

    En pièce jointe, vous pouvez voir ce que cela donne à l'écran. A savoir, au départ, une seule ligne s'affiche et au fur et à mesure de la saisie, des formulaires vont venir s'ajouter en dessous (appel Ajax)
    Images attachées Images attachées  

  4. #4
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 61
    Points : 56
    Points
    56
    Par défaut
    Salut,

    Tu dois redéfinir la méthode bind() dans tes formulaires "parents", ceux qui vont inclure un nombre indéfini de formulaires fils. Je te conseille cet article, qui m'a beaucoup aidé pour un problème similaire : http://www.nacho-martin.com/dynamic-...comment-page-1 .

    Cordialement,
    Jérémy

  5. #5
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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
    Points : 8 486
    Points
    8 486
    Par défaut
    Tu as pu t'en tirer avec l'article ?

    Désolé, j'ai été absent quelques jours.

    En principe ce n'est pas réalisable de base. Si tu ne t'en tires pas avec ce qui est expliqué dans l'article, il reste à tout générer à la main.
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

Discussions similaires

  1. [JSF] Implémentation d'un formulaire dynamique
    Par Fleep dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 01/03/2005, 19h00
  2. pb access formulaire dynamique
    Par jibouze dans le forum IHM
    Réponses: 3
    Dernier message: 12/01/2005, 09h39
  3. Réponses: 4
    Dernier message: 25/11/2004, 12h24
  4. formulaire dynamique
    Par shirya dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 19/10/2004, 16h13
  5. [struts]Formulaire dynamique
    Par GreenJay dans le forum Struts 1
    Réponses: 8
    Dernier message: 28/05/2004, 16h35

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