Je joue avec le générateur de formulaires de Symfony et je ne trouve pas le moyen de ne pas afficher d'étiquette. De plus, je suis intéressé par la définition d’un espace réservé pour chaque zone de saisie. Est-ce possible? J'ai un peu cherché et rien trouvé.
Ma fiche:
<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: résolu! Toutes les solutions ci-dessous ont aidé, mais j'ai donné la réponse au principal commentaire utile. J'apprécie toute l'aide. Pour tout le monde qui rencontre cela, ceci est mon code de travail final:
<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>
Si vous exportez le champ avec form_rest, vous devez définir le libellé du champ sur false dans le générateur de formulaire, avec quelque chose comme:
$builder->add('first_name', 'text', array(
'label' => false,
));
Si vous exportez les champs individuellement, vous pouvez omettre le label_formulaire pour ce champ dans le modèle de brindille ou le définir sur une chaîne vide.
{{ form_label(form.first_name, '') }}
Je sais qu'il a déjà répondu à votre question, mais pourrait aider quelqu'un qui recherche une solution différente pour les espaces réservés si vous ne souhaitez rien modifier dans votre modèle de brindille:
$builder->add(
'name',
'text',
array(
'attr' => array(
'placeholder' => 'Your name',
),
'label' => false,
)
);
Convertir une étiquette en espace réservé
{% 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 %}
pour les autres qui tombent sur cette question-étiquette: Cependant, je recommande de le définir simplement pour l'optimisation du lecteur de page. mon exemple avec bootstrap:
{% block form_row %}
{% spaceless %}
{{ form_label(form, null, {'label_attr': {'class': 'sr-only'}}) }}
{{ form_errors(form) }}
{{ form_widget(form) }}
{% endspaceless %}
{% endblock form_row %}
n'oubliez pas d'inclure votre formulaire dans les fichiers config.yml et template.
Supprimer le formulaire
{% block form_row %}
<div>
{{ form_errors(form) }}
{{ form_widget(form) }}
</div>
{% endblock form_row %}
Ajouter un attribut d'espace réservé
{% 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 %}
Je l'ai fait récemment! :) Vous voudrez créer un nouveau modèle de champs, pour form_row et un pour form_widget. Ensuite, supprimez la partie form_label et ajoutez votre espace réservé.
http://symfony.com/doc/current/cookbook/form/form_customization.html
Vous pouvez le faire par champ ou le définir pour tous.
Sinon, vous pouvez également ignorer la suppression de l’échantillon_formulaire du modèle form_row et simplement effectuer l’opération form_widget () à l’appel que vous appelez actuellement form_row ().
Pour ceux qui n'utilisent PAS form_row
, vous pouvez toujours ajouter un espace réservé en tant qu'attribut directement lors de l'ajout de l'entrée au générateur. Ainsi:
$task = new Task();
$form = $this->createFormBuilder($task)
->add('first_name', 'text', array(
'required' => true,
'trim' => true,
'attr' => array('placeholder' => 'Lorem Ipsum')
)->getForm();
Développer la réponse de Léo:
{% use 'form_div_layout.html.twig' %}
{% block widget_attributes %}
{% spaceless %}
{% set attr = attr|merge({'placeholder': label}) %}
{{ parent() }}
{% endspaceless %}
{% endblock widget_attributes %}
Le filtre trans
a été supprimé car il est inclus dans le parent .
Vous devez rendre le formulaire manuellement.
Voici un exemple:
<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>
Pour résumer:
La réponse de Titi est la plus simple;
Mick , Léo & Les réponses de Quolonel sont les plus efficaces mais sont incomplètes (pour symfony> 2.6):
Si vous utilisez l'option label_format
dans votre *Type::configureOptions
, leur solution ne fonctionne pas. Vous devez ajouter le contenu du bloc form_label
pour gérer toutes les possibilités d'étiquette . La réponse complète et la plus efficace (code utilisé avec symfony 3.3):
Supprimer le formulaire
{% block form_row %}
<div>
{{ form_errors(form) }}
{{ form_widget(form) }}
</div>
{% endblock form_row %}
Editer le bloc widget_attribute
{% 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 %}
Remarques :
Ne traduisez pas les étiquettes dans le bloc widget_attributes
, sinon elles apparaîtront comme des traductions manquantes.
La solution ne fonctionne pas pour les cases à cocher ou les boutons radio, vous voudrez ajouter quelque chose comme:
{%- block checkbox_widget -%}
{{ parent() }}
{{- form_label(form) -}}
{%- endblock checkbox_widget -%}
Vous pouvez également copier les étiquettes dans l'attribut d'espace réservé avant de rendre le formulaire:
$formView = $form->createView();
foreach($formView->getIterator() as $item) {
/** @var $item FormView */
if ($item->vars['label']) {
$item->vars['attr']['placeholder'] =$item->vars['label'];
}
}
Dans mon cas, le mieux est de mélanger les réponses de @Cethy et de @Quolonel
{% 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 %}
Il ressemble à ce qui suit
Cela fonctionne avec les traductions