Symfony2 - comment mettre l'étiquette et l'entrée pour les cases à cocher / radios dans une même ligne?

dans ma forme j'ai quelques cases à cocher, mais par défaut, j'ai:

  • le premier widget radio
  • la première étiquette
  • le second widget radio
  • libellé

voici le code html généré par SYmfony2:

  <div>
    <input ...>
    <label ...></label>
    <input ...>
    <label ...></label>
  </div>

je veux est :



le premier widget radio le premier label

le deuxième widget radio le deuxième étiquette

le code html serait :

  <label .....><input ....></label>

je pense que je dois remplacer le choice_widget mais ne sais pas comment mettre de la saisie et de l'étiquette sur la même ligne

voici le choice_widget que je vais devoir annuler:

    {% block choice_widget %}
        {% spaceless %}
            {% if expanded %}
                <div {{ block('widget_container_attributes') }}>
                   {% for child in form %}
                      {{ form_widget(child) }}  {{ form_label(child) }}
                   {% endfor %}
                </div>
            {% else %}
                <select {{ block('widget_attributes') }}{% if multiple %} multiple="multiple"{% endif %}>
                {% if empty_value is not none %}
                     <option value="">{{ empty_value|trans }}</option>
                {% endif %}
                {% if preferred_choices|length > 0 %}
                    {% set options = preferred_choices %}
                    {{ block('widget_choice_options') }}
                        {% if choices|length > 0 and separator is not none %}
                            <option disabled="disabled">{{ separator }}</option>
                       {% endif %}
                {% endif %}
                {% set options = choices %}
                {{ block('widget_choice_options') }}
                </select>
           {% endif %}
      {% endspaceless %}
   {% endblock choice_widget %}
19
demandé sur Elnur Abdurrakhimov 0000-00-00 00:00:00

8 réponses

j'ai eu le même problème, et j'ai été incapable de trouver une solution j'ai donc travaillé sur ma propre. Vous avez raison de dire que vous devez Outrepasser le {% block choice_widget %} bloc. La première étape consiste à supprimer le {{ form_label(child) }} de la ligne {% if expanded %} section, qui imprime une étiquette distincte.

