如何从Twig中的Symfony2表单获取Doctrine2实体方法

时间:2011-08-20 19:43:24

标签: php symfony twig

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

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

我很乐意做这样的事情:

{{ form.myMethod }}

或者可能是这样的:

{{ form.getEntity.myMethod }}

但遗憾的是它不起作用。

我怎样才能实现我的需要?

8 个答案:

答案 0 :(得分:34)

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

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

表单是FormView对象。这将返回您的实体,然后您可以在其上调用任何方法。如果您在表单中嵌入了一组实体或单个实体,则可以使用相同的方式访问它

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

{% for obj in form.mycollection %}
  {{ obj.get('value').someMethod }}
{% endif %}

答案 1 :(得分: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

答案 2 :(得分: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()

应该是要走的路。它已经形成了我。

......我的第一篇文章就在这里。希望它有所帮助!

答案 3 :(得分:5)

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

{{ form.vars.value }}

是NULL。

如果你有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 %}

答案 4 :(得分:3)

对象方法应该在twig中工作,我知道我在一些项目中使用它们。

尝试使用()

喜欢{{ form.myMethod() }}

答案 5 :(得分:1)

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

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

在SF v3.0.6中测试。

答案 6 :(得分:0)

版本2.6.7 中没有上述内容适用于我。我用customised form widgets来实现这个目标:

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

答案 7 :(得分:-1)

使用{{ form.getData.myMethod }}