Comment faire pour personnaliser le rendu de formulaire


Table des matières

Référence
Formulaire Basics rendu
Quels sont les thèmes de formulaire?
Connaître le bloc à personnaliser
Formulaire Thématisation
Formulaire Thématisation dans Twig
Méthode 1: A l'intérieur du même modèle que le formulaire
Méthode 2: à l'intérieur d'un modèle séparé
Formulaire Thématisation en PHP
Référencement blocs de base des Forms (Twig spécifique)
Référencement blocs à l'intérieur du même modèle que le formulaire
Référencement blocs de base à partir d'un modèle externe
Faire la demande à l'échelle de la personnalisation
Twig
PHP
Comment personnaliser un champ individuel
Autres personnalisations courantes
Personnalisation de sortie d'erreur
Personnalisation de la "Form Row"
Ajout d'un Asterisk "Required" pour les étiquettes de champs
Ajout "aide" messages

Référence

Symfony vous donne une grande variété de façons de personnaliser la façon dont une forme est rendue. Dans ce guide, vous allez apprendre à personnaliser chaque partie possible de votre formulaire avec aussi peu d'effort que possible si vous utilisez PHP en tant que Twig ou votre moteur de templates.

Formulaire Basics rendu

Rappelez-vous que le widget étiquette, d'erreur et HTML d'un champ de formulaire peuvent être facilement rendu en utilisant la fonction Twig form_row ou la méthode d'assistance helper PHP:

Version Twig

{{ form_row(form.age) }}

Version Php

<?php echo $view['form']->row($form['age']) }} ?>

Vous pouvez également rendre chacune des trois parties du champ de façon individuelle:

Version Twig

<div>
    {{ form_label(form.age) }}
    {{ form_errors(form.age) }}
    {{ form_widget(form.age) }}
</div>

Version Php

<div>
    <?php echo $view['form']->label($form['age']) }} ?>
    <?php echo $view['form']->errors($form['age']) }} ?>
    <?php echo $view['form']->widget($form['age']) }} ?>
</div>

Dans les deux cas, la forme d'étiquettes, d'erreurs et de widgets HTML sont rendues en appliquant un ensemble de balisage qui est livré en standard avec Symfony. Par exemple, les deux modèles ci-dessus rendrait:

<div>
    <label for="form_age">Age</label>
    <ul>
        <li>This field is required</li>
    </ul>
    <input type="number" id="form_age" name="form[age]" />
</div>

Pour prototyper rapidement et tester un formulaire, vous pouvez rendre la totalité du formulaire avec une seule ligne:

Version Twig

{{ form_widget(form) }}

Version Php

<?php echo $view['form']->widget($form) }} ?>

Le reste de cette recette vous explique comment chaque partie du balisage du formulaire peut être modifié à plusieurs niveaux différents. Pour plus d'informations sur le rendu sous forme en général, voir le rendu d'un formulaire dans un modèle

Quels sont les thèmes de formulaire?

Symfony utilise des fragments de formulaire - un petit morceau d'un modèle qui rend une partie seulement d'une forme - pour rendre chaque partie d'un formulaire - étiquettes sur le terrain, les erreurs, les champs de saisie de texte, select tags, etc...

Les fragments sont définis comme des blocs de Twig et en tant que fichiers de modèle en PHP.

Un thème n'est rien de plus qu'un ensemble de fragments que vous souhaitez utiliser lors du rendu d'un formulaire. En d'autres termes, si vous souhaitez personnaliser une partie de la façon dont une forme est rendue, vous allez importer un thème qui contient une personnalisation des fragments de formulaire appropriés.

Symfony est livré avec un thème par défaut ( form_div_layout.html.twig dans Twig et FrameworkBundle: Formulaire en PHP) qui définit chaque fragment nécessaire pour rendre chaque partie d'un formulaire.

Dans la section suivante, vous allez apprendre à personnaliser un thème par des raisons impérieuses tout ou partie de ses fragments.

