19

我在一个 Twig 模板中,我有一个代表 Doctrine2 实体表单的“表单”变量。

该实体具有映射到表单中的属性,但该实体还有一些我想从 Twig 模板访问的方法。

我很想做这样的事情:

{{ form.myMethod }}

或者可能是这样的:

{{ form.getEntity.myMethod }}

但不幸的是它不起作用。

我怎样才能达到我所需要的?

4

8 回答 8

34

要从树枝模板中的 FormView 访问您的实体,您可以使用以下代码

{{ form.get('value') }}

form 是您的 FormView 对象。这将返回您的实体,您可以从那里调用任何方法。如果您在表单中嵌入实体集合或单个实体,则可以以相同的方式访问它

{{ form.someembedform.get('value') }}

或者

{% for obj in form.mycollection %}
  {{ obj.get('value').someMethod }}
{% endif %}
于 2011-09-09T19:50:12.007 回答
18

一种更方便的语法来获取底层实体,而不是

{{ form.get('value') }}

这是:

{{ form.vars.value }}

然后你可以像这样调用任何实体方法:

{{ form.vars.value.someMethod }}

另请参阅 Symfony2 文档中的表单章节:

http://symfony.com/doc/current/book/forms.html#rendering-a-form-in-a-template

于 2012-02-01T13:15:05.950 回答
15

只是为了更新主题:

form.get('value')

自 symfony 2.1 起已弃用。从 Symfony\Component\Form\FormView 复制:

/*
 * @deprecated Deprecated since version 2.1, to be removed in 2.3. Access
 *             the public property {@link vars} instead.
 */
public function get($name, $default = null) ....

所以,我猜

form.vars.value.youMethod()

应该是要走的路。它对我有用。

...这是我的第一篇文章。希望能帮助到你!

于 2012-10-26T11:53:14.497 回答
6

花了几个小时试图弄清楚发生了什么以及为什么

{{ form.vars.value }}

一片空白。

如果您有 form.element(不是表单对象本身)对象,例如,如果您要覆盖传递 form.row 对象的 form_row 模板,您可以像这样获取实体:

{{ form.getParent().vars.value.MyEntityMethod }}

希望对某人有所帮助!

编辑:一年后 - 另一个有用的提示:

{% block sonata_type_collection_widget %}
    {% for child in form %}
        {{ child.vars.form.vars.value.name }}
    {% endfor %}
{% endblock %}
于 2012-08-10T23:46:19.230 回答
3

对象方法应该在树枝中工作,我知道我在某些项目中使用过它们。

尝试使用()

{{ form.myMethod() }}

于 2011-08-20T20:20:23.190 回答
1

似乎在某些时候该实际上是null。所以你可以使用

{{ (form.vars.value != null) ? form.vars.value.yourEntityMethod():'' }}

在 SF v3.0.6 中测试。

于 2017-06-20T16:42:52.960 回答
0

2.6.7 版本中,以上都不适用于我。我使用自定义表单小部件来实现这一点:

{# src/AppBundle/Resources/views/Form/fields.html.twig #}
{% extends 'form_div_layout.html.twig' %}

{%- block entity_widget -%}
    <div {{ block('widget_container_attributes') }}>
    {%- for n, child in form %}
        {{- form_widget(child, {
            'entity': form.vars.choices[n].data
        }) -}}
        {{- form_label(child) -}}
    {% endfor -%}
    </div>
{%- endblock %-}

{%- block radio_widget -%}
{# You now have access to entity #}
{%- endblock %-}
于 2015-05-20T08:56:00.293 回答
-1

使用{{ form.getData.myMethod }}.

于 2011-08-20T21:01:27.873 回答