web-dev-qa-db-fra.com

Symfony2 - FormBuilder - ajoutez une classe au champ et entrez

Je veux ajouter une classe à certains champs d'entrée ou d'étiquette depuis symfony2.

Je peux faire quelque chose comme ça sous ma forme dans Twig:

<div class="row">
    {{ form_label(form.subject) }}
    {{ form_widget(form.subject, { 'attr': {'class': 'c4'} }) }}
</div>

Ce qui fonctionne bien. Mais je dois configurer le modèle pour chaque formulaire. Et je dois le décomposer au niveau de sortie le plus petit possible. Je veux en fait utiliser:

 {{ form_widget(form) }}

Donc, je pensais, comment pourrais-je ajouter une classe css pour le l quelque part dans:

class SystemNotificationType extends AbstractType {
    public function buildForm(FormBuilder $builder, array $options) {
        $builder    ->add('subject', 'text', array( 'label'  => 'Subject' ) )
–

J'ai pensé que cela pourrait être plus utile, car je n'ai qu'à apporter des modifications à un seul endroit.

Alors, comment cela pourrait-il être fait, ou peut-être que je pense dans le mauvais sens.

Toute aide est la bienvenue,

Merci beaucoup, Philipp

19
insertusernamehere

Vous pouvez le faire comme ceci:

class SystemNotificationType extends AbstractType {
    public function buildForm(FormBuilder $builder, array $options) {
        $builder->add('subject', 'text', array( 
            'label'  => 'Subject',
            'attr'   =>  array(
                'class'   => 'c4')
            )
        );
    }
}
44
Pappa

Formulaire Theming


Chaque partie du rendu d'un formulaire peut être personnalisée. Vous êtes libre de modifier le rendu de chaque "ligne" de formulaire, de modifier le balisage utilisé pour le rendu des erreurs ou même de personnaliser le rendu d'une balise de zone de texte. Rien n'est interdit et différentes personnalisations peuvent être utilisées à différents endroits.

Symfony utilise des modèles pour rendre chaque partie d'un formulaire, comme les étiquettes d'étiquette, les étiquettes d'entrée, 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 du rendu d'un formulaire, il vous suffit de remplacer le bloc approprié.

En PHP, chaque "fragment" de formulaire est rendu via un fichier de modèle individuel. Pour personnaliser n'importe quelle partie du rendu d'un formulaire, il vous suffit de remplacer le modèle existant en en créant un nouveau.

Pour comprendre comment cela fonctionne, personnalisez le fragment form_row et ajoutez un attribut de classe à l'élément div qui entoure chaque ligne. Pour ce faire, créez un nouveau fichier de modèle qui stockera le nouveau balisage:

{# 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é lors du rendu de la plupart des champs via la fonction form_row. Pour indiquer au composant de formulaire d'utiliser votre nouveau fragment form_row défini ci-dessus, ajoutez ce qui suit en haut du modèle qui rend le formulaire:

{# 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 modèle donné et les utilise lors du rendu du formulaire. En d'autres termes, lorsque la fonction form_row est appelée plus loin dans ce modèle, elle utilisera le bloc form_row de votre thème personnalisé (au lieu du bloc form_row par défaut fourni avec Symfony).

Votre thème personnalisé n'a pas à remplacer tous les blocs. Lors du rendu d'un bloc qui n'est pas surchargé dans votre thème personnalisé, le moteur de thème reviendra au thème global (défini au niveau du bundle).

Si plusieurs thèmes personnalisés sont fournis, ils seront recherchés dans l'ordre indiqué avant de revenir au thème global.

Pour personnaliser n'importe quelle partie d'un formulaire, il vous suffit de remplacer le fragment approprié. Savoir exactement quel bloc ou fichier remplacer est le sujet de la section suivante.

{# 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 d'informations, consultez le Comment personnaliser le rend dans Livre de recettes Symfony

Thème de forme globale


Dans l'exemple ci-dessus, vous avez utilisé l'aide form_theme (dans Twig) pour "importer" les fragments de formulaire personnalisés dans ce formulaire uniquement. Vous pouvez également demander à Symfony d'importer des personnalisations de formulaire dans l'ensemble de votre projet.

Brindille

Pour inclure automatiquement les blocs personnalisés du modèle fields.html.twig créé précédemment dans tous les modèles, modifiez le fichier de configuration de votre application:

# app/config/config.yml
  twig:
    form:
      resources:
        - 'AcmeTaskBundle:Form:fields.html.twig'

Tous les blocs à l'intérieur du modèle fields.html.twig sont désormais utilisés globalement pour définir la sortie du formulaire.

6
mukulu