20 Stimmen

Symfony2 - Wie fügt man Label und Eingabefeld für Kontrollkästchen/Radiobuttons in einer Zeile hinzu?

In meinem Formular habe ich einige Kontrollkästchen, aber standardmäßig habe ich:

  • das erste Optionsfeld
  • das erste Etikett
  • das zweite Optionsfeld
  • das Etikett

Hier ist der HTML-Code, der von Symfony2 generiert wurde:

Was ich möchte ist:

das erste Optionsfeld das erste Etikett
das zweite Optionsfeld das zweite Etikett

Der HTML-Code wäre:

Ich denke, ich muss den choice_widget überschreiben, weiß aber nicht, wie ich input und label in die gleiche Zeile einfügen soll.

Hier ist der choice_widget, den ich überschreiben muss:

    {% block choice_widget %}
        {% spaceless %}
            {% if expanded %}

                   {% for child in form %}
                      {{ form_widget(child) }}  {{ form_label(child) }}
                   {% endfor %}

            {% else %}

                {% if empty_value is not none %}
                     {{ empty_value|trans }}
                {% endif %}
                {% if preferred_choices|length > 0 %}
                    {% set options = preferred_choices %}
                    {{ block('widget_choice_options') }}
                        {% if choices|length > 0 and separator is not none %}
                            {{ separator }}
                       {% endif %}
                {% endif %}
                {% set options = choices %}
                {{ block('widget_choice_options') }}

           {% endif %}
      {% endspaceless %}
   {% endblock choice_widget %}

1voto

Vincent Pazeller Punkte 1248

In Symfony 3+ können Sie der Form ganz einfach die Klasse radio-inline über label_attr zuweisen:

$builder->add('type', ChoiceType::class, [
    'expanded' => true, 
    'label_attr' => ['class' => 'radio-inline']
]);

Es ist nicht notwendig, benutzerdefinierte Widgets zu erstellen...

Sie können diese Dinge erraten, indem Sie sich das bootstrap_4_layout.html.twig ansehen, das von Symfony in Ihrem vendor-Verzeichnis angeboten wird (src/Symfony/Bridge/Twig/Resources/views/Form/bootstrap_4_layout.html.twig)

Hoffentlich hilft das.

0voto

JimmyDix Punkte 81

In Symfony 2.4 funktioniert dies nicht ganz wie erwartet.

{% block checkbox_widget %}
{% spaceless %}
  {{ label|trans }}
{% endspaceless %}
{% endblock checkbox_widget %}

... das Label ist nicht verfügbar. Sie müssen folgendes hinzufügen:

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

Also eine vollständige Lösung wäre:

{% block checkbox_widget %}
{% if label is empty %}
  {% set label = name|humanize %}
{% endif %}
{% spaceless %}
  {{ label|trans }}
{% endspaceless %}
{% endblock checkbox_widget %}

0voto

Yes Barry Punkte 9228

Ein Label ist ziemlich trivial, also habe ich persönlich vorgezogen, es manuell zu rendern.

Schnell und unsauber in deinem Twig:

    {{ form_widget(form.field) }} Feldetikett

Ich hätte es gut gefunden, wenn Symfony eine einfachere Lösung dafür gehabt hätte, aber egal.

Natürlich sind die obigen Antworten vielleicht eleganter und so weiter. ;)

-1voto

virginie Punkte 1

Sie können die form_row-Funktion wie folgt überschreiben (angepasst, um zum Tempellabel / Kontrollkästchen von Twitter Bootstrap zu passen): (in diesem Beispiel ist es "Checkbox", aber ich denke, mit "Radio" funktioniert es genauso)

{% 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|trans({}, translation_domain) }}
           {{ block('checkbox_widget') }}

    {% else %}
        {{ parent() }}
    {% endif %}
{% endspaceless %}
{% endblock field_row %}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X