Hello,
voilà ça fait quelques jours que je bloque sur un problème pour la Javascript d'une collection dans une autre collection.
J'ai essayé de m'aider de quelques posts par ci par là et dernièrement je suis tombé sur ça qui avait l'air d'être parfaitement ce qu'il me faut...
J'ai une entité Application et son form :
le formulaire de LienAppliServ :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('servLiens', 'collection', array( 'label' => ' ', 'type' => new LienAppliServType(), 'allow_add' => true, 'allow_delete' => true, 'by_reference' =>false, 'prototype' => true, )) //...
et le formulaire de PortLienAppliServ basique :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('ports', 'collection', array( 'type' => new PortLienAppliServType(), 'allow_add' => true, 'allow_delete' => true, 'prototype' => true, 'by_reference' =>false )) //...
En suivant le post, j'en suis arrivé à ça :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('numPort') //entier ->add('type') //entity ; }
HTML :
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 {{ form_start(form) }} <ul id="col-servliens" data-prototype="{{ form_widget(form.servLiens.vars.prototype)|e }}"> {# iterate over each existing tag and render its only field: name #} {% for servLiens in form.servLiens %} <li>{{ form_row(servLiens) }} </li> <ul id="col-ports" data-prototype="{{ form_widget(ports.vars.prototype)|e }}"> {%for ports in servLiens.ports %} <li>{{ form_row(ports) }}</li> {% endfor %} {% endfor %} </ul> {{ form_end(form) }}
Et la j'ai l'erreur : Variable "ports" does not exist.
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88 //Same as the other question <script> function FormCollection(div_id) { // keep reference to self in all child functions var self=this; self.construct = function () { // set some shortcuts self.div = $('#'+div_id); self.div.data('index', self.div.find(':input').length); // add delete link to existing children self.div.children().each(function() { self.addDeleteLink($(this)); }); // add click event to the Add new button self.div.next().on('click', function(e) { // prevent the link from creating a "#" on the URL e.preventDefault(); // add a new tag form (see next code block) self.addNew(); }); }; /** * onClick event handler -- adds a new input */ self.addNew = function () { // Get the data-prototype explained earlier var prototype = self.div.data('prototype'); // get the new index var index = self.div.data('index'); // Replace '__name__' in the prototype's HTML to // instead be a number based on how many items we have var newForm = prototype.replace(/__name__/g, index); // increase the index with one for the next item self.div.data('index', index + 1); // Display the form in the page in an li, before the "Add a tag" link li self.div.append($(newForm)); // add a delete link to the new form self.addDeleteLink( $(self.div.children(':last-child')[0]) ); // not a very nice intergration.. but when creating stuff that has help icons, // the popovers will not automatically be instantiated //initHelpPopovers(); return $(newForm); }; /** * add Delete icon after input * @param Element row */ self.addDeleteLink = function (row) { var $removeFormA = $('<a href="#" class="btn btn-danger" tabindex="-1"><i class="entypo-trash"></i></a>'); $(row).find('select').after($removeFormA); row.append($removeFormA); $removeFormA.on('click', function(e) { // prevent the link from creating a "#" on the URL e.preventDefault(); // remove the li for the tag form row.remove(); }); }; self.construct(); } </script> <script> $(document).ready(function() { new FormCollection('col-servliens'); new FormCollection('col-ports'); }); </script>
Et je ne comprends pas...
J'ai beau tordre le problème dans tous les sens, je bloque... Donc si quelqu'un peut m'aider ça serait vraiment cool ^^
Merci !
Partager