php - form_theme - symfony render form
¿Cómo hacer que form_rest() no muestre un campo con Symfony2? (4)
La situación en la que no desea mostrar un campo sugiere una forma mal diseñada. Podría alimentar algunos argumentos en su __construct
para hacerlo condicional (por ejemplo, incluir / excluir algunos campos) o simplemente podría crear clases de Form
separadas (que, en mi opinión, es un poco exagerado).
Tuve casos comunes hace unos meses cuando la forma difería cuando el usuario insertaba / actualizaba registros. Fue 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 no puede refactorizar la clase de formulario, aún podría mostrar los campos no deseados, pero envolverlos en <div>
que tiene display:none
atributo CSS display:none
. 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...
Empecé a usar Symfony2 pero tengo algunos problemas. Quería renderizar los campos a mano, pero no funciona porque mi campo ya representado por mí también se muestra con la función form_rest()
, así que tengo dos campos iguales.
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" :(
¿Tienes una idea de cuál es el problema?
Otra en mi opinión, una forma menos hacky de hacerlo es esta:
{{ form_end(form, {''render_rest'': false}) }}
Es de la documentación oficial (v3.0) así que es una buena práctica, supongo.
Otra opción es marcar explícitamente el campo como renderizado:
{% do form.contenu.setRendered %}
{{ form_rest(form) }}
va al final, después de representar cada campo "manualmente". Si lo está utilizando para el token CSRF, siempre puede procesarlo con:
{# Token CSRF #}
{{ form_widget(form._token) }}