无法从宏访问.vars.prototype

时间:2016-03-17 12:28:24

标签: twig symfony

我尝试使用data-prototype attr自定义集合的添加/删除功能。
为此,我使用了一些树枝macro: 控制器调用的视图

{# 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

例如,以下代码有效:

{# principal view .html.twig #}

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

我觉得它与上面完全一样,有 form.documentations =&gt; arrayVar
arrayVar.vars.prototype =&gt; value

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

输出应该相同......

你可以帮我找到那里的错误吗?

1 个答案:

答案 0 :(得分:0)

好吧,我可能会愚蠢自己变得如此愚蠢,但通过写下来,我意识到(在最后的代码部分中)我犯了一个错误:

最后的i in value已经是名称或路径,或者是#Extra ...
所以当我尝试访问form.documentations.vars.prototype.name.name它的逻辑时,我得到一个漂亮的例外......

因此解决方案是修改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