2012-05-13 31 views
57

Empecé a usar Symfony2 pero tengo algunos problemas. Quería renderizar los campos a mano, pero no funciona porque mi campo todavía renderizado por mí también se muestra con la función form_rest(), así que tengo dos campos iguales.¿Cómo hacer que form_rest() no muestre un campo con Symfony2?

Aquí está mi código:

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

Y, al final del formulario, debo poner esto:

{{ form_rest(form) }} 

pero muestra el campo "contenu" :(

Do usted tiene una idea de cuál es el problema?

+0

Es, por casualidad, su forma llamada "forma"? ¿En qué versión de Symfony esta solución funcionó para usted? Estoy tratando de hacer lo mismo, pero no funciona. – userfuser

Respuesta

174

Otra opción es marcar explícitamente el campo como prestados:

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

Exactamente lo que estaba buscando y responde precisamente a la pregunta. –

+1

¡Magnífico! hace el trabajo a la perfección. – richsage

+0

en PHP sería setRendered (verdadero)?> –

32

{{ form_rest(form) }} va al final, después de renderin g cada campo "manualmente". Si usted lo está utilizando para el CSRF de token siempre se puede hacer con:

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

muy útil en combinación con '{{form_widget (form._token)}}' '{{form_end (form, {'render_rest': false})}}' – Barno

8

La situación en la que no desea mostrar algún campo sugiere forma mal diseñado. Podría alimentar algunos argumentos en su __construct para hacerlo condicional (por ejemplo, incluir/excluir algunos campos) o simplemente podría crear clases separadas Form (que es, en mi opinión, un poco exagerado).

Tuve casos comunes hace unos meses cuando la forma difería cuando el usuario insertaba/actualizaba registros. Era algo como esto:

... 
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 por alguna razón usted no es capaz de refactorizar clase de formulario que aún se podía mostrar los campos no deseados, pero envolverlos en <div> que tiene CSS display:none atributo. De esa manera "todavía están allí" (y por supuesto se procesan normalmente) pero no son visibles para el usuario.

Espero que esto ayude ...

+0

jperovic tiene razón. ¡Esta es una solución agradable y limpia! –

+0

Gracias, pero eso no era lo que quería (encontré una solución, vea mi EDIT). Quería decirle a Symfony que ya he mostrado el campo;) – Minipipo1

25

Otra en mi opinión manera menos hacky de hacerlo es la siguiente:

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

Es de official documentation (v3.0) por lo que es más o menos mejor práctica i adivinar.

+4

No olvides representar el token CSRF manualmente. – Kolyunya

Cuestiones relacionadas