2012-05-13 5 views
57

Ho iniziato a usare Symfony2 ma ho qualche problema. Volevo eseguire il rendering dei campi a mano ma non funziona perché il mio campo ancora da me visualizzato viene visualizzato con la funzione form_rest(), quindi ho due campi uguali.Come rendere form_rest() non visualizza un campo con Symfony2?

Ecco il mio codice:

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

E, alla fine del modulo, devo messo questo:

{{ form_rest(form) }} 

ma visualizza il campo "contenu" :(

Do hai un'idea di qual è il problema?

+0

È, per caso, il tuo modulo chiamato "modulo"? A quale versione di Symfony questa soluzione ha funzionato per te? Sto provando a fare lo stesso ma non funziona. – userfuser

risposta

174

Un'altra opzione è quella di marcare in modo esplicito il campo come reso:

{% do form.contenu.setRendered %} 
+6

Esattamente quello che stavo cercando e risponde esattamente alla domanda posta. –

+1

Stupendo! fa il lavoro perfettamente. – richsage

+0

in PHP sarebbe setRendered (true)?> –

32

{{ form_rest(form) }} va alla fine, dopo il rendering g ogni campo "manualmente". Se lo si utilizza per il CSRF gettone si può sempre rendere con:

{# Token CSRF #} 
{{ form_widget(form._token) }} 
+33

molto utile in combinazione con '{{form_widget (form._token)}}' '{{form_end (form, {'render_rest': false})}} – Barno

8

La situazione in cui non si vuole mostrare qualche campo suggerisce modulo mal progettato. Potresti inserire alcuni argomenti nel suo __construct per renderlo condizionale (ad esempio, includi/escludi alcuni campi) oppure potresti semplicemente creare classi separate Form (che è, secondo me, un po 'eccessivo).

Ho avuto un caso comune pochi mesi fa quando la forma era diversa quando l'utente ha inserito/ha aggiornato i record. E 'stato qualcosa di simile:

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

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

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

Se per qualche motivo non siete in grado di refactoring classe form si potrebbe ancora visualizzare i campi indesiderati, ma avvolgerli in <div> che ha CSS attributo display:none. In questo modo "sono ancora lì" (e con tutti i mezzi vengono elaborati normalmente) ma non sono visibili all'utente.

Spero che questo aiuti ...

+0

jperovic ha ragione. Questa è una soluzione bella e pulita! –

+0

Grazie, ma non era quello che volevo (ho trovato una soluzione, vedi il mio EDIT). Volevo dire a Symfony che ho già visualizzato il campo;) – Minipipo1

25

Un'altra a mio parere modo meno hacky per farlo è questo:

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

È dallo official documentation (v3.0) quindi è praticamente best practice i indovina.

+4

Non dimenticare di eseguire il rendering del token CSRF manualmente. – Kolyunya