【发布时间】:2011-10-31 08:15:09
【问题描述】:
我在一个 Twig 模板中,我有一个表示 Doctrine2 实体表单的“表单”变量。
该实体具有映射到表单中的属性,但该实体还有一些我想从我的 Twig 模板访问的方法。
我很想做这样的事情:
{{ form.myMethod }}
或者可能是这样的:
{{ form.getEntity.myMethod }}
但不幸的是它不起作用。
我怎样才能达到我的需要?
【问题讨论】:
我在一个 Twig 模板中,我有一个表示 Doctrine2 实体表单的“表单”变量。
该实体具有映射到表单中的属性,但该实体还有一些我想从我的 Twig 模板访问的方法。
我很想做这样的事情:
{{ form.myMethod }}
或者可能是这样的:
{{ form.getEntity.myMethod }}
但不幸的是它不起作用。
我怎样才能达到我的需要?
【问题讨论】:
对象方法应该可以在 twig 中使用,我知道我在某些项目中使用过它们。
尝试使用()
点赞{{ form.myMethod() }}
【讨论】:
myMethod()?我正在尝试做myMethod(100,50),但它似乎不起作用,而且我不知道如何调试它......有什么想法吗?谢谢!
使用{{ form.getData.myMethod }}。
【讨论】:
要在树枝模板中从 FormView 访问您的实体,您可以使用以下代码
{{ form.get('value') }}
form 是您的 FormView 对象。这将返回您的实体,您可以从那里调用任何方法。如果您在表单中嵌入实体集合或单个实体,则可以以相同的方式访问它
{{ form.someembedform.get('value') }}
或
{% for obj in form.mycollection %}
{{ obj.get('value').someMethod }}
{% endif %}
【讨论】:
{{ form.cp.get('id') }} 不起作用,但 {{ form.cp.vars.id }} 起作用。所以 Philipp Rieber 的回答似乎更准确。
{{ form.cp.vars.id }}
一种更方便的语法来获取底层实体,而不是
{{ 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
【讨论】:
花了几个小时试图弄清楚发生了什么以及为什么
{{ 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 %}
【讨论】:
只是为了更新主题:
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()
应该是要走的路。它对我有用。
... 这是我的第一篇文章。希望有帮助!
【讨论】:
在版本 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 %-}
【讨论】:
似乎在某些时候 value 实际上是 null。所以你可以使用
{{ (form.vars.value != null) ? form.vars.value.yourEntityMethod():'' }}
在 SF v3.0.6 中测试。
【讨论】: