web-dev-qa-db-fra.com

Comment faire pour que form_rest () n'affiche pas un champ avec Symfony2?

J'ai commencé à utiliser Symfony2 mais j'ai quelques problèmes. Je voulais rendre les champs à la main mais cela ne fonctionne pas car mon champ encore rendu par moi est affiché avec la fonction form_rest() aussi, j'ai donc deux mêmes champs.

Voici mon code:

<div>
     {{ form_errors(form.contenu) }}
     <textarea id="{{ form.contenu.vars.id }}" name="{{ form.contenu.vars.full_name }}">{{ form.contenu.vars.value }}</textarea>
</div>

Et, à la fin du formulaire, je dois mettre ceci:

{{ form_rest(form) }}

Mais il affiche le champ "contenu" :(

Avez-vous une idée du problème?

65
Minipipo1

Une autre option consiste à marquer explicitement le champ comme rendu:

{% do form.contenu.setRendered %}
192
Francesc Rosas

Une autre à mon avis façon moins hacky de le faire est la suivante:

{{ form_widget(form._token) }} // render the CSRF Token
{{ form_end(form, {'render_rest': false}) }} // do not render anything else

C'est de la documentation officielle (v3.0) donc c'est à peu près la meilleure pratique je suppose.

42
Andresch Serj

{{ form_rest(form) }} va à la toute fin, après avoir rendu chaque champ "manuellement". Si vous l'utilisez pour le jeton CSRF, vous pouvez toujours le rendre avec:

{# Token CSRF #}
{{ form_widget(form._token) }}
32
gremo

La situation dans laquelle vous ne voulez pas afficher de champ suggère une forme mal conçue. Vous pouvez alimenter certains arguments dans son __construct pour le rendre conditionnel (par exemple, inclure/exclure certains champs) ou vous pouvez simplement créer des classes Form distinctes (ce qui, à mon avis, est un peu exagéré).

J'ai eu un cas courant il y a quelques mois lorsque le formulaire différait lorsque l'utilisateur insérait/mettait à jour des enregistrements. C'était quelque chose comme ça:

...
public function __construct($isUpdateForm){
    $this->isUpdateForm= $isUpdateForm;
}

public function buildForm(FormBuilder $builder, array $options){
    ....
    $builder->add('some_filed', 'text', ..... );

    if ( $this->isUpdateForm ){
        $builder->add(.....);
    }
    ....
}
....

Si, pour certaines raisons, vous n'êtes pas en mesure de refactoriser la classe de formulaire, vous pouvez toujours afficher les champs indésirables, mais les envelopper dans <div> qui a CSS display:none attribut. De cette façon, "ils sont toujours là" (et par tous les moyens sont traités normalement) mais ne sont pas visibles pour l'utilisateur.

J'espère que cela t'aides...

10
Jovan Perovic