2016-03-17 2 views
1

Я пытаюсь настроить функцию добавления/удаления коллекции с помощью атрибута data-prototype.
Для этого я использую некоторые прут macro: представления с именем контроллеромНевозможно получить доступ к .vars.prototype из макросов

{# the principal view .html.twig #}  
{% from"AppBundle:Macros:tabRangeVal.html.twig" import tableau %} 

[...] 
    {{ tableau('InstrumentSharedUtils/File',form.documentations) }} 
    {{ tableau('SpecificationsSheet/SpecificationSheet',form.list) }} 
[...] 

макрос для tableau

{# /src/AppBundle/Resources/views/Macros/tabRangeVal.html.twig #} 
{% macro tableau(classe, arrayVar) %} 
    {% from "AppBundle:Form:"~ classe ~ ".html.twig" import val %} 
    {% from "AppBundle:Form:"~ classe ~ ".html.twig" import label %} 
    {% from "AppBundle:Macros:dataProto.html.twig" import proDataType %} 
    <div class="well well-sm"> 
     <h5> {{ form_label(arrayVar) }}</h5> 
     <table class="table"> 
      <thead> 
       <tr> 
        <th><button class="btn btn-default btn-add-row" type="button" id="{{ "add_#{arrayVar.vars.id}" }}"><span class="glyphicon glyphicon-plus"></span></button></th> 
        {{ label() }} 
       </tr> 
      </thead> 
      <tbody id="{{ "container_#{arrayVar.vars.id}" }}" data-prototype="{{ proDataType(classe, arrayVar.vars.prototype)|e }}"> 
       {% for i in arrayVar %} 
        <tr > 
         <td><button class="btn btn-default btn-delete-row"><span class="glyphicon glyphicon-minus"></span></button></td> 
         {{ val(i) }} 
        </tr> 
       {% endfor %} 
      </tbody> 
     </table> 
    </div> 
{% endmacro %} 

макроса для поля данных прототипа

{# /src/AppBundle/Resources/views/Macros/dataProto.html.twig #} 
{% macro proDataType(classe, value) %} 
    {% from "AppBundle:Form:"~ classe ~ ".html.twig" import val %} 
    <tr> 
     {% for v in value %} 
      <td><button class="btn btn-default btn-delete-row"><span class="glyphicon glyphicon-minus"></span></button></td> 
      {{ val(v) }} 
     {% endfor %} 
    </tr> 
{% endmacro %} 

в пример AppBundle:Form:"~ classe ~ ".html.twig

{# /src/AppBundle/Resources/views/Form/InstrumentSharedUtils/File.html.twig #} 
{% macro val(var) %} 
    <td>{{ form_widget(var.name, { 'attr': { 'class':'form-control' } }) }}</td> 
    <td>{{ form_widget(var.path, { 'attr': { 'class':'form-control' } }) }}</td> 
    <td>{{ form_widget(var.isExtra) }}</td> 
{% endmacro %} 

{% macro label() %} 
    <th>Name</th> 
    <th>Path</th> 
    <th>Is Extra</th> 
{% endmacro %} 

Проблема заключается в том, что я получаю ошибку

Method "name" for object "Symfony\Component\Form\FormView" does not exist in AppBundle:Form:InstrumentSharedUtils/File.html.twig at line 2 

Дело в том, что действительно беспокоит меня то, что я могу получить доступ к имени (и даже другие prototype.vars.children), если я не использую макрос

по Exemple, следующий код работает:

{# principal view .html.twig #} 

{% for i in form.documentations.vars.prototype %} 
     {{ form_widget(i) }} 
{% endfor %} 

и я чувствую, как его точно так же, как и выше, с
form.documentations =>arrayVar,
arrayVar.vars.prototype =>value и

{% for i in value %} 
    {{ form_widget(i.name) }} 
    {{ form_widget(i.path) }} 
    {{ form_widget(i.isExtra) }} 
{% endfor %} 

выход должен быть таким же ...

вы могли бы помочь мне найти то, что случилось там?

ответ

0

Хорошо, я, вероятно, пороть себя так глупо, но, написав его, я понял, (в последнем разделе кода), что я сделал ошибку:

i in value в конце концов, это уже либо имя или путь или isExtra ...
поэтому, когда я пытаюсь получить доступ к form.documentations.vars.prototype.name.name его логики, что я получаю BEAUTIFULL исключение ...

поэтому решение должно было изменить dataproto макросъемки

{% macro proDataType(classe, value) %} 
<tr class='block-to-remove'> 
<td><button class='btn btn-default btn-delete-row'><span class='glyphicon glyphicon-minus'></span></button></td> 
{% for truc in value %} 
<td>{{ form_widget(truc, { 'attr': { 'class':'form-control' } }) }}</td> 
{% endfor %} 
</tr> 
{% endmacro %} 

и направить arrayVar.vars.prototype к нему

Смежные вопросы