2013-06-07 14 views
33

Ich spiele mit dem Form Builder von Symfony, und ich finde keine Möglichkeit, kein Label anzuzeigen. Außerdem bin ich daran interessiert, für jedes Eingabefeld einen Platzhalter zu setzen. Ist das möglich? Ich habe ein wenig recherchiert und nichts gefunden.Symfony2 Form Builder - Remove label, mache Platzhalter

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 folgenden Lösungen haben geholfen, aber ich habe die Antwort auf den ersten hilfreichen Kommentar gegeben. Ich schätze all die Hilfe. Für jeden anderen, der darauf stößt, ist dies mein letzter 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> 
+0

möglich Duplikat [Hinzufügen eines Wertes zu einer Textbox erzeugt auf Symfony 2] (:

  • Die Lösung funktioniert nicht für Kontrollkästchen und Radio-Buttons, werden Sie so etwas wie hinzufügen möchten http://stackoverflow.com/questions/14633096/adding-a-value-to-a-textbox-generated-on-symfony-2) – cheesemacfly

  • +8

    Sie können einen Platzhalter mit '$ Builder-> hinzufügen ('first_name', 'text', ['attr' => ['placeholder' => 'zB John']]); ' – chh

    +0

    Danke @chh - Es funktioniert gut für mich. ! –

    Antwort

    16

    Wenn Sie das Feld sind die Ausgabe mit form_rest Sie haben die Bezeichnung für das Feld auf false in Form Builder mit so etwas wie

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

    einstellen Wenn Sie die Felder einzeln ausgegeben, können Sie die form_label für das Feld in dem Zweig Vorlage weglassen kann, oder es auf einen leeren gesetzt Zeichenfolge.

    {{ form_label(form.first_name, '') }} 
    
    +0

    Vielen Dank für Ihren Kommentar. Ich habe beide Vorschläge ausprobiert, und das Etikett wird weiterhin angezeigt. Ich bin mir nicht sicher, warum :( –

    +1

    oben bearbeitet, versuchen Sie 'Label' => falsch –

    +0

    Ich habe es funktioniert, indem Sie einfach die form_label Linie vollständig aus der Zweig-Vorlage entfernen. Danke. –

    3

    Ich tat dies kürzlich! :) 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 es pro Feld tun, oder legen Sie es für alle von ihnen.

    Oder Sie können auch überspringen die die form_label aus der form_row Vorlage zu entfernen und nur noch form_widget(), wo Sie derzeit form_row() aufrufen

    1

    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> 
    

    Related documentation

    3

    für andere, die sich über dieses Label-Frage kommen: Sie Formular Thema verwenden könnte die form_row Tag außer Kraft zu setzen für jede Form Sie wollen. Ich empfehle jedoch, es nur für die Seitenleser-Optimierung unsichtbar zu machen. mein beispiel mit bootstrap:

    vergessen sie nicht, ihre formtheme in config.yml und template einzuschließen.

    5

    Convert Label

    {% 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 %} 
    
    2

    Erweiterung auf Léo Antwort auf Platzhalter:

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

    trans Filter wurde entfernt, weil es included in the parent ist.

    52

    Ich weiß, es ist schon beantwortet, aber vielleicht jemand helfen, der für Platzhalter für eine andere Lösung sucht, wenn Sie wollen nicht alles in Ihrem Zweig Vorlage ändern:

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

    bearbeitet haben Das ist eigentlich die beste Lösung! – Roman

    2

    Für die nicht mit form_row Sie können den Platzhalter immer direkt als Attribut hinzufügen, wenn Sie dem Builder die Eingabe hinzufügen. Wie so:

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

    Symfony 2.8 & oben

    1. entfernen form_label

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

      {% 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 %} 
      
    0

    Um resümiert:

    • Titi ‚s Antwort die einfachste ist;

    • Mick, Léo & Quolonel ‚s Antworten sind die effektivste, aber unvollständig sind (für symfony> 2.6):

    Wenn Sie die label_format Option in Ihrem *Type::configureOptions verwenden, deren Lösung nicht funktioniert. Sie müssen den Inhalt des Blocks form_label hinzufügen, um alle Beschriftungsmöglichkeiten zu handhaben. Die volle & effektivste Antwort (Code verwendet w/symfony 3.3):

    1. entfernen form_label

      {% block form_row %} 
      <div> 
          {{ form_errors(form) }} 
          {{ form_widget(form) }} 
      </div> 
      {% endblock form_row %} 
      
    2. Bearbeiten der 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 %} 
      

    Hinweise:

    • Sie die Etiketten in den widget_attributes Block nicht übersetzen, da sie sich als fehlende Übersetzungen erscheinen.

      {%- block checkbox_widget -%} 
          {{ parent() }} 
          {{- form_label(form) -}} 
      {%- endblock checkbox_widget -%} 
      
    Verwandte Themen