Manos a la obra con Symfony : formularios simples

Estándar

Hola a todos de nuevo. Continuamos con la segunda entrega de “Manos a la obra con Symfony”.
A estas alturas deberíamos tener nuestro modelo generado para adentrarnos en el mundo de los formularios en Symfony. Éste post tiene como objetivo que sepáis lo básico de los formularios “simples” de Symfony.

Si deseáis profundizar podéis hacerlo a través de http://www.librosweb.es/symfony_formularios/ o http://www.symfony-project.org/jobeet/1_4/Doctrine/en/10

Antes de empezar conviene advertir que usaremos Doctrine y Symfony 1.4

Formularios en Symfony

Si echamos un vistazo a la carpeta “lib/form/doctrine” veremos que… ¡¡ los formularios ya están ahí y se han creado automáticamente !! De hecho, veremos un archivo EntidadForm.class.php por cada entidad de nuestro modelo de datos. Si nos pica la curiosidad y nos disponemos a echarle un vistazo al contenido veremos que… ¿estan vacíos? Pues sí, al igual que en el caso del modelo, Symfony ha dejado esas clases vacías y que hereden de su clase base (localizable en “lib/form/doctrine/base”) que si que tiene los validadores, tipos y widgets por defecto.

Al igual que antes, es posible que deseemos aplicar modificaciones que no están contempladas sobre el modelo base (widget, validadores adicionales, seleccionar algunos campos del formulario,…) y por ese motivo se genera una clase por defecto que hereda de la base.

¿Qué son los módulos, las acciones y los templates?

Los módulos suelen corresponderse a conjuntos de funcionalidades relacionadas con una Entidad. Se situan en la carpeta modules dentro de cada aplicación.

Las acciones son la equivalencia al controlador del modelo MVC. Tendremos un fichero actions.class.php en cada módulo y por cada función que queramos usar tendremos un procedimiento tipo executeNombreDelProcedimiento()

Los templates son la parte de la vista del modelo MVC. Por cada acción en principio debería de haber un fichero del tipo NombreDelProcedimientoSuccess.php

Vale, y ahora.. ¿dónde uso el formulario?

Pues bien, si deseas usar un formulario únicamente tienes que hacer un “$form = new EntidadForm();” en la acción que desees usar el formulario y añadir un echo $form en la parte de la vista. Por defecto en la vista muestra una estructura de tabla pero si lo deseas puedes acceder a métodos como $form[‘campo’]->render() y otros métodos como podemos ver en http://www.librosweb.es/symfony_formularios/

Muy bien pero…¿cuál es la gracia de ésto?

Pues la gracia está en que sin apenas hacer nada ,añadiendo en un action $form = new EntidadForm() y en un template echo $form, tenemos el formulario por pantalla al acceder a url_del_proyecto/modulo/accion y lo que es mejor, ¡ese formulario hace las validaciones automáticamente!
Si hemos definido que el campo es obligatorio, valida que lo introduzcamos, si hemos dicho que tiene longitud máxima 20, valida que no nos pasemos de 20…

Eso si, por defecto pondrá por pantalla todos los campos salvo los invisibles y es probable que eso no sea exactamente lo que deseemos…

Personalizando nuestro formulario

Pues bien, aquí entran en juego 2 participantes:

1. El EntidadForm.class.php, donde definiremos los campos que queremos usar
2. El nombre_accionSucces.php, si deseamos modificar su apariencia.

En el primer caso bastará con añadir el el método configure():

unset($this[‘nombre_campo1’],$this[‘nombre_campo2’]) para eliminar el campo1 y campo2
$form->useFields(array(‘nombre_campo1’, ‘nombre_campo2’)) para mostar únicamente los campos por pantalla.

En el segundo caso, si hacemos un echo $form no habrá ningún problema puesto que mostrará los campos que tengamos configurados en el form. Si personalizamos el template usando los métodos $form[‘campo’]->render() , etc habrá que añadir una llamada al método
$form->renderHiddenFields() para que nos cargue como hidden los campos ocultos necesarios para trabajar con el form (primary key y similares…).

¡Menos rollo y más ejemplos!

Vale, vale… tampoco hace falta ponerse así.. 😛

Supongamos el siguiente ejemplo: queremos desarrollar un formulario de alta de un usuario en el que únicamente queremos pedirle un email y una contraseña. Evidentemente tendremos más datos para completar su perfil, pero eso queremos hacerlo en una fase posterior.
¿cómo se haría?

Bien, supongamos que la definición de un usuario es…


Profile:
columns:
    id: { integer(4), primary: true, autoincrement: true}
    username: { string(30), notnull: true}
    password: { string(30), notnull: true}
    full_name: { string(255), notnull: true }
    email_address: {string(255), notnull: true}

Como vemos, TODOS los campos son obligatorios.

Una vez generado, el siguiente paso sería editar el ProfileForm.php y dejaríamos algo parecido a esto:

$form->useFields(array('email_address', 'password'));

Una vez hecho ésto crearemos una carpeta ‘user’ con 2 subcarpetas (actions y templates)

En la carpeta actions tendremos algo tal que así…

public function executeRegisterProfile(sfWebRequest $request) {
$form = new ProfileForm();
if ( $request->isMethod('post')) {     $this->form->bind($request->getParameter($this->form->getName()));
if ($this->form->isValid()) {
// Aquí va la acción que deseemos ejecutar cuando la validación ha ido bien
}
}

Por último tunearemos a nuestro gusto registerProfileSuccess.php
Un ejemplo podría ser:

<form action=”>

    <div id=’field’><?php echo $form[‘email_address’]->render() ?> </div>

    <div id=’error’><?php echo $form[‘email_address’]->render() ?> </div>

    <div id=’field’><?php echo $form[‘password’]->render() ?> </div>

    <div id=’error’><?php echo $form[‘password’]->render() ?> </div>

</form>

Anuncios

2 comentarios en “Manos a la obra con Symfony : formularios simples

  1. Diego

    Pues el aporte esta bien, pero lo más complejo es lo del validador, y editar el formulario.

    Por ejemplo aún estoy buscando como hacer para que usuario y contraseña sean validos con instrucciones como sfValidatorDoctrineChoice.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s