it-swarm.com.de

Symfony2 Form Builder - Beschriftung entfernen, Platzhalter einfügen

Ich spiele mit dem Form Builder von Symfony und finde keine Möglichkeit, ein Label nicht anzuzeigen. Außerdem möchte ich tatsächlich einen Platzhalter für jedes Eingabefeld festlegen. Ist das möglich? Ich habe ein bisschen recherchiert und nichts gefunden.

Meine Form:

<form action="{{ path('searchPeople') }}" method="post" class="form-inline">
    {{ form_errors(form) }}

    {{ form_row(form.first_name) }}
    {{ form_row(form.last_name) }}

    {{ form_rest(form) }}

    <br />
    <button type="submit" class="btn btn-primary" /><i class="icon-search"></i>Search</button>
</form>

EDIT: Gelöst! Alle unten aufgeführten Lösungen haben geholfen, aber ich habe die Antwort auf den ersten hilfreichen Kommentar gegeben. Ich weiß die Hilfe zu schätzen. Für alle anderen, die auf dieses Problem stoßen, ist dies mein endgültiger Arbeitscode:

<form action="{{ path('searchPeople') }}" method="post" class="form-inline">
    {{ form_errors(form) }}

    {{ form_errors(form.first_name) }}
    {{ form_widget(form.first_name, {'attr': {'placeholder': 'First Name'} }) }}

    {{ form_errors(form.last_name) }}
    {{ form_widget(form.last_name, {'attr': {'placeholder': 'Last Name'} }) }}

    {{ form_rest(form) }}

    <br />
    <button type="submit" class="btn btn-primary" /><i class="icon-search icon-white"></i>Search</button>
</form>
37
Josh Wa

Wenn Sie das Feld mit form_rest ausgeben, müssen Sie die Bezeichnung für das Feld im Form Builder mit etwa auf "false" setzen

$builder->add('first_name', 'text', array(
    'label' => false,
));

Wenn Sie die Felder einzeln ausgeben, können Sie die form_label für dieses Feld in der Zweigvorlage weglassen oder eine leere Zeichenfolge festlegen.

{{ form_label(form.first_name, '') }}
19
Fo.

Ich weiß, dass es bereits beantwortet wurde, kann jedoch jemandem helfen, der eine andere Lösung für Platzhalter sucht, wenn Sie nichts an Ihrer Zweigvorlage ändern möchten:

$builder->add(
    'name',
    'text', 
     array(
        'attr' => array(
             'placeholder' => 'Your name',
        ),
        'label' => false,
     )
);
59
Titi

Konvertieren Sie das Label in einen Platzhalter 

{% use 'form_div_layout.html.twig' with widget_attributes as base_widget_attributes %}
{% block widget_attributes %}
    {% set attr = {'placeholder': label|trans({}, translation_domain)} %}
    {{- block('base_widget_attributes') -}}
{% endblock widget_attributes %}
5
Léo Benoist

für andere, die auf diese Label-Frage stoßen: Sie können das form_row-Tag für jedes gewünschte Formular mit einem Formular-Design überschreiben. Ich empfehle jedoch, es für die Seitenleseoptimierung nur unsichtbar zu setzen. mein Beispiel mit bootstrap: 

{% block form_row %}
    {% spaceless %}
            {{ form_label(form, null, {'label_attr': {'class': 'sr-only'}}) }}
            {{ form_errors(form) }}
            {{ form_widget(form) }}
    {% endspaceless %}
{% endblock form_row %}

vergessen Sie nicht, Ihr formtheme in config.yml und template einzuschließen.

3
user3557131

Symfony 2.8 und höher

  1. Entfernen Sie form_label

    {% block form_row %}
    <div>
        {{ form_errors(form) }}
        {{ form_widget(form) }}
    </div>
    {% endblock form_row %}
    
  2. Platzhalterattribut hinzufügen

    {% block form_widget_simple %}
        {% set type = type|default('text') %}
        <input placeholder="{{ translation_domain is same as(false) ? label : label|trans({}, translation_domain) }}" type="{{ type }}" {{ block('widget_attributes') }} {% if value is not empty %}value="{{ value }}" {% endif %}/>
    {% endblock form_widget_simple %}
    
3
Mick

Ich habe das kürzlich gemacht! :) Sie möchten eine neue Feldvorlage für form_row und eine für form_widget erstellen. Entfernen Sie dann den form_label-Teil und fügen Sie Ihren Platzhalter hinzu. 

http://symfony.com/doc/current/cookbook/form/form_customization.html

Sie können dies pro Feld tun oder für alle festlegen.

