• Aucun résultat trouvé

Habillage de Formulaire (« Theming »)

Dans le document Manuel sur les fondamentaux de Symfony2 en Pdf (Page 165-167)

Chaque partie de l'affichage d'un formulaire peut être personnalisée. Vous êtes libre de changer la manière dont chaque « partie » du formulaire est affichée, de changer les balises utilisées pour afficher les erreurs, ou même de personnaliser la manière dont la balise textarea doit être affichée. Tout est permis, et différentes personnalisations peuvent être utilisées à différents endroits.

Symfony utilise des templates pour afficher chaque partie d'un formulaire, comme les balises tags, les balises input, les messages d'erreur et tout le reste.

Dans Twig, chaque « fragment » de formulaire est représenté par un bloc Twig. Pour personnaliser n'importe quelle partie d'un formulaire, vous avez juste besoin de réécrire le bloc approprié.

En PHP, chaque « fragment » de formulaire est affiché via un fichier de template individuel. Pour personnaliser n'importe quelle partie d'un formulaire, vous avez juste besoin de réécrire le template existant en en créant un nouveau.

Pour comprendre comment tout cela fonctionne, personnalisons le fragment form_row et ajoutons l'attribut « class » à l'élément div qui entoure chaque ligne. Pour faire cela, créez un nouveau fichier de template qui va stocker la nouvelle balise :

1 2 3 4 5 6 7 8 9 10 {# src/Acme/TaskBundle/Resources/views/Form/fields.html.twig #} {% block form_row %} {% spaceless %}

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

Le fragment de formulaire form_row est utilisé pour afficher la plupart des champs via la fonction form_row. Pour dire au composant formulaire d'utiliser votre nouveau fragment form_row défini ci- dessus, ajoutez ce qui suit en haut du template qui affiche le formulaire :

Listing 12-48 1 2 3 4 5 6 {# src/Acme/TaskBundle/Resources/views/Default/new.html.twig #} {% form_theme form 'AcmeTaskBundle:Form:fields.html.twig' %} {% form_theme form 'AcmeTaskBundle:Form:fields.html.twig' 'AcmeTaskBundle:Form:fields2.html.twig' %}

{{ form(form) }}

La balise form_theme (dans Twig) « importe » les fragments définis dans le template donné et les utilise lorsqu'il affiche le formulaire. En d'autres termes, quand la fonction form_row est appelée plus tard dans ce template, elle va utiliser le bloc form_row de votre thème personnalisé (à la place du bloc par défaut form_row qui est fourni avec Symfony).

Votre thème personnalisé n'a pas besoin de surcharger tous les blocs. Lorsqu'il affiche un bloc qui n'est pas surchargé par votre thème personnalisé, le moteur de thème se rabattra sur le thème global (défini au niveau du bundle).

Si plusieurs thèmes personnalisés sont fournis, ils seront pris selon l'ordre dans lequel ils sont listés avant que le thème global ne soit pris en compte.

Pour personnaliser n'importe quelle portion d'un formulaire, vous devez juste réécrire le fragment approprié. Connaître exactement quel bloc ou fichier réécrire est le sujet de la prochaine section.

1 2 3 4 5 {# src/Acme/TaskBundle/Resources/views/Default/new.html.twig #} {% form_theme form with 'AcmeTaskBundle:Form:fields.html.twig' %} {% form_theme form with ['AcmeTaskBundle:Form:fields.html.twig',

'AcmeTaskBundle:Form:fields2.html.twig'] %}

Pour plus de précisions, lisez Comment personnaliser le rendu de formulaire.

Nommage de Fragment de Formulaire

Dans Symfony, chaque partie d'un formulaire qui est affiché - éléments de formulaire HTML, erreurs, labels, etc - est définie dans un thème de base, qui est une collection de blocs dans Twig et une collection de fichiers de template dans PHP.

Dans Twig, chaque bloc nécessaire est défini dans un unique fichier de template (form_div_layout.html.twig12) qui se trouve dans le Twig Bridge13. Dans ce fichier, vous pouvez voir chaque bloc requis pour afficher un formulaire et chaque type de champ par défaut.

En PHP, les fragments sont des fichiers de template individuels. Par défaut, ils sont situés dans le répertoire Resources/views/Form du bundle du framework (voir sur GitHub14).

Chaque nom de fragment suit le même schéma de base et est divisé en deux parties, séparées par un unique underscore (_). Voici quelques exemples :

• form_row - utilisé par form_row pour afficher la plupart des champs ;

• textarea_widget - utilisé par form_widget pour afficher un champ de type textarea ; • form_errors - utilisé par form_errors pour afficher les erreurs d'un champ.

Chaque fragment suit le même schéma de base : type_part. La partie type correspond au type du champ qui doit être affiché (par exemple : textarea, checkbox, date, etc) alors que la partie part correspond à

12. https://github.com/symfony/symfony/blob/master/src/Symfony/Bridge/Twig/Resources/views/Form/form_div_layout.html.twig 13. https://github.com/symfony/symfony/tree/2.2/src/Symfony/Bridge/Twig

Listing 12-49

ce qui va être affiché (par exemple : label, widget, errors, etc). Par défaut, il y a 4 parties possibles d'un formulaire qui peuvent être affichées :

label (par exemple : form_label) affiche le label du champ

widget (par exemple :

form_widget)

affiche la représentation HTML du champ

errors (par exemple :

form_errors)

affiche les erreurs du champ

row (par exemple : form_row) affiche la ligne entière du champ (label, widget, et erreurs)

Il y a en fait 2 autres parties, rows``et ``rest, mais vous ne devriez que rarement, voire jamais, avoir besoin de les réécrire.

En connaissant le type du champ (par exemple : textarea) et quelle partie de ce dernier vous souhaitez personnaliser (par exemple : widget), vous pouvez construire le nom du fragment qui a besoin d'être réécrit (par exemple : textarea_widget).

Dans le document Manuel sur les fondamentaux de Symfony2 en Pdf (Page 165-167)

Documents relatifs