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 ?
4 réponses
Une autre option consiste à marquer explicitement le champ comme Rendu:
{% do form.contenu.setRendered %}
{{ 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) }}
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.
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...