Oder Sie können das Entfernen von form_label aus der form_row-Vorlage auch überspringen, und tun Sie einfach form_widget (), wo Sie gerade form_row () aufrufen.

3
Jessica

Für diejenigen, die form_row NICHT verwenden, können Sie den Platzhalter immer direkt als Attribut hinzufügen, wenn Sie die Eingabe zum Builder hinzufügen. So wie:

$task = new Task();
$form = $this->createFormBuilder($task)
            ->add('first_name', 'text', array(
                      'required' => true,
                      'trim' => true,
                      'attr' => array('placeholder' => 'Lorem Ipsum')
        )->getForm();
3
Nat Naydenova

Erweiterung auf Léos Antwort:

{% use 'form_div_layout.html.twig' %}
{% block widget_attributes %}
{% spaceless %}
    {% set attr = attr|merge({'placeholder': label}) %}
    {{ parent() }}
{% endspaceless %}
{% endblock widget_attributes %}

Der trans-Filter wurde entfernt, da er im übergeordneten enthalten ist.

2

Sie müssen das Formular manuell rendern.

Hier ist ein Beispiel:

<form id="form-message" action="{{ path('home') }}" method="post" {{ form_enctype(form) }}>
  {{ form_label(form.name) }}
  {% if form_errors(form.name) %}
    <div class="alert alert-error">
      {{ form_errors(form.name) }}
    </div>
  {% endif %}
  {{ form_widget(form.name) }}
  {{ form_row(form._token) }}
  <input type="submit" class="btn" value="Submit">
</form>

Dazugehörige Dokumentation

1

Um es zusammenzufassen:

  • Die Antwort von Titi ist die einfachste;

  • Mick , Léo & Quolonel s Antworten sind am effektivsten, aber unvollständig (für Symfony> 2.6):

Wenn Sie die label_format-Option in Ihrem *Type::configureOptions verwenden, funktioniert ihre Lösung nicht. Sie müssen den Inhalt des form_label-Blocks hinzufügen, um alle Etikettierungsmöglichkeiten zu verarbeiten .__ Die vollständige und effektivste Antwort (Code verwendet mit Symfony 3.3):

  1. Entfernen Sie form_label

    {% block form_row %}
    <div>
        {{ form_errors(form) }}
        {{ form_widget(form) }}
    </div>
    {% endblock form_row %}
    
  2. Bearbeiten Sie den widget_attribute-Block

    {% block widget_attributes %}
        {% spaceless %}
            {% if label is not same as(false) -%}
                {% if label is empty -%}
                    {%- if label_format is not empty -%}
                        {% set label = label_format|replace({
                            '%name%': name,
                            '%id%': id,
                        }) %}
                    {%- else -%}
                        {% set label = name|humanize %}
                    {%- endif -%}
                {%- endif -%}
    
                {% set attr = attr|merge({'placeholder': label}) %}
            {%- endif -%}
    
            {{ parent() }}
        {% endspaceless %}
    {% endblock widget_attributes %}
    

Anmerkungen :

  • Übersetzen Sie die Etiketten nicht in den widget_attributes-Block, da sie sonst als fehlende Übersetzungen angezeigt werden.

  • Die Lösung funktioniert nicht für Kontrollkästchen oder Optionsfelder. Sie möchten Folgendes hinzufügen:

    {%- block checkbox_widget -%}
        {{ parent() }}
        {{- form_label(form) -}}
    {%- endblock checkbox_widget -%}
    
0
Cethy

Sie können die Beschriftungen auch in das Platzhalterattribut kopieren, bevor Sie das Formular rendern:

$formView = $form->createView();

foreach($formView->getIterator() as $item) {
    /** @var $item FormView */
    if ($item->vars['label']) {
        $item->vars['attr']['placeholder'] =$item->vars['label'];
    }
}
0
Tarjei Huse

Bootstrap-Formulare

In meinem Fall ist es am besten, Mix aswers von @Cethy und @Quolonel Questions zu beantworten

{% form_theme form _self %}
{% use 'bootstrap_4_layout.html.twig' %}

{% block widget_attributes %}          {#   set placeholder   #}
    {% spaceless %}
        {% set attr = attr|merge({'placeholder': label}) %}
        {{ parent() }}
    {% endspaceless %}
{% endblock widget_attributes %}

{% block form_row %}                   {#   remove label   #}
    <div class="form-group">
        {{ form_errors(form) }}
        {{ form_widget(form) }}
    </div>
{% endblock form_row %}

Es sieht wie folgt aus

 enter image description here

Es funktioniert mit Übersetzungen

0
Daniel