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