Symfony 2 - Probleme avec les form_theme

Bonjour,

j’ai besoin de personnaliser un formulaire HTML sous symfony 2.8

J’ai utilisé les form_theme pour personnaliser des input radio.

Ca fonctionne bien, ca récupéré le code et j’obtiens bien le HTML désiré, sauf que la balise LABEL est répété :

  • celle de mon form_theme et celle de base (par contre le input n’est pas répété).

Voici le code :

le form_theme

{# app/Resources/views/form/fields.html.twig #}
{% block radio_widget %}
{% spaceless %}
    <div class="col-md-4 col-sm-4 col-xs-12">
        <label  for="{{ id }}" class="required">
            <input type="radio" {{ block('widget_attributes') }}{% if value is defined %} value="{{ value }}"{% endif %}{% if checked %} checked="checked"{% endif %} />
            <span></span>{{  label }}
        </label>
    </div>
{% endspaceless %}
{% endblock radio_widget %}

L’utilisation du form_theme

...
{% form_theme form 'form/fields.html.twig' %}
...
<div class="row">
    {{ form_widget(form.raison, {'attr': {'class': ''}}) }}
</div>
....

au final, j’obtiens le code HTML suivant :

<div class="row">
    <div id="form_raison" class="">
        
        <div class="col-md-4 col-sm-4 col-xs-12">
            <input type="radio" id="form_raison_1" name="form[raison]" required="required" value="1">
            <label for="form_raison_1" class="required"><span></span>Radio 1</label>
        </div>
        <label for="form_raison_1" class="required">Radio 1</label>  <!-- Label en double -->

        <div class="col-md-4 col-sm-4 col-xs-12">
            <input type="radio" id="form_raison_2" name="form[raison]" required="required" value="2">
            <label for="form_raison_2" class="required"><span></span>Radio 2</label>
        </div>
        <label for="form_raison_2" class="required">Radio 2</label>  <!-- Label en double -->

        <div class="col-md-4 col-sm-4 col-xs-12">
            <input type="radio" id="form_raison_3" name="form[raison]" required="required" value="3">
            <label for="form_raison_3" class="required"><span></span>Radio 3</label>
        </div>
        <label for="form_raison_3" class="required">Radio 3</label>  <!-- Label en double -->

    </div>
</div>

J’ai mis un commentaire sur la balise LABEL en double que j’aimerai ne pas avoir.

Merci de votre aide

Par défaut, un bloc *_widget ne doit pas contenir de label, puisque ça correspond au widget.

Pour ça, Symfony utilise notamment un “workaround” dans leur form_theme pour Bootstrap, que tu peux voir ici, mais voilà le code incriminé :

{% block radio_widget -%}
    {%- set parent_label_class = parent_label_class|default(label_attr.class|default('')) -%}
    {% if 'radio-inline' in parent_label_class %}
        {{- form_label(form, null, { widget: parent() }) -}}
    {% else -%}
        <div class="radio">
            {{- form_label(form, null, { widget: parent() }) -}}
        </div>
    {%- endif %}
{%- endblock radio_widget %}

En fait, ce qu’ils font, c’est qu’ils n’affichent pas le widget. Ils affichent le label, et dedans, ils rajoutent, dans le troisième argument, une option widget qui permet de récupérer le radio_widget parent (oui, dans un form theme, quand on surcharge un bloc, on peut utiliser parent(), comme dans n’importe quel template twig).

Tu devrais prendre exemple sur le code du template de Symfony ;)

1 J'aime
Human Coders - Le centre de formation recommandé par les développeur·se·s pour les développeur·se·s