形式主题:未找到功能

时间:2012-12-11 15:13:25

标签: twig symfony-2.1

我正在创建自定义表单主题,以便为自定义字段类型生成正确的HTML。 我注册了我的twigfile,它工作正常,除了找不到奇怪的函数错误。

我复制了创建集合类型的默认主题(form_div_layout)中的部分。 然后我更改了块名称以避免干扰默认样式。 在更改块名称之前,它可以工作甚至使用我的本地定义,但之后twig似乎无法将块用作函数(尽管它在默认主题中有效)。有人能给我一个暗示吗?

这很有效,只是从默认模板中复制而来。

{% block sortableCollection_widget %}
{% spaceless %}
    {% if prototype is defined %}
        {% set attr = attr|merge({'data-prototype': form_row(prototype) }) %}
    {% endif %}
    <div {{ block('widget_container_attributes') }}>
        {% if form.parent is empty %}
            {{ form_errors(form) }}
        {% endif %}
        {{ block('sortableCollection_rows') }}
        {{ form_rest(form) }}
    </div>
{% endspaceless %}
{% endblock %}

{% block sortableCollection_rows %}
{% spaceless %}
    <ol class='.collection-editor .collection-sortable'>
    {% for child in form %}
        {{ form_row(child) }}
    {% endfor %}
    </ol>
{% endspaceless %}
{% endblock sortableCollection_rows %}

{% block form_row %}
{% spaceless %}
    <li>using my template
        {{ form_label(form) }}
        {{ form_errors(form) }}
        {{ form_widget(form) }}
    </li>
{% endspaceless %}
{% endblock form_row %}

{% block form_rows %}
{% spaceless %}
    {% for child in form %}
        {{ form_row(child) }}
    {% endfor %}
{% endspaceless %}
{% endblock form_rows %}

现在我将form_row重命名为sortableCollection_row,我收到此错误: DTAMetadataBundle中不存在函数“sortableCollection_row”:第39行的Form:sortableCollection.html.twig

它指向sortableCollection_row(child)被调用的地方。

{% block sortableCollection_widget %}
{% spaceless %}
    {% if prototype is defined %}
        {% set attr = attr|merge({'data-prototype': form_row(prototype) }) %}
    {% endif %}
    <div {{ block('widget_container_attributes') }}>
        {% if form.parent is empty %}
            {{ form_errors(form) }}
        {% endif %}
        {{ block('sortableCollection_rows') }}
        {{ form_rest(form) }}
    </div>
{% endspaceless %}
{% endblock %}

{% block sortableCollection_rows %}
{% spaceless %}
    <ol class='.collection-editor .collection-sortable'>
    {% for child in form %}
        {{ form_row(child) }}
    {% endfor %}
    </ol>
{% endspaceless %}
{% endblock sortableCollection_rows %}

{% block sortableCollection_row %}
{% spaceless %}
    <li>using my template
        {{ form_label(form) }}
        {{ form_errors(form) }}
        {{ form_widget(form) }}
    </li>
{% endspaceless %}
{% endblock sortableCollection_row %}

{% block form_rows %}
{% spaceless %}
    {% for child in form %}
        {{ sortableCollection_row(child) }} // ERROR.
    {% endfor %}
{% endspaceless %}
{% endblock form_rows %}

一个想法,某人?谢谢!

1 个答案:

答案 0 :(得分:2)

form_row是一个树枝函数,也是一个树枝块。因此,当您调用form_row(...)时,您实际上正在调用一个twig函数而不是直接调用该块。该功能将包括块内容,因此我可以看到它是如何混淆。

因此尝试调用sortableCollection_row无效,因为它实际上不是一个函数,它是一个块。得到它?你可以这样做:

{% block form_rows %}
{% spaceless %}
    {% for child in form %}
        {{ block('sortableCollection_row') }} // NO ERROR
    {% endfor %}
{% endspaceless %}
{% endblock form_rows %}

现在在sortableCollection_row块内,而不是引用form,您需要引用child,因为您不再将子变量传递给块。