Comment faire en sorte 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 parce que mon champ encore rendu par moi est affiché avec la fonction form_rest() aussi, donc j'ai 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 ?

63
demandé sur j0k 2012-05-13 11:22:47

4 réponses

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

{% do form.contenu.setRendered %}
183
répondu Francesc Rosas 2012-11-21 10:08:05

{{ 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
répondu gremo 2012-05-13 09:49:11

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

{{ form_end(form, {'render_rest': false}) }}

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

32
répondu Andresch Serj 2016-05-18 13:49:41

La situation dans laquelle vous ne voulez pas montrer un 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 séparées (ce qui est, à mon avis, Un peu exagéré).

J'ai eu un cas commun il y a quelques mois lorsque la forme différait lorsque l'utilisateur insérait / mettait à jour des enregistrements. C'était quelque chose comme ceci:

...
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 classe de formulaire vous pourrait 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 aide...

10
répondu Jovan Perovic 2012-05-13 11:17:26