Creando un blog con Zend Framework – Parte 5

Creando un blog con Zend Framework – Parte 5

Zend Form

Hoy vamos a ver como armar los formularios. Para eso vamos a usar la carpeta forms dentro de nuestras vistas, ahí vamos a crear una clase para cada formulario.

Muchas ponen los formularios en el controller y algún que otro loco en el modelo, y también en los helpers, nosotros vamos a crear una clase para que resuelva nuestro problema en la carpeta forms de la vista del modulo correspondiente.

Nuestra clase va a tener un solo método init() y va a extender de Zend_Form.

El ejemplo a continuación es el de login de usuarios, con 3 elementos, usuario, password, y el botón de submit.

  1.  
  2. <?php
  3. class forms_Authentication extends Zend_Form
  4. {
  5.     public function init ()
  6.     {
  7.         /**
  8.          * Identificador para nuestro formulario
  9.          */
  10.         $this->setName(‘authentication’);
  11.         /**
  12.          * Creamos un elemento de tipo Text
  13.          * – Seteamos el texto que queremos que represente a este campo
  14.          * – Agregamos un filtro, que hace que cuando enviamos el
  15.          *   fomrulario ponga todo el valor del campo en minuscula
  16.          * – Tambien especificamos que el campo es obligatorio.
  17.          * – Y agregamos el validador para preguntar si el campo es un campo valido
  18.          */
  19.         $username = new Zend_Form_Element_Text(‘username’);
  20.         $username->setLabel(‘Email’)
  21.             ->addFilter(‘StringToLower’)
  22.             ->setRequired(true)
  23.             ->addValidator(‘NotEmpty’, true);
  24.         /**
  25.          * Creamos el elemento tipo password.
  26.          * Aca vamos a generar el campo para la clave
  27.          */
  28.         $password = new Zend_Form_Element_Password(‘password’);
  29.         $password->setLabel(‘Clave’)
  30.             ->setRequired(true)
  31.             ->addValidator(‘NotEmpty’, true);
  32.         /**
  33.          * El boton para enviar el formulario
  34.          */
  35.         $submit = new Zend_Form_Element_Submit(’submit’);
  36.         $submit->setLabel(‘Entrar’);
  37.         /**
  38.          * Agregamos los elementos al formulario
  39.          */
  40.         $this->addElements(array($username , $password , $submit));
  41.     }
  42. }
  43.  
  44.  

Como se habrán dado cuenta nuestro archivo se va a llamar Authentication.php

Cada vez que se instancie y se imprima este objeto nos va a dibujar automaticamente nuestro formulario.

Ahora vamos a llamar a mostrar el formulario en nuestras paginas.

Vamos al controller

  1.  
  2.  
  3. <?php
  4. class Admin_IndexController extends Blogzf_Controller_Action
  5. {
  6.     public function indexAction ()
  7.     {
  8.         /**
  9.           * Instanciamos nuestro formulario
  10.           */
  11.         $form = new forms_Authentication();
  12.         if ($this->_request->isPost()) {
  13.             $credentials = $this->_request->getPost();
  14.             if ($form->isValid($credentials)) {
  15.                 $authAdapter = new Zend_Auth_Adapter_DbTable(
  16.                     Zend_Db_Table::getDefaultAdapter(),
  17.                         ‘users’,‘username’,‘password’, ‘MD5(?) AND status="ENABLED"’);
  18.  
  19.                 // Set the input credential values to authenticate against
  20.                 $authAdapter->setIdentity($credentials[‘username’]);
  21.                 $authAdapter->setCredential($credentials[‘password’]);
  22.                 $result = Zend_Auth::getInstance()->authenticate( $authAdapter );
  23.                 if ($result->isValid()) {
  24.                     $this->_redirect(‘/admin/dashboard/’);
  25.                 }
  26.                 $this->_flashMessenger->addError(‘usuario incorrecto’);
  27.                 $form->populate($credentials);
  28.             } else {
  29.                 $this->_flashMessenger->addError(‘Hay datos invalidos o vacios’);
  30.                 $form->populate($credentials);
  31.             }
  32.         }
  33.         $this->view->form = $form;
  34.     }
  35. }
  36.  
  37.  

En nuestro indexAction vemos que lo primero que se hace es instanciar la clase forms_Authentication que creamos anteriormente. Seguidamente tenemos una linea que pregunta si hay datos enviados via post, en nuestro caso esta condicion va a ser falsa porque todavia no enviamos ningun formulario. Asi que vamos a explicar lo que hacemos en caso de que no se haya enviado el formulario aun.

  1. $this->view->form = $form;

Aca estamos pasando a la vista nuestro objeto Form. Para dibujar nuestro formulario desde el controller esto es lo unico que tenemos que hacer.

Ahora pasemos a la vista. Y veamos como queda de complejo nuestro index/index.phtml

  1. <?=$this->form?>

Esto solo y nos deberia mostrar lo siguiente.

login

Ahora que ya tenemos nuestro formulario vamos a completar datos y enviarlo. Completamos con cualquier dato. Pero para probar vamos a completar el usuario y no la clave. Para aprender a usar los Validators.

Si hacemos esto nos deberia aparecer el formulario resaltando el problema por el cual no proceso el formulario.

login-error

Y como hicimos esto?

Muy facil, cuando creamos el formulario, no especificamos a donde queremos que envie los datos, entonces los envia a si mismo.

Esto quiere decir que enviamos un post a indexAction, ahora el condicional if ($this->_request->isPost()) nos va a dar verdadero.

Lo siguiente que preguntamos es si los datos de nuestro formulario son validos, en el caso que lo sean vamos a seguir con el logueo de usuario. En caso contrario vamos a volver a mostrar el formulario con los datos que envio el usuario, y agregano los errores correspondientes, esto lo hacemos llamando al metodo populate de Zend_Form, que solo se encarga de completar los datos que vinieron por post en el elemento correspondiente, y los errores. Lamentablemente los errores estan en ingles, y por ahora vamos a dejarlo asi. Tambien agregamos un error con el flashHelper de Zsamer.

Ahora probemos completar todos los datos, si corresponden a los de la base de datos te va a loguear, y redireccionar a tu dashboard.

Zend Auth.

Una de las cosas que mas me sorprendio cuando empeze con Zend Framework, fue la cantidad de tutoriales sobre este componente. La verdad que no tiene mucha mistica, pero el uso que le damos en blogzf es bastante basico y comun,

Primero instanciamos la clase Zend_Auth_Adapter_DbTable, y le pasamos los datos de nuestra tabla donde guardamos los datos de los usuarios, seteamos la columna donde esta el identificador, y la columna donde esta la clave (credencial).

Ya con la instancia seteamos los datos que vinieron con el formulario.

Y si Zend_Auth::getInstance()->authenticate( $authAdapter )->isValid() nos da true, estamos logueados.

Facil?, si es Zend.

Ahora necesitamos preguntar en cada modulo que lo requiera si el usuario ya esta logueado, en caso que no lo este vamos a redireccionarlo a la pantalla de login. En nuestro sistema lo vamos a hacer desde el plugin de Blogzf_Controller_Plugin_Backoffice.

  1.  
  2.  
  3. $auth = Zend_Auth::getInstance();
  4. if ( $request->module == ‘admin’ ) {
  5.     if( !$auth->hasIdentity() && $request->controller != ‘index’ ) {
  6.         header(‘Location: /admin/’);
  7.     } elseif ( $auth->hasIdentity()  && $request->controller == ‘index’ ) {
  8.         header(‘Location: /admin/dashboard/’);
  9.     }
  10. }
  11.  
  12.  

Con esto es suficiente.