webentwicklung-frage-antwort-db.com.de

So erhalten Sie eine Doctrine2-Entity-Methode aus einem Symfony2-Formular in Twig

Ich bin in einer Twig-Vorlage und habe eine "Formular" -Variable, die ein Doctrine2-Entity-Formular darstellt.

Diese Entität verfügt über Eigenschaften, die dem Formular zugeordnet sind, aber die Entität verfügt auch über einige Methoden, auf die ich über meine Twig-Vorlage zugreifen möchte.

Ich würde gerne so etwas machen:

{{ form.myMethod }}

oder vielleicht so etwas:

{{ form.getEntity.myMethod }}

aber leider klappt es nicht.

Wie könnte ich erreichen, was ich brauche?

19
David Morales

Mit dem folgenden Code können Sie über FormView in einer Zweigvorlage auf Ihre Entität zugreifen

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

Wobei Formular Ihr FormView-Objekt ist. Dies gibt Ihre Entität zurück und von dort aus können Sie alle Methoden für sie aufrufen. Wenn Sie eine Sammlung von Entitäten oder eine einzelne Entität in Ihr Formular einbetten, können Sie auf die gleiche Weise darauf zugreifen

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

oder

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

Eine noch bequemere Syntax zum Abrufen der zugrunde liegenden Entität

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

ist das:

{{ form.vars.value }}

Dann können Sie eine beliebige Entity-Methode wie diese aufrufen:

{{ form.vars.value.someMethod }}

Siehe auch das Kapitel Formular in den Symfony2-Dokumenten:

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

18
Philipp Rieber

Nur um das Thema zu aktualisieren:

form.get('value')

ist veraltet seit symfony 2.1. Kopieren Sie aus 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) ....

also denke ich

form.vars.value.youMethod()

sollte der richtige Weg sein. Es hat bei mir funktioniert.

... und da geht es meinem ersten Beitrag hier. ich hoffe es hilft!

15
javigzz

Verlor einige Stunden beim Versuch herauszufinden, was los ist und warum

{{ form.vars.value }}

ist Null.

Wenn Sie ein form.element-Objekt (nicht das Formularobjekt selbst) haben, z. B. wenn Sie eine form_row-Vorlage überschreiben, die das form.row-Objekt übergeben hat, können Sie die Entität folgendermaßen abrufen:

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

hoffe das hilft jemandem!

EDIT: Jahr und so später - ein weiterer nützlicher Tipp:

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

objektmethoden sollten im Zweig funktionieren, ich weiß, dass ich sie in einem Projekt verwendet habe.

versuche () zu benutzen

wie {{ form.myMethod() }}

3
Inoryy

Es scheint, dass der Wert irgendwann tatsächlich null ist. So können Sie verwenden

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

getestet in SF v3.0.6.

1
ncastro

In Version 2.6.7 hat keines der oben genannten Probleme bei mir funktioniert. Ich habe angepasste Formular-Widgets verwendet, um dies zu erreichen:

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