4 votes

Twig - Itération sur les champs du formulaire

Je suis confronté à un problème en essayant d'itérer sur tous les éléments de formulaire dans un thème de formulaire Twig. En fait, j'ai utilisé ceci pour les itérer :

{% for child in form.parent.children %}

Je ne l'ai pas trouvé dans la documentation, j'ai juste vidé la variable du formulaire et trouvé les champs dans ce chemin. En fait, cela fonctionne bien avec tous les formulaires, sauf lorsque le formulaire lui-même a un paramètre appelé enfants . Je ne sais pas si c'est un bug parce que si tu jettes juste form objet la structure est la même dans les deux cas :

enter image description here

Mais si vous essayez d'accéder form.parent.children lorsqu'il a un children à l'intérieur, vous n'obtiendrez pas ce tableau mais plutôt directement le résultat de "children" :

enter image description here

Comme vous pouvez le voir dans ce cas form.parent.children fait directement référence à l'élément children du formulaire (même identifiant #1592). Pourtant, si vous essayez d'obtenir form.parent.children.parent.children vous aurez à nouveau children donc, en utilisant cette méthode, il n'est pas possible d'itérer sur les champs du formulaire si celui-ci contient un paramètre appelé children .

Est-ce un bug ou est-ce que je rate quelque chose ? Peut-être y a-t-il un autre moyen d'obtenir ce que je veux ?

2voto

yceruto Points 7075

Oui, c'est une collision de noms liée à la façon dont Twig accède à chaque attribut pour des raisons de commodité et parce que FormView est déclaré comme \ArrayAccess il a la priorité sur les propriétés de l'objet . Au fait, la même chose se produirait avec parent y vars propriétés, mais concentrons-nous maintenant sur la solution plutôt que sur le problème.

Comme il s'agit d'un problème de Twig, la solution devrait être orientée dans cette direction. Une solution de contournement pourrait être créer une fonction personnalisée qui obtient la propriété de l FormView correctement :

public function getFunctions()
{
    return array(
        new TwigFunction('formview_prop', array($this, 'getFormViewProperty')),
    );
}

public function getFormViewProperty(FormView $formView, string $prop)
{
    // parent, children or vars
    return $formView->{$prop};
}

Ainsi, en utilisant cette fonction, vous pouvez accéder aux propriétés de la vue plutôt qu'aux champs du formulaire (s'il y a une collision de noms) :

{% for child in formview_prop(form, 'parent') %}

Ensuite, il va itérer sur tous les éléments de champ (enfants) de la vue parent. Cependant, je préfère être explicite en créant trois fonctions formview_parent , formview_children y formview_vars à la place et ne pas passer le deuxième paramètre.


Dans ce sens, vous pourriez avoir besoin de vérifier également si le formulaire a une vue parent ou non, donc puisque Introduction de Symfony 2.7.39, 2.8.32, 3.3.14, 3.4.1, 4.0.1 (comme correction de bug) une nouvelle fonction de test de Twig nommée rootform qui évitent ce genre de collision, notamment pour parent propriété :

{% if form is rootform %}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X