Par exemple, lorsque le widget d'un champ de type entier est rendue, un champ de numéro d'entrée est généré

Version Twig

{{ form_widget(form.age) }}

Version Php

<?php echo $view['form']->widget($form['age']) ?>

rend:

<input type="number" id="form_age" name="form[age]" required="required" value="33" />

En interne, Symfony utilise le fragment integer_widget pour rendre le champ. C'est parce que le type de champ est un entier qu'il vous rendra son widget (par opposition à son étiquette ou des erreurs).

Dans Twig par défaut au bloc integer_widget du modèle form_div_layout.html.twig

En PHP, il serait plutôt le fichier situé dans integer_widget.html.php localisé dans le formulaire FrameworkBundle/Resources/views/Form

L'implémentation par défaut du fragment integer_widget ressemble à ceci:

Version Twig

{% block integer_widget %}
    {% set type = type|default('number') %}
    {{ block('field_widget') }}
{% endblock integer_widget %}

Version Php

<!-- integer_widget.html.php -->

<?php echo $view['form']->renderBlock('field_widget', array('type' = > isset($type) ? $type : "number")) ?>

Comme vous pouvez le voir, ce fragment se rend un autre fragment - field_widget:

Version Twig

{% block field_widget %}
    {% set type = type|default('text') %}
    <input type="{{ type }}" {{ block('widget_attributes') }} value="{{ value }}" />
{% endblock field_widget %}

Version Php

<!-- FrameworkBundle/Resources/views/Form/field_widget.html.php -->

<input
    type="<?php echo isset($type) ? $view->escape($type) : "text" ?>"
    value="<?php echo $view->escape($value) ?>"
    <?php echo $view['form']->renderBlock('attributes') ?>
/>

Le point est, les fragments dicter la sortie HTML de chaque partie d'un formulaire. Pour personnaliser la sortie forme, vous avez juste besoin d'identifier et de remplacer le fragment correct. Un ensemble de ces personnalisations fragment de formulaire est connu comme une forme «thème». Lors du rendu d'un formulaire, vous pouvez choisir le thème qui forme (s) que vous souhaitez appliquer.

En Twig un thème est un fichier de modèle unique et les fragments sont les blocs définies dans ce fichier.

En PHP, un thème est un dossier et les fragments sont les fichiers de modèle individuels dans ce dossier.

Connaître le bloc à personnaliser

Dans cet exemple, le nom de fragment personnalisé est integer_widget parce que vous voulez remplacer le widget HTML pour tous les types de terrain entiers. Si vous avez besoin de personnaliser les champs textarea, vous personnaliser textarea_widget.