{% block choice_widget %}
{% spaceless %}
    {% if expanded %}
        <div {{ block('widget_container_attributes') }}>
        {% for child in form %}
            {{ form_widget(child) }}
        {#  {{ form_label(child) }} <--------------------- remove this line #}  
        {% endfor %}
        </div>
    {% else %}
    <select {{ block('widget_attributes') }}{% if multiple %} multiple="multiple"{% endif %}>
        {% if empty_value is not none %}
            <option value="">{{ empty_value|trans }}</option>
        {% endif %}
        {% if preferred_choices|length > 0 %}
            {% set options = preferred_choices %}
            {{ block('widget_choice_options') }}
            {% if choices|length > 0 and separator is not none %}
                <option disabled="disabled">{{ separator }}</option>
            {% endif %}
        {% endif %}
        {% set options = choices %}
        {{ block('widget_choice_options') }}
    </select>
    {% endif %}
{% endspaceless %}
{% endblock choice_widget %}

Maintenant, vous aurez juste besoin de gérer l'impression de l'étiquette dans le {% block checkbox_widget %} bloc.

{% block checkbox_widget %}
{% spaceless %}
    <label  for="{{ id }}"><input type="checkbox" {{ block('widget_attributes') }}{% if value is defined %} value="{{ value }}"{% endif %}{% if checked %} checked="checked"{% endif %} />{{ label|trans }}</label>
{% endspaceless %}
{% endblock checkbox_widget %}

Vous aurez besoin de faire de même pour {% block radio_widget %} puisqu'il n'y aurait pas autrement d'étiquette maintenant.

{% block radio_widget %}
{% spaceless %}
    <label  for="{{ id }}"><input type="radio" {{ block('widget_attributes') }}{% if value is defined %} value="{{ value }}"{% endif %}{% if checked %} checked="checked"{% endif %} />{{ label|trans }}</label>
{% endspaceless %}
{% endblock radio_widget %}
29
répondu Bob F. 2012-08-19 23:12:28

avec L'aide D'Alberto Gaona et James, Symfony 2.4 solution correcte pour intégrer la radio BS3 et les cases à cocher est comme suit:

À votre avis, vous avez :

{% form_theme form 'AcmeDemoBundle:Form:fields.html.twig' %}

// A radio or checkbox input
{{ form_widget(form.example) }}

puis dans vos champs.HTML.brindille (qui remplace https://github.com/symfony/symfony/blob/master/src/Symfony/Bridge/Twig/Resources/views/Form/form_div_layout.html.twig ; voir http://symfony.com/doc/current/cookbook/form/form_customization.html)

{# src/Acme/DemoBundle/Resources/views/Form/fields.html.twig #}

{% block choice_widget_expanded %}
{% spaceless %}
    <div {{ block('widget_container_attributes') }}>
    {% for child in form %}
        {% if multiple %}
            <div class="checkbox">
        {% else %}
            <div class="radio">
        {% endif %}

        {{ form_widget(child) }}
        </div>
    {% endfor %}
    </div>
{% endspaceless %}
{% endblock choice_widget_expanded %}

{% block checkbox_widget %}
{% spaceless %}
{% if label is empty %}
    {% set label = name|humanize %}
{% endif %}
    <label  for="{{ id }}">
        <input type="checkbox" {{ block('widget_attributes') }}{% if value is defined %} value="{{ value }}"{% endif %}{% if checked %} checked="checked"{% endif %} />{{ label|trans({}, translation_domain) }}
    </label>
{% endspaceless %}
{% endblock checkbox_widget %}

{% block radio_widget %}
{% spaceless %}
{% if label is empty %}
    {% set label = name|humanize %}
{% endif %}
    <label  for="{{ id }}">
        <input type="radio" {{ block('widget_attributes') }}{% if value is defined %} value="{{ value }}"{% endif %}{% if checked %} checked="checked"{% endif %} />{{ label|trans({}, translation_domain) }}
    </label>
{% endspaceless %}
{% endblock radio_widget %}
13
répondu Xavier13 2014-04-22 10:00:37

NOTE: mise à jour de la solution Bob F pour Symfony 2.3 (voir https://github.com/symfony/symfony/blob/2.3/src/Symfony/Bridge/Twig/Resources/views/Form/form_div_layout.html.twig):

Remplacer choice_widget_expanded:

{% block choice_widget_expanded %}
{% spaceless %}
    <div {{ block('widget_container_attributes') }}>
    {% for child in form %}
        {{ form_widget(child) }}
    {% endfor %}
    </div>
{% endspaceless %}
{% endblock choice_widget_expanded %}

Remplacer case (bootstrap style):

{% block checkbox_widget %}
{% spaceless %}
    <label  for="{{ id }}" class="checkbox {% if checked %}checked{% endif %}" ><span class="icons"><span class="first-icon fui-checkbox-unchecked"></span><span class="second-icon fui-checkbox-checked"></span></span><input type="checkbox" {{ block('widget_attributes') }}{% if value is defined %} value="{{ value }}"{% endif %}{% if checked %} checked="checked"{% endif %} />{{ label|trans }}</label>
{% endspaceless %}
{% endblock checkbox_widget %}

Remplacer radiobutton

{% block radio_widget %}
{% spaceless %}
    <label  for="{{ id }}"><input type="radio" {{ block('widget_attributes') }}{% if value is defined %} value="{{ value }}"{% endif %}{% if checked %} checked="checked"{% endif %} />{{ label|trans }}</label>
{% endspaceless %}
{% endblock radio_widget %}
11
répondu Alberto Gaona 2013-10-15 14:35:14

Lorsqu'une étiquette est rendu, il comprendra une for attribut - cet attribut relie le labelinput -voir la documentation sur label ici changer la sortie à ce que vous avez suggéré est juste une autre façon de lier le label et input

si vous voulez que l'étiquette s'affiche à la gauche de l'entrée, vous devez changer votre modèle en:

{% for child in form %}
   <div>
      {{ form_label(child) }}  {{ form_widget(child) }} 
   </div>
{% endfor %}

qui rend le label avant input et puis cela crée suivants sortie

<div>
  <div>
    <label ...></label>
    <input ...>
  </div>
  <div>
    <label ...></label>
    <input ...>
  </div>
</div>

vous pouvez alors appliquer un certain style CSS pour le faire afficher en ligne:

​div label {
    display: inline-block;
    width: 200px;
}​

par défaut-sans CSS le label ligne avant le input avec cette mise en page HTML - mais le inline-block permet d'utiliser les width attribut pour s'assurer que tous les champs sont alignés correctement-quelle que soit la longueur du texte de l'étiquette

exemple ici

2
répondu ManseUK 2012-07-17 07:26:37

mettre l'entrée du formulaire dans la balise de l'étiquette résulterait en HTML cassé.

Quel est votre objectif? Si vous cherchez simplement à faire apparaître l'étiquette et l'entrée sur la même ligne dans le navigateur, alors vous pouvez utiliser css:

input, label {
 display: inline;
}
1
répondu MrGlass 2012-07-17 11:32:44

Dans Symfony 2.4, cela ne fonctionne pas tout à fait comme prévu.

{% block checkbox_widget %}
{% spaceless %}
  <label  for="{{ id }}"><input type="checkbox" {{ block('widget_attributes') }}{% if value is defined %} value="{{ value }}"{% endif %}{% if checked %} checked="checked"{% endif %} />{{ label|trans }}</label>
{% endspaceless %}
{% endblock checkbox_widget %}

...l'étiquette n'est pas disponible. Vous devez ajouter le code suivant:

{% if label is empty %}
  {% set label = name|humanize %}
{% endif %}

Donc une solution complète est:

{% block checkbox_widget %}
{% if label is empty %}
  {% set label = name|humanize %}
{% endif %}
{% spaceless %}
  <label  for="{{ id }}"><input type="checkbox" {{ block('widget_attributes') }}{% if value is defined %} value="{{ value }}"{% endif %}{% if checked %} checked="checked"{% endif %} />{{ label|trans }}</label>
{% endspaceless %}
{% endblock checkbox_widget %}
0
répondu James 2014-04-04 02:00:31

Une étiquette est assez trivial, donc j'ai personnellement préféré rendre manuellement.

Rapide et sale dans votre twig:

<label for="field">
    {{ form_widget(form.field) }} Field Label
</label>

J'aurais aimé si Symfony avait eu une solution plus simple pour ceci mais peu importe.

bien sûr, les réponses ci-dessus sont peut-être plus élégantes et ce n'est pas le cas. ;)

0
répondu Yes Barry 2017-04-25 16:53:16

Vous pouvez outrepasser la fonction form_row comme cela (modifié pour correspondre à l'étiquette de temple / case à cocher de twitter bootstrap ) : (dans cet exemple c'est" checkbox "mais je pense qu'avec" radio " ça marche pareil)

{% extends 'form_div_layout.html.twig' %}

{% block field_row %}
{% spaceless %}
    {% if 'checkbox' in types %}
        {% if not compound %}
            {% set label_attr = label_attr|merge({'for': id}) %}
        {% endif %}
        {% if required %}
            {% set label_attr = label_attr|merge({'class': (label_attr.class|default('') ~ ' required')|trim}) %}
        {% endif %}
        {% if label is empty %}
            {% set label = name|humanize %}
        {% endif %}
        <label class="checkbox" {% for attrname, attrvalue in label_attr %} {{ attrname }}="{{ attrvalue }}"{% endfor %}>{{ label|trans({}, translation_domain) }}
           {{ block('checkbox_widget') }}
        </label>
    {% else %}
        {{ parent() }}
    {% endif %}
{% endspaceless %}
{% endblock field_row %}
-1
répondu virginie 2012-08-02 14:23:06