web-dev-qa-db-fra.com

Comment obtenir une méthode Doctrine2 Entity à partir d'un formulaire Symfony2 dans Twig

Je suis dans un modèle Twig et j'ai une variable "formulaire" qui représente un formulaire d'entité Doctrine2.

Cette entité a des propriétés qui sont mappées dans le formulaire, mais l'entité dispose également de méthodes auxquelles j'aimerais accéder à partir de mon modèle Twig.

J'aimerais faire quelque chose comme ça:

{{ form.myMethod }}

ou peut-être quelque chose comme ça:

{{ form.getEntity.myMethod }}

mais malheureusement ça ne marche pas.

Comment pourrais-je atteindre ce dont j'ai besoin?

19
David Morales

Pour accéder à votre entité depuis votre FormView dans un modèle de brindille, vous pouvez utiliser le code suivant

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

Où form est votre objet FormView. Cela retournera votre entité et à partir de là, vous pourrez appeler n'importe quelle méthode dessus. Si vous incorporez une collection d'entités ou une seule entité dans votre formulaire, vous pouvez y accéder de la même manière.

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

ou

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

Une syntaxe encore plus pratique pour obtenir l'entité sous-jacente au lieu de

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

est-ce:

{{ form.vars.value }}

Ensuite, vous pouvez appeler n'importe quelle méthode d'entité comme ceci:

{{ form.vars.value.someMethod }}

Voir aussi le chapitre sur les formulaires dans les documents Symfony2:

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

18
Philipp Rieber

Juste pour mettre à jour le sujet:

form.get('value')

est obsolète depuis symfony 2.1. Copier de 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) ....

donc je suppose

form.vars.value.youMethod()

devrait être la voie à suivre. Cela a fonctionné de moi.

... et voilà mon premier post ici. J'espère que ça aide!

15
javigzz

Quelques heures perdues pour essayer de comprendre ce qui se passe et pourquoi

{{ form.vars.value }}

est NULL.

Si vous avez un objet form.element (et non l'objet de formulaire lui-même), par exemple si vous redéfinissez un modèle form_row ayant transmis l'objet form.row, vous pouvez obtenir l'entité comme suit:

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

espérons que cela aide quelqu'un!

EDIT: Année et plus tard - un autre conseil utile:

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

les méthodes objet devraient fonctionner dans twig, je sais que je les ai utilisées dans certains projets.

essayez d'utiliser ()

comme {{ form.myMethod() }}

3
Inoryy

Il semble que, à un moment donné, la valeur est réellement null . Afin que vous puissiez utiliser

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

testé dans SF v3.0.6.

1
ncastro

Aucun de ce qui précède n'a fonctionné pour moi dans version 2.6.7 . J'ai utilisé des widgets de formulaire personnalisés pour y parvenir:

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