Comme vous pouvez le voir, le nom du fragment est une combinaison du type de champ et qui font partie du champ est rendu (widget par exemple, l'étiquette, erreurs, rangée). En tant que tel, pour personnaliser la façon dont les erreurs sont rendus pour seulement les champs de saisie de texte, vous devez personnaliser le fragment text_errors.

Plus généralement, cependant, vous aurez envie de personnaliser la façon dont les erreurs sont affichées dans tous les domaines. Vous pouvez faire cela en personnalisant le fragment field_errors. Cette méthode tire parti de l'héritage type de champ. Plus précisément, depuis le type de texte s'étend à partir du type de champ, la composante sous forme d'abord chercher le fragment de type spécifique (par exemple text_errors) avant de retomber à son nom fragment parent si elle n'existe pas (par exemple field_errors).

Pour plus d'informations sur ce sujet, voir fragment de formulaire

Formulaire Thématisation

Pour voir la puissance de thématisation forme, supposons que vous voulez pour enrober chaque champ de numéro d'entrée avec une balise div. La clé de cette action consiste à personnaliser le fragment integer_widget.

Formulaire Thématisation dans Twig

Lors de la personnalisation du bloc champ de formulaire dans Twig, vous avez deux options sur l'endroit où le bloc formulaire personnalisé peut vivre:

Méthode Pour Contre
A l'intérieur du même modèle que la forme Rapide et facile Ne peut pas être réutilisé dans d'autres modèles
L'intérieur d'un modèle distinct Peut être réutilisé par de nombreux modèles Nécessite un modèle supplémentaire pour être créé

Les deux méthodes ont le même effet, mais sont mieux comprises dans différentes situations.

Méthode 1: A l'intérieur du même modèle que le formulaire

La meilleure façon de personnaliser le bloc integer_widget est de personnaliser directement dans le modèle qui est effectivement rendu du formulaire.

{% extends '::base.html.twig' %}

{% form_theme form _self %}

{% block integer_widget %}
    <div class="integer_widget">
        {% set type = type|default('number') %}
        {{ block('field_widget') }}
    </div>
{% endblock %}

{% block content %}
    {# render the form #}

    {{ form_row(form.age) }}
{% endblock %}

En utilisant le formulaire spécial tag {% form_theme form _self %}, Twig regarde à l'intérieur du même modèle pour tous les blocs de forme surchargées. En supposant que le champ est un champ form.age type entier, lorsque son widget est rendue, le bloc integer_widget personnalisé sera utilisé.

L'inconvénient de cette méthode est que le bloc de formulaire personnalisé ne peut pas être réutilisé lors du rendu d'autres formes dans d'autres modèles. En d'autres termes, cette méthode est plus utile lors de personnalisations du formulaire qui sont spécifiques à un seul formulaire dans votre application. Si vous souhaitez réutiliser une personnalisation forme à travers plusieurs (ou tous) les formes de votre application, à lire pour la prochaine section.

Méthode 2: à l'intérieur d'un modèle séparé

Vous pouvez également choisir de mettre le bloc integer_widget personnalisé sous forme dans un modèle entièrement distincte. Le code et le résultat final sont les mêmes, mais vous pouvez maintenant ré-utiliser le formulaire sur la personnalisation de nombreux modèles:

{# src/Acme/DemoBundle/Resources/views/Form/fields.html.twig #}

{% block integer_widget %}
    <div class="integer_widget">
        {% set type = type|default('number') %}
        {{ block('field_widget') }}
    </div>
{% endblock %}

Maintenant que vous avez créé le bloc formulaire personnalisé, vous devez dire à Symfony de l'utiliser. A l'intérieur du modèle où vous êtes en train de rendre votre formulaire, dire à symfony d'utiliser le modèle via la balise form_theme:

{% form_theme form 'AcmeDemoBundle:Form:fields.html.twig' %}

{{ form_widget(form.age) }}

Lorsque le widget est rendu form.age, Symfony va utiliser le bloc integer_widget du nouveau modèle et la balise d'entrée sera enveloppé dans l'élément div spécifié dans le bloc personnalisé.

Formulaire Thématisation en PHP

Lorsque vous utilisez PHP en tant que moteur de templates, la seule méthode pour personnaliser un fragment est de créer un nouveau fichier de modèle - ce qui est similaire à la deuxième méthode utilisée par Twig.

Le fichier modèle doit être nommé d'après le fragment. Vous devez créer un fichier integer_widget.html.php afin de personnaliser le fragment integer_widget.

<!-- src/Acme/DemoBundle/Resources/views/Form/integer_widget.html.php -->

<div class="integer_widget">
    <?php echo $view['form']->renderBlock('field_widget', array('type' = > isset($type) ? $type : "number")) ?>
</div>

Maintenant que vous avez créé le modèle de formulaire personnalisé, vous devez dire à Symfony de l'utiliser. A l'intérieur du modèle où vous êtes en train de rendre votre formulaire, dites à Symfony d'utiliser le thème par la méthode d'assistance setTheme:

<!-- src/Acme/DemoBundle/Resources/views/Form/integer_widget.html.php -->

<div class="integer_widget">
    <?php echo $view['form']->renderBlock('field_widget', array('type' = > isset($type) ? $type : "number")) ?>
</div>

Lorsque le widget est rendu form.age, symfony va utiliser le modèle personnalisé integer_widget.html.php et la balise d'entrée sera enveloppé dans l'élément div.

Référencement blocs de base des Forms (Twig spécifique)

Jusqu'à présent, pour remplacer un bloc Form particulièr, la meilleure méthode consiste à copier le bloc par défaut de form_div_layout.html.twig, collez-le dans un modèle différent, et le personnaliser. Dans de nombreux cas, vous pouvez éviter cela en faisant référence au bloc de base.

C'est facile à faire, mais varie légèrement en fonction de vos personnalisations bloc de formulaire qui sont dans le même modèle que la forme ou un modèle distinct.

Référencement blocs à l'intérieur du même modèle que le formulaire

Importez les blocs en ajoutant une balise utilisation dans le modèle où vous êtes rendu du formulaire:

{% use 'form_div_layout.html.twig' with integer_widget as base_integer_widget %}

Maintenant, quand les blocs de form_div_layout.html.twig sont importés, le bloc est appelé integer_widget base_integer_widget. Cela signifie que lorsque vous redéfinissez le bloc integer_widget, vous pouvez référencer le balisage par défaut via base_integer_widget:

{% block integer_widget %}
    <div class="integer_widget">
        {{ block('base_integer_widget') }}
    </div>
{% endblock %}

Référencement blocs de base à partir d'un modèle externe

Si vos personnalisations du formulaire vivent à l'intérieur d'un modèle externe, vous pouvez référencer le bloc de base en utilisant la fonction Twig parent()

{# src/Acme/DemoBundle/Resources/views/Form/fields.html.twig #}

{% extends 'form_div_layout.html.twig' %}

{% block integer_widget %}
    <div class="integer_widget">
        {{ parent() }}
    </div>
{% endblock %}

Il n'est pas possible de référencer le bloc de base lorsque vous utilisez PHP en tant que moteur de templates. Vous devez copier manuellement le contenu du bloc de base à votre nouveau fichier de modèle.

Faire la demande à l'échelle de la personnalisation

Si vous souhaitez une personnalisation de certaine forme globale à votre demande, vous pouvez accomplir cela en rendant les personnalisations du formulaire dans un modèle externe, puis l'importer dans votre configuration de l'application:

Twig

En utilisant la configuration suivante, tous les blocs de forme personnalisés à l'intérieur du template AcmeDemoBundle:Form:fields.html.twig seront utilisée globalement dans un formulaire.

Version Yaml

# app/config/config.yml

twig:
    form:
        resources:
            - 'AcmeDemoBundle:Form:fields.html.twig'
    # ...

Version Xml

<!-- app/config/config.xml -->

<twig:config ...>
        <twig:form>
            <resource>AcmeDemoBundle:Form:fields.html.twig</resource>
        </twig:form>
        <!-- ... -->
</twig:config>

Version Php

// app/config/config.php

$container->loadFromExtension('twig', array(
    'form' = > array('resources' = > array(
        'AcmeDemoBundle:Form:fields.html.twig',
     ))
    // ...
));

Par défaut, Twig utilise une disposition div lors du rendu de formes. Certaines personnes, cependant, préféreront peut-être rendre les formes dans un tracé de la table. Utilisez la ressource form_table_layout.html.twig pour utiliser un tel schéma:

Version Yaml

# app/config/config.yml

twig:
    form:
        resources: ['form_table_layout.html.twig']
    # ...

Version Xml

<!-- app/config/config.xml -->

<twig:config ...>
        <twig:form>
            <resource>form_table_layout.html.twig</resource>
        </twig:form>
        <!-- ... -->
</twig:config>

Version Php

// app/config/config.php

$container->loadFromExtension('twig', array(
    'form' = > array('resources' = > array(
        'form_table_layout.html.twig',
     ))
    // ...
));

Si vous voulez seulement faire le changement dans un modèle, ajoutez la ligne suivante à votre fichier de modèle plutôt que d'ajouter le modèle comme une ressource:

{% form_theme form 'form_table_layout.html.twig' %}

Notez que la variable de formulaire dans le code ci-dessus est la variable de vue forme que vous avez passé à votre modèle.

PHP

En utilisant la configuration suivante, tous les fragments de forme personnalisés à l'intérieur du dossier de formulaire src/Acme/DemoBundle/Resources/views/Form seront utilisés en global quand un formulaire est rendu.

Version Yaml

# app/config/config.yml

framework:
    templating:
        form:
            resources:
                - 'AcmeDemoBundle:Form'
    # ...

Version Xml

<!-- app/config/config.xml -->

<framework:config ...>
    <framework:templating>
        <framework:form>
            <resource>AcmeDemoBundle:Form</resource>
        </framework:form>
    </framework:templating>
    <!-- ... -->
</framework:config>

Version Php

// app/config/config.php

// PHP
$container->loadFromExtension('framework', array(
    'templating' = > array('form' = >
        array('resources' = > array(
            'AcmeDemoBundle:Form',
     )))
    // ...
));

Par défaut, le moteur PHP utilise une disposition div lors du rendu de formes. Certaines personnes, cependant, préféreront peut-être rendre les formes dans un tracé de la table. Utilisez la ressource FrameworkBundle:FormTable pour utiliser un tel schéma:

Version Yaml

# app/config/config.yml

framework:
    templating:
        form:
            resources:
                - 'FrameworkBundle:FormTable'

Version Xml

<!-- app/config/config.xml -->

<framework:config ...>
    <framework:templating>
        <framework:form>
            <resource>FrameworkBundle:FormTable</resource>
        </framework:form>
    </framework:templating>
    <!-- ... -->
</framework:config>

Version Php

// app/config/config.php

$container->loadFromExtension('framework', array(
    'templating' = > array('form' = >
        array('resources' = > array(
            'FrameworkBundle:FormTable',
     )))
    // ...
));

Si vous voulez seulement faire le changement dans un modèle, ajoutez la ligne suivante à votre fichier de modèle plutôt que d'ajouter le modèle comme une ressource:

<?php $view['form']->setTheme($form, array('FrameworkBundle:FormTable')); ?>

Notez que la variable $form dans le code ci-dessus est la variable de la vue form que vous avez passé à votre modèle.

Comment personnaliser un champ individuel

Jusqu'ici, vous avez vu les différentes façons dont vous pouvez personnaliser la sortie de widget de tous les types de champs de texte. Vous pouvez également personnaliser les champs individuels. Par exemple, supposons que vous avez deux champs de texte - first_name et last_name - mais vous ne souhaitez personnaliser l'un des champs. Ceci peut être accompli en personnalisant un fragment dont le nom est une combinaison de l'attribut id sur le terrain et qui font partie du champ est en cours d'adaptation. Par exemple:

Version Twig

{% form_theme form _self %}

{% block _product_name_widget %}
    <div class="text_widget">
        {{ block('field_widget') }}
    </div>
{% endblock %}

{{ form_widget(form.name) }}

Version Php

<!-- Main template -->

<?php echo $view['form']->setTheme($form, array('AcmeDemoBundle:Form')); ?>

<?php echo $view['form']->widget($form['name']); ?>

<!-- src/Acme/DemoBundle/Resources/views/Form/_product_name_widget.html.php -->

<div class="text_widget">
      echo $view['form']->renderBlock('field_widget') ?>
</div>

Ici, le fragment _product_name_widget définit le modèle à utiliser pour le champ dont l'id est product_name (et le nom est le product[name]).

La portion de produit du champ est le nom du formulaire, qui peut être réglée manuellement ou automatiquement généré en fonction de votre nom de type de formulaire (par exemple ProductType équivaut à du produit). Si vous n'êtes pas sûr de ce que votre nom forme est, tout simplement afficher la source de votre formulaire généré.

Vous pouvez également remplacer le balisage d'une ligne du champ entier en utilisant la même méthode:

Version Twig

{% form_theme form _self %}

{% block _product_name_row %}
    <div class="name_row">
        {{ form_label(form) }}
        {{ form_errors(form) }}
        {{ form_widget(form) }}
    </div>
{% endblock %}

Version Php

<!-- _product_name_row.html.php -->

<div class="name_row">
    <?php echo $view['form']->label($form) ?>
    <?php echo $view['form']->errors($form) ?>
    <?php echo $view['form']->widget($form) ?>
</div>

Autres personnalisations courantes

Jusqu'à présent, cette recette vous a montré plusieurs façons de personnaliser une seule pièce de la façon dont une forme est rendue. La clé consiste à personnaliser un fragment spécifique qui correspond à la partie de la forme que vous souhaitez contrôler (voir nommer forment des blocs ).

Dans les sections suivantes, vous verrez comment vous pouvez faire plusieurs personnalisations forme commune. Pour appliquer ces personnalisations, utilisez l'une des méthodes décrites dans le formulaire Thématisation section.

Personnalisation de sortie d'erreur

La composante formulaire gère seulement la façon dont les erreurs de validation sont rendus, et non les messages d'erreur de validation. Les messages d'erreur eux-mêmes sont déterminés par les contraintes de validation que vous appliquez à vos objets. Pour plus d'informations, voir le chapitre sur la Validation dans Symfony2

Il existe de nombreuses façons de personnaliser la façon dont les erreurs sont rendus lorsqu'un formulaire est soumis à des erreurs. Les messages d'erreur pour un champ sont rendus lorsque vous utilisez l'assistant erreurs_form:

Version Twig

{{ form_errors(form.age) }}

Version Php

<?php echo $view['form']->errors($form['age']); ?>

Par défaut, les erreurs sont rendus à l'intérieur d'une liste non ordonnée:

<ul>
    <li>This field is required</li>
</ul>

Pour remplacer la façon dont les erreurs sont rendus dans tous les domaines, il suffit de copier, coller et de personnaliser le fragment field_errors.

Version Twig

{% block field_errors %}
{% spaceless %}
    {% if errors|length > 0 %}
    <ul class="error_list">
        {% for error in errors %}
            <li>{{ error.messageTemplate|trans(error.messageParameters, 'validators') }}</li>
        {% endfor %}
    </ul>
    {% endif %}
{% endspaceless %}
{% endblock field_errors %}

Version Php

<!-- fields_errors.html.php -->

<?php if ($errors): ?>
    <ul class="error_list">
        <?php foreach ($errors as $error): ?>
            <li><?php echo $view['translator']->trans(
                $error->getMessageTemplate(),
                $error->getMessageParameters(),
                'validators'
            ) ?></li>
        <?php endforeach; ?>
    </ul>
<?php endif ?>

Voir formulaire Thématisation pour savoir comment appliquer cette personnalisation.

Vous pouvez également personnaliser la sortie d'erreur pour un seul type de champ spécifique. Par exemple, certaines erreurs qui sont plus globale de votre formulaire (c.-à-pas spécifique à un seul champ) sont rendus séparément, généralement en haut de votre formulaire:

Version Twig

{{ form_errors(form) }}

Version Php

<?php echo $view['form']->render($form); ?>

Pour personnaliser seul le balisage utilisé pour ces erreurs, suivez les mêmes directions que ci-dessus, mais maintenant appeler les erreurs_form bloc (TWIG) / le fichier (PHP) form_errors.html.php. Maintenant, lorsque des erreurs pour le type de formulaire sont rendus, votre fragment personnalisé sera utilisé à la place des field_errors par défaut.

Personnalisation de la "Form Row"

Lorsque vous pouvez le gérer, le plus simple de rendre un champ de formulaire se fait via la fonction form_row, ce qui rend l'étiquette, erreurs et des widgets HTML d'un champ. Pour personnaliser le balisage utilisé pour rendre toutes les lignes de champ de formulaire, remplacer le fragment field_row. Par exemple, supposons que vous souhaitez ajouter une classe à l'élément div autour de chaque ligne:

Version Twig

{% block field_row %}
    <div class="form_row">
        {{ form_label(form) }}
        {{ form_errors(form) }}
        {{ form_widget(form) }}
    </div>
{% endblock field_row %}

Version Php

<!-- field_row.html.php -->

<div class="form_row">
    <?php echo $view['form']->label($form) ?>
    <?php echo $view['form']->errors($form) ?>
    <?php echo $view['form']->widget($form) ?>
</div>

Voir formulaire Thématisation pour savoir comment appliquer cette personnalisation.

Ajout d'un Asterisk "Required" pour les étiquettes de champs

Si vous voulez désigner l'ensemble de vos champs obligatoires marqués d'un astérisque requis, vous pouvez le faire en personnalisant le fragment field_label.

En Twig, si vous faites la personnalisation des formulaires à l'intérieur du même modèle que votre formulaire, modifier la balise utilisation et ajoutez la ligne suivante:

{% use 'form_div_layout.html.twig' with field_label as base_field_label %}

{% block field_label %}
    {{ block('base_field_label') }}

    {% if required %}
        <span class="required" title="This field is required">*</span>
    {% endif %}
{% endblock %}

En Twig, si vous faites la personnalisation de formulaire dans un modèle distinct, utilisez la commande suivante:

{% extends 'form_div_layout.html.twig' %}

{% block field_label %}
    {{ parent() }}

    {% if required %}
        <span class="required" title="This field is required">*</span>
    {% endif %}
{% endblock %}

Lorsque vous utilisez PHP en tant que moteur de templates, vous devez copier le contenu à partir du modèle original:

<!-- field_label.html.php -->

<!-- original content -->
<label for="<?php echo $view->escape($id) ?>" <?php foreach($attr as $k => $v) { printf('%s="%s" ', $view->escape($k), $view->escape($v)); } ?>><?php echo $view->escape($view['translator']->trans($label)) ?></label>

<!-- customization -->
<?php if ($required) : ?>
    <span class="required" title="This field is required">*</span>
<?php endif ?>

Voir formulaire Thématisation pour savoir comment appliquer cette personnalisation.

Ajout "aide" messages

Vous pouvez également personnaliser vos widgets du formulaire pour avoir une option "aide" du message.

En Twig, Si vous faites la personnalisation des formulaires à l'intérieur du même modèle que votre formulaire, modifier la balise utilisation et ajoutez la ligne suivante:

{% use 'form_div_layout.html.twig' with field_widget as base_field_widget %}

{% block field_widget %}
    {{ block('base_field_widget') }}

    {% if help is defined %}
        <span class="help">{{ help }}</span>
    {% endif %}
{% endblock %}

En Twig, Si vous faites la personnalisation de formulaire dans un modèle distinct, utilisez la commande suivante:

{% extends 'form_div_layout.html.twig' %}

{% block field_widget %}
    {{ parent() }}

    {% if help is defined %}
        <span class="help">{{ help }}</span>
    {% endif %}
{% endblock %}

Lorsque vous utilisez PHP en tant que moteur de templates, vous devez copier le contenu à partir du modèle original:

<!-- field_widget.html.php -->

<!-- Original content -->
<input
    type="<?php echo isset($type) ? $view->escape($type) : "text" ?>"
    value="<?php echo $view->escape($value) ?>"
    <?php echo $view['form']->renderBlock('attributes') ?>
/>

<!-- Customization -->
<?php if (isset($help)) : ?>
    <span class="help"><?php echo $view->escape($help) ?></span>
<?php endif ?>

Pour rendre un message d'aide ci-dessous un champ, passer une variable de l'aide:

Version Twig

{{ form_widget(form.title, { 'help': 'foobar' }) }}

Version Php

<?php echo $view['form']->widget($form['title'], array('help' => 'foobar')) ?>