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>
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, '') }}
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,
)
);
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 %}
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.
Entfernen Sie form_label
{% block form_row %}
<div>
{{ form_errors(form) }}
{{ form_widget(form) }}
</div>
{% endblock form_row %}
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 %}
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.
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();
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.
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>
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):
Entfernen Sie form_label
{% block form_row %}
<div>
{{ form_errors(form) }}
{{ form_widget(form) }}
</div>
{% endblock form_row %}
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 -%}
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'];
}
}
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
Es funktioniert mit Übersetzungen