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?
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 %}
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
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!
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 %}
objektmethoden sollten im Zweig funktionieren, ich weiß, dass ich sie in einem Projekt verwendet habe.
versuche ()
zu benutzen
wie {{ form.myMethod() }}
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.
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 %-}