2013-05-24 12 views
21

ho un semplice problema.Symfony2 -> Twig -> Form -> Field -> Set rendered = true

Ho una forma con un campo, ad esempio:

$builder 
    ->add('x') 
    ->add('y') 
    ->add('z') 
; 

Nei miei file ramoscello ho usato più blocchi e voglio smettere di rendere i campi ... osservo il b.html.twig file!

a.html.twig

{% block body %} 
    {% block form %} 
     {{ form_widget(form) }} 
    {% endblock form %} 
{% endblock body %} 

b.html.twig

{% block form %} 
    {{ form.x.set('rendered', true) | default() }} 
    {{ parent() }} 
{% endblock form %} 

se mi tolgo la "default()" ottengo l'errore, che la sopraelevazione oggetto essere convertito in una stringa. E in realtà il modulo rende tutti i campi ... Compreso il campo x. Ma non dovrebbero rendere il campo x ...

Grazie in anticipo!

risposta

65

Mi sto perdendo la domanda qui? Se si desidera impostare un campo come reso anche se non è la chiamata semplice è:

{% do form.x.setRendered %} 

Se ho capito male, le mie scuse.

3

È necessario rimuovere (o solo aggiungere) il campo modulo nel FormType includendo una sorta di logica decisionale.

Ad esempio controllo per esistenza/valore di una variabile di cerain.

Questa variabile può essere quindi iniettata nel costruttore.

La rimozione dal modello è una logica dell'applicazione che non appartiene al modello.

Se non avete altra scelta date un'occhiata al metodo FormView::setRendered().

È possibile accedere ai metodi di un oggetto utilizzando Ramoscelli attribute function:

{{ attribute(object, method, arguments) }} 
+0

Il problema è che uso un tema di modulo globale che contiene "form_widget (form)" come predefinito. Ho bisogno di un campo in fondo e perché avrei impostato render = true. Quindi potrei usarlo in fondo e il mio tema globale non renderà il campo ... – PatrickB

+0

aggiornato la mia risposta ... la tua domanda esatta è come chiamare setRendered() per una riga in un modulo manualmente? – nifr

+0

La domanda è come farlo con twig (solo) ^^ Al momento utilizzo una funzione di ramificazione fatta da sé: public function renderState (campo $ FormView) {$ field-> setRendered (true); } – PatrickB

2

È possibile utilizzare prossima dichiarazione sotto forma di chiusura per evitare che il rendering campi del modulo che sono definiti nella forma ma non descritta in modello:

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

Per esempio, definiamo modulo successivo:

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add(
      'id', 
      HiddenType::class, 
      array(          
       'required' => false 
      ) 
     ) 
     ->add(
      'name', 
      TextType::class, 
      array(          
       'required' => false 
      ) 
     ) 
     ->add(
      'comment', 
      TextType::class, 
      array(
       'required' => false 
      ) 
     ) 
     ->add(
      'amount', 
      TextType::class, 
      array(
       'required' => false 
      ) 
     ); 
} 

Per questo modulo descriviamo il prossimo modello, ma non vogliamo renderizzare il campo id, quindi possiamo usare l'opzione render_rest nel blocco form_end per eseguire il rendering di campo del id:

{{ form_start(form) }} 
{{ form_row(form.name) }} 
{{ form_row(form.comment) }} 
{{ form_row(form.amount) }} 
{{ form_end(form, {'render_rest': false}) }} 
+4

Questa risposta sarebbe meglio se aggiungeste una spiegazione. – johnnyRose

+0

Ma questo funziona per tutti i campi. Anche per _csrf_token SO avresti bisogno di ricordare di aggiungere il campo _csrf a mano – Tom