Salut s'il vous plais j'aimerais implémenter un formulaire imbriqué.
One To Many .
Un Bordereau à plusieurs Items (des articles).

Voici mon formulaire Items:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 
public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('article', 'entity', array('required'=>true, 'class'=>'PPPStockBundle:Article'))
            ->add('originOffice', 'entity', array('required'=>true, 'class'=>'PPPCoreBundle:office'))
            ->add('quantity','integer', array('required'=>true)) 
            ->add('startRange','integer') 
            ->add('endRange','integer');
    }
Voici le formulaire des bordereaux
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
 
public function buildForm(FormBuilderInterface $builder, array $options) {
        $builder->add('reference', 'text', array('required'=>true, 'label'=>'bordereau.reference.label.key'))
                ->add('status', 'text', array('required'=>true, 'label'=>'status.label.key'))
                ->add('originOffice', 'entity', array('required'=>true, 'class'=>'PPPCoreBundle:office'))
                ->add('destinationOffice', 'entity', array('required'=>true, 'class'=>'PPPCoreBundle:office'))
                ->add('sendDate', 'date', array('required'=>true, 'label'=>'send.date.label.key'))
                ->add('receiveDate', 'date', array('required'=>true, 'label'=>'receive.date.label.key'))
                ->add('author', 'text', array('required'=>true, 'label'=>'autor.label.key'))
                ->add('reciever', 'text', array('required'=>true, 'label'=>'receiver.label.key'))                
                ->add('problem', 'textarea', array('label'=>'status.label.key'))
                ->add('items', 'collection', array('type'=> new ItemType(),
                                                  'allow_add' => true,
                                                  'allow_delete' => true,
                                                  'prototype' => true,
                                                  'by_reference' => false));
    }
et voici ma vue
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
89
90
91
92
93
94
95
96
97
 
{% extends 'PPPStockBundle::layout.html.twig' %}
 
 
{% block content %}
 
    {#display flash message if any#}
    {% for flashMessage in app.session.flashbag.get('notice') %}
    <div class="flash-message">
       {{ flashMessage|trans }}
    </div>
    {% endfor %}
    <div><h3><b>New bordereau</b></h3>
    <form action="{{ path('PPP_stcok_register_bordereau') }}" {{ form_enctype(form) }} method="POST" class="col-sm-12">
        {{ form_label(form.destinationOffice) }}                    
        {{ form_widget(form.destinationOffice, {'attr': {'class': 'block-field select-menu'} }) }}
        {{ form_errors(form.destinationOffice) }} 
        <br/>
        <div class='row'>
            <span class="col-sm-3"><b>Bordereau Items </b></span>
            <span class="pull-right"><a id="add-another-item" class="btn" onclick="add()">{{ 'add.article.key' | trans()}}</a></span>
        </div>  
 
        {% macro prototype(item) %}
            <tr>
                <td></td>
                <td>
                    {{ form_errors(item.article) }}
                    {{ form_widget(item.article) }}
                </td>
                <td>
                    {{ form_errors(item.quantity) }}
                    {{ form_widget(item.quantity) }}
                </td>
                <td>
                    {{ form_errors(item.startRange) }} 
                    {{ form_widget(item.startRange) }}
                </td>
                <td>
                    {{ form_errors(item.endRange) }} 
                    {{ form_widget(item.endRange) }}
                </td>
                <td><a class="remove_item" onclick="remove()">Remove</a></td>
            </tr>
        {% endmacro %}
 
     <table class="content-table col-sm-12" cellspacing="2" id="item_list">
        <caption>{{ form_label(form.items) }}</caption>
        <thead>
            <tr>
                <th>N°=</th>
                <th>Article</th>
                <th>{{'qte.article.key'}}</th>
                <th>{{'start.range.key'}}</th>
                <th>{{'end.range.key'}}</th>
                <th>{{'action.key'}}</th>
            </tr>
        </thead>
            <tbody id="item_list" data-prototype="{{ form_widget(form.items.vars.prototype) | e }}">
                {% for key, item in form.items %}
                    {{ _self.prototype(item) }}
                {% endfor %}
            </tbody>
        </table>
 
        <div class="row">
            <span class="col-sm-3 pull-right"><input class="submit-button float-right" id="register-computer-button" type="submit" value="{{ 'register.label.key'|trans }}" /></span>
        </div>    
        {{ form_rest(form) }}
 
    </form> 
    </div>
 
{% endblock %}
 
<script src="http://code.jquery.com/jquery-1.8.2.min.js"></script>
 <script type='text/javascript' src='{{ asset('js/jquery.js')}}'></script>
 
<script type="text/javascript">
function add(){
    var index = $('#item_list tr').length;
    var row = $('script[type="text/html"]').text().replace(/\$\$name\$\$/g, index);    
    $('table tbody').append(row);
    alert("ADD NEW LIGN_"+row);
};
 
 
function remove() {
    $(this).closest('tr').remove();
};
 
$(document).ready(function() {
    if ($('table tbody tr').length === 0) {
        add();
    }
}); 
</script>
je souhaite créer dans un tableau des lignes d'item. Mais seulement à chaque click pour ajourter une nouvelle ligne rien ne se passe. je n'arrive pas à ajouter de nouvelles lignes dans mon tableau. J'ai besoin de votre aide s'il vous plais.