web-dev-qa-db-fra.com

Symfony2 Form Builder - Supprimer une étiquette, en faire un espace réservé

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>
37
Josh Wa

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, '') }}
19
Fo.

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,
     )
);
59
Titi

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 %}
5
Léo Benoist

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.

3
user3557131

Symfony 2.8 et supérieur

  1. Supprimer le formulaire

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

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 ().

3
Jessica

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();
3
Nat Naydenova

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 .

2
Quolonel Questions

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>

Documentation connexe

1

Pour résumer:

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):

  1. Supprimer le formulaire

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

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'];
    }
}
0
Tarjei Huse

Formulaires Bootstrap

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

 enter image description here

Cela fonctionne avec les traductions

0
Daniel