J'utilise Symfony 2.2 et j'ai un problème quand je veux imbriquer mes formulaires, en fait seul la dernière entrée du champ est prise en compte, peut importe le nombre de champs que je créé.
Je vous met 3 images pour représenter mon problème :
- La première représente le formulaire avec plusieurs 2 champs "mails" ;
- La seconde représente le dump de ma variable représentant le formulaire (vous pouvez voir que seul la deuxième adresse est dans le dump et pas la première) ;
- La troisième représente le résultat après validation du formulaire.
Voici aussi le code réduit au minimum que j'utilise :
TestEntity.php :
TestForm.php :
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 <?php namespace dvp\Web2FoafBundle\Entity; use Symfony\Component\Validator\Constraints as Assert; class Person { /** * @var string $givenName * @Assert\NotBlank() */ private $givenName; /** * @var string $name * @Assert\NotBlank() */ private $name; /** * @var string $email * @Assert\All(@Assert\Email(checkMX = true, message="Votre adresse mail est soit mal formée, ou n'existe pas")) */ private $emails; public function __construct() { $this->emails = array(); } public function getEmails() { return $this->emails; } public function setEmails ($emails) { $this->emails = $emails; } }
TestController.php :
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 <?php namespace dvp\Web2FoafBundle\Form; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolverInterface; class PersonType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('givenName', 'text') ->add('name', 'text') ->add('emails', 'collection', array('type' => 'email', 'allow_add' => true, 'allow_delete' => true, 'by_reference' => false, 'required' => false)) ; } public function setDefaultOptions(OptionsResolverInterface $resolver) { $resolver->setDefaults(array( 'data_class' => 'dvp\Web2FoafBundle\Entity\Person', 'cascade_validation' => true, )); } public function getName() { return 'person'; } } ?>
Test.js :
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 <?php namespace dvp\Web2FoafBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Component\HttpFoundation\Request; use dvp\Web2FoafBundle\Entity\Person; use dvp\Web2FoafBundle\Form\PersonType; class PersonController extends Controller { public function createAction (Request $request) { $person = new Person (); $person->setEncrypt (true); $form = $this->createForm (new PersonType (), $person); if ($request->isMethod('POST')) { $form->bind($request); if ($form->isValid ()) { var_dump($person); } } return $this->render('dvpWeb2FoafBundle:Person:create.html.twig', array('form' => $form->createView(), 'message' => '')); } } ?>
index.html.twig :
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 $(document).ready(function() { function add (container, tab, div, text) { if (container.children ().length == 0) { var link = $('<a href="#">Supprimer ' + text + '</a>') container.append ($(container.attr ('data-prototype').replace(/\$\$name\$\$/g, container.children ().length + 1 + tab[0]))) div.append (link) link.on('click', function() { container.children().last().remove(); if (container.children ().length == 0) { div.children().last().remove() } }); } else { container.append ($(container.attr ('data-prototype').replace(/\$\$name\$\$/g, container.children ().length + 1 + tab[1]))) } } $('#add_email').click (function () { var tab = new Array ('èr'.sup() + ' email : ', 'e'.sup() + ' email : ') add ($('#person_emails'), tab, $('#email'), 'un email') }); }) ;
test.html.twig :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title>{% block title %}Projet{% endblock %}</title> </head> <body> {% block body %} {% endblock %} </body> </html>
Quelqu'un saurait-il ce que j'ai fait de travers ?
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
48
49
50
51
52
53
54
55
56
57
58 % extends "dvpWeb2FoafBundle:Person:index.html.twig" %} {% block title %}{{ parent() }} - Création de profils FOAF{% endblock %} {% block body %} <script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script> <script src="{{ asset('bundles/formfoaf/js/addDelFieldForm.js') }}"></script> <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1/jquery-ui.min.js"></script> <script src="{{ asset('bundles/formfoaf/js/jquery.ui.datepicker-fr.js') }}"></script> <link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1/themes/ui-lightness/jquery-ui.css" type="text/css" media="all"/> <h1>Créer un profil FOAF</h1> {% if message %} <p>{{ message }}</p> {% endif %} <form action="" method="post" {{ form_enctype(form) }}> {{ form_errors(form) }} <div id="givenName"> <strong>{{ form_label(form.givenName, "Prénom : ") }}</strong> {{ form_errors(form.givenName) }} {{ form_widget(form.givenName) }} </div> <div id="name"> <strong>{{ form_label(form.name, "Nom : ") }}</strong> {{ form_errors(form.name) }} {{ form_widget(form.name) }} </div> <div id="title"> <strong>{{ form_label(form.title, "Votre titre : ") }}</strong> {{ form_errors(form.title) }} {{ form_widget(form.title) }} </div> <script> function displayVals () { var value = $('#person_title').val (); if (value == 'autre') { $('select').remove ('#person_title') $('#title').append ('<input id=\"person_title\" type=\"text\"/>') } } $('select').change (displayVals); displayVals (); </script> <div id="email"> <strong>{{ form_label(form.emails, "Votre (vos) email(s) : ") }}</strong> {{ form_errors(form.emails) }} {{ form_widget(form.emails) }} <a href="#" id="add_email">Ajouter un email</a> </div> {{ form_rest(form) }} <input type="submit" /> </form> {% endblock %}
d'avance
![]()
Partager