Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > symfony
symfony Forum d'entraide sur le framework PHP symfony. Avant de poster : cours symfony et FAQ symfony
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 22/04/2011, 13h00   #1
Membre du Club
 
Développeur informatique
Inscription : août 2004
Messages : 136
Détails du profil
Informations personnelles :
Âge : 30

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : août 2004
Messages : 136
Points : 52
Points : 52
Envoyer un message via MSN à Zen_Fou
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 :
$this->form->bind($request->getParameter('monform'))
et faire mes controles à la main mais c'est pas top.
Zen_Fou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/04/2011, 11h31   #2
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
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 !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/04/2011, 08h57   #3
Membre du Club
 
Développeur informatique
Inscription : août 2004
Messages : 136
Détails du profil
Informations personnelles :
Âge : 30

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : août 2004
Messages : 136
Points : 52
Points : 52
Envoyer un message via MSN à Zen_Fou
C'est exactement cela ...

Code :
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 :
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 :
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 :
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
Type de fichier : png gnc.png (16,3 Ko, 10 affichages)
Zen_Fou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/04/2011, 09h26   #4
Futur Membre du Club
 
Jérémy DUTHEIL
Étudiant
Inscription : avril 2009
Messages : 59
Détails du profil
Informations personnelles :
Nom : Jérémy DUTHEIL

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2009
Messages : 59
Points : 19
Points : 19
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
NainTernaute est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/05/2011, 10h07   #5
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
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 !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h00.


 
 
 
 
Partenaires

Hébergement Web