web-dev-qa-db-ja.com

TwigのSymfony2フォームからDoctrine2エンティティメソッドを取得する方法

Twigテンプレートを使用していて、Doctrine2エンティティフォームを表す「フォーム」変数があります。

このエンティティには、フォームにマップされるプロパティがありますが、エンティティには、Twigテンプレートからアクセスしたいメソッドもいくつかあります。

私はこのようなことをしたいです:

{{ form.myMethod }}

または多分このようなもの:

{{ form.getEntity.myMethod }}

しかし、残念ながらそれは機能しません。

どうすれば必要なことを達成できますか?

19
David Morales

twigテンプレートのFormViewからエンティティにアクセスするには、次のコードを使用できます

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

FormはFormViewオブジェクトです。これによりエンティティが返され、そこから任意のメソッドを呼び出すことができます。エンティティのコレクションまたは単一のエンティティをフォームに埋め込む場合は、同じ方法でアクセスできます

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

または

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

代わりに基礎となるエンティティを取得するためのさらに便利な構文

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

18
Philipp Rieber

件名を更新するためだけに:

form.get('value')

symfony2.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()

行く方法でなければなりません。それは私から働いています。

...そしてここに私の最初の投稿があります。それが役に立てば幸い!

15
javigzz

何が起こっているのか、そしてその理由を理解しようとして数時間を失った

{{ form.vars.value }}

無効です。

Form.element(フォームオブジェクト自体ではない)オブジェクトがある場合、たとえば、form.rowオブジェクトを渡したform_rowテンプレートをオーバーライドする場合、次のようにエンティティを取得できます。

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

それが誰かを助けることを願っています!

編集:1年後-別の便利なヒント:

{% block sonata_type_collection_widget %}
    {% for child in form %}
        {{ child.vars.form.vars.value.name }}
    {% endfor %}
{% endblock %}
5
Anton Valqk

オブジェクトメソッドは小枝で機能するはずです。私はいくつかのプロジェクトでそれらを使用したことを知っています。

_()_を使用してみてください

{{ form.myMethod() }}のように

3
Inoryy

ある時点でvalueは実際にはnullのようです。だからあなたは使うことができます

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

sFv3.0.6でテスト済み。

1
ncastro

バージョン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 %-}
0
Jonny