Por favor, haz un clic sobre los anuncios cuando pases por mi blog, ya? =)

Zend Framework 7: Mostrando las paginas web

11 comentarios
Esta es la septima parte de mi tutorial de Zend Framework. La parte anterior la puedes ver acá.

En la parte anterior creamos nuestro formulario para poder agregar o modificar álbumes. Ahora vamos a usarlo.

Usando los formularios en nuestras acciones 

Usando un formulario para agregar datos

Abramos la clase AlbumController.php  y coloquemos lo siguente en la acción addAction():

public function addAction()
{
   //creo objeto de formulario
   $form = new Application_Form_Albumform ();
   //le cambio el texto al boton submit del formulario
   $form->submit->setLabel('Add');
   //aisigno el formulario a la vista (la pag web que mostraremos)
   $this->view->form = $form;
}

Y en la vista (/application/views/scripts/album/add.phtml) asociada a nuestra accion, colocamos:

<?php echo $this->form; ?>


Ahora. en nuestro navegador vamos a :

http://localhost/miproyecto/public/album

Y hagamos clic en 'Agregar Album'. Veremos nuestro formulario en la pagina web.







Y nuestro codigo HTML es:
<form id="albums" enctype="application/x-www-form-urlencoded" 
      action="" method="post">
    <dl class="zend_form">
        <dt id="id-label">&#160;</dt>

        <dd id="id-element">
            <input type="hidden" name="id" value="0" id="id" /></dd>

        <dt id="nombre-label">
            <label for="nombre" class="required">Nombre del album:</label></dt>
        <dd id="nombre-element">
            <input type="text" name="nombre" id="nombre" value="" /></dd>

        <dt id="artista_id-label">
            <label for="artista_id" class="required">Seleccione artista:</label></dt>

        <dd id="artista_id-element">
            <select name="artista_id" id="artista_id">
                <option value="1" label="Joaquin sabina">Joaquin sabina</option>
                <option value="2" label="bruce dickinson">bruce dickinson</option>
                <option value="3" label="yann tiernsen">yann tiernsen</option>
                <option value="4" label="Marea">Marea</option>
            </select>
        </dd>

        <dt id="descripcion-label">
            <label for="descripcion" class="optional">Descripcion:</label></dt>
        <dd id="descripcion-element">
            <input type="text" name="descripcion" id="descripcion" value="" /></dd>

        <dt id="fecha-label">
            <label for="fecha" class="required">Fecha lanzamiento:</label></dt>
        <dd id="fecha-element">
            <input type="text" name="fecha" id="fecha" value="30-09-2010" /></dd>

        <dt id="submit-label">&#160;</dt><dd id="submit-element">
            <input type="submit" name="submit" id="submitbutton" value="Agregar Album" />
        </dd></dl>
</form>

Observa el código un momento, aventurado programador. Verás que todos los objetos creados en el formulario se han transformado en los tags HTML correspondientes.

Ahí podemos ver nuestro campo hidden llamado "id", nuestro select llamado "artista_id", etc. Y nuestro botón submit con el texto que le pusimos, "Agregar Album".

Ahora llena los datos para crear un nuevo album y... ¡presiona el boton 'Agregar Album'!

.... verás que no pasa nada de nada.



¿Por qué? Pues porque debemos escribir el código que reciba los datos y los guarde en la tabla. Un formulario se encarga de mostrar los datos que se le indican y de validar que los datos esten correctamente ingresados, pero es la acción (addAction() en nuestro caso, la que debe extraer los datos y hacer algo con ellos. Pero esto no es dificil.

Vamos a cambiar el código de addAction() por el siguiente:

AlbumController.php

public function addAction()
    {
        //titulo para la pagina
        $this->view->title = "Agregar album";
        //valor para <head><title>
        $this->view->headTitle($this->view->title);
        //creo el formulario
        $form = new Application_Form_Albumform ();
        //cambio el texto del boton submit
        $form->submit->setLabel('Agregar Album');
        //lo asigno oa la accion (la pag web que se mostrara)
        $this->view->form = $form;

        //los formularios envian sus datos a traves de POST
        //si vienen datos de post, es que el usuario ha enviado el formulario
        if ($this->getRequest()->isPost())
        {
            //extrae un arreglo con los datos recibidos por POST
            //es decir, los datos clave=>valor del formulario
            $formData = $this->getRequest()->getPost();

            //isValid() revisa todos los validadores y filtros que le
            //aplicamos a los objetos del formulario: se asegura de que los
            //campos requeridos se hallan llenado, que el formato de la fecha
            //sea el correcto, etc
            if ($form->isValid($formData))
            {
                //aca ya estamos seguros de que los datos son validos
                //ahora los extraemos como se ve abajo
                $artista_id = $form->getValue('artista_id');
                $nombre = $form->getValue('nombre');
                $fecha = $form->getValue('fecha');
                $descripcion = $form->getValue('descripcion');

                //como mi fecha viene en el formato dia-mes-año y Mysql
                //guarda fechas en la forma año-mes-dia, procedo a cambiar el formato
                //cambio formato de fecha para mysql
                $fecha = $this->fechaMysql($fecha);

                //creo objeto Album que controla la talba Album de la base de datos
                $albums = new Application_Model_DbTable_Album ();
                //llamo a la funcion agregar, con los datos que recibi del form
                $albums->agregar($artista_id, $nombre, $fecha, $descripcion);

                //indico que despues de haber agregado el album,
                //me redirija a la accion index de AlbumController, es decir,
                //a la pagina que me muestra el listado de albumes
                $this->_helper->redirector('index');
            }
            //si los datos del formulario no son validos, es decir, falta ingresar
            //algunos o el formato es incorrecto...
            else
            {
                //esta funcion vuelve a cargar el formulario con los datos que se
                //enviaron, Y ADEMAS CON LOS MENSAJES DE ERROR, los que se le mostrarán
                //al usuario
                $form->populate($formData);
            }
        }
    }


Los comentarios van explicando los detalles del código. Como se puede apreciar, el proceso para mostrar un formulario es mas o menos este:

public function addAction()
    {       
        //creo el formulario
        $form = new Application_Form_Albumform ();
       
        //lo asigno a la accion (la pag web que se mostrara)
        $this->view->form = $form;
       
        //si vienen datos de post, es que el usuario ha enviado el formulario
        if ($this->getRequest()->isPost())
        {
            //extrae un arreglo con los datos recibidos por POST
                        $formData = $this->getRequest()->getPost();

            //isValid() revisa todos los validadores y filtros            
            if ($form->isValid($formData))
            {               
                //extraemos como se ve abajo
                $artista_id = $form->getValue('artista_id');
                //....

                //creo objeto Album que controla la tabla
                $albums = new Application_Model_DbTable_Album ();
                //inserto datos
                $albums->agregar($artista_id, $nombre, $fecha, $descripcion);

                //redirijo a lapagina del listado
                $this->_helper->redirector('index');
            }
            //si los datos del formulario no son validos...
            else
            {              
                //se vuelve a mostrar el form al usuario
                $form->populate($formData);
            }
        }
    }

Con respecto a la función $this->fechaMysql($fecha);  el código es:

/**
     * cambia una fecha de formato dd-mm-yyyy
     * a formato
     * yyyy-mm-dd
     * @param <type> $fecha
     * @return <type>
     */
    public  function fechaMysql($fecha)
    {
        $arr = split("-", $fecha);
        if (count($arr) != 3)
        {
            return $fecha;
        } else
        {
            return "$arr[2]-$arr[1]-$arr[0]";
        }
    }


Puedes copiar ese código en la clase AlbumController. Como no es una acción, no se necesita crearla usando algún comando de Zend. (tal vez podria optimizarse el codigo de fechaMysql(), pero como este no es un tutorial de PHP, lo dejaremos así.

Ahora, volvamos a ver nuestro listado de álbumes y hagamos clic en 'Agregar Album'
http://localhost/miproyecto/public/album

Y agreguemos algun nuevo album. Notese que si no escribimos un nombre para el album, el formulario mostrará un error:

"Value is required and can't be empty"

que quiere decir "Valor es requerido y no puede estar vacío". Lo mismo pasará si no introducimos una fecha o no lo hacemos con el formato adecuado. Después veremos cómo hacer que estos mensajes se muestren en el idioma que deseemos.

¿Y para qué nos sirven
//titulo para la pagina
$this->view->title = "Agregar album";
//valor para <head><title>
$this->view->headTitle($this->view->title);

si no las mostramos en la página? Tranquilo, ya las mostraremos.

Usando un formulario para modificar datos

Ahora veamos el código para la accion updateAction(). Es muy parecido al de addAction(), pero tiene dos diferencias: debe cargar los datos de un album en el form antes de mostrarlo, y en vez de agregar un album, debe modificar sus datos:



public function updateAction()
    {
        //titulo de la pagina
        $this->view->title = "Modificar album";
        $this->view->headTitle($this->view->title);
        //creo el formulario
        $form = new Application_Form_Albumform ();
        //le pongo otro texto al boton submit
        $form->submit->setLabel('Modificar Album');
        $this->view->form = $form;

        //si el usuario envia datos del form
        if ($this->getRequest()->isPost())
        {
            $formData = $this->getRequest()->getPost();
            //veo si son validos
            if ($form->isValid($formData))
            {
                //extraigo sus datos
                $id = $form->getValue('id');
                $artista_id = $form->getValue('artista_id');
                $nombre = $form->getValue('nombre');
                $fecha = $form->getValue('fecha');
                $descripcion = $form->getValue('descripcion');
                //cambio formato de fecha para mysql
                $fecha = $this->fechaMysql($fecha);
                //creo objeto tabla Album()
                $albums = new Application_Model_DbTable_Album ();
                //LLAMO A FUNCION CAMBIAR, QUE HACE EL UPDATE
                $albums->cambiar($id, $artista_id, $nombre, $fecha, $descripcion);
                //redirijo a accion index
                $this->_helper->redirector('index');
            } 
            //si los daot sno son validos, vuelvo a mostrar el form, con 
            //los mensajes de error
            else
            {
                $form->populate($formData);
            }
        }
        //SI LOS DATOS NO VIENEN POR POST, ENTONCES ESTAMOS LLAMANDO A ESTA FUNCION
        //PARA QUE MUESTRE LOS DATOS DE UN ALBUM
        else
        {
            //YO HE DECIDIDO QUE DEBE VENIR UN PARAMETRO LLAMADO ID, con el 
            //id del album que deseo editar
            //si vienbe un parametro llamado id le asigno su valor a $id; 
            //si no viene, le asigno cero
            //esto es como llamar a $_REQUEST
            $id = $this->_getParam('id', 0);
            //si viene algun id
            if ($id > 0)
            {
               //CREO FORM
                $albums = new Application_Model_DbTable_Album ();
                //extraigo de la talba el album id= $id
                $album= $albums->get($id);
                //populate() toma los datos de $album y los coloca en el formualrio.
                //PARA QUE ESTO FUNCIONE, EL NOMBRE DE LOS OBJETOS DEL FORM DEBE
                //SER IGUAL AL NOMBRE DE LOS CAMPOS EN LA TABLA!!
                $form->populate( $album);
            }
        }
    }

Y en la vista (/application/views/scripts/album/update.phtml) asociada a nuestra accion, colocamos:

<?php echo $this->form; ?>

Los comentarios explican el código. En verdad, lo unico nuevo acá es:

$this->_getParam('id', $defaultValue); que devuelve el valor de algun parametro enviado a la accion, sea por $_GET o $_POST. Y si este parametro no viene, le asigna $defaultValue.
¿Cómo se envian los parametros a una acción? Si se envían por GET, se hacen dentro de la url, de la forma estandar, es decir:
http://localhost/miproyecto/public/album/update?id=5

o bien, usando la sintaxis de ZF
nombreControlador/nombreAccion/nombreparam1/valorParam1/nombreparam2/valorParam2/...

como en
http://localhost/miproyecto/public/album/update/id/5

Ambas sintaxis son aceptadas. ZF generalemente usa la segunda. (Nota: los parámetros enviados por POST también son recogidos por getparam() )

$form->populate( $album); Llena un formulario con los datos contenido en un arreglo. El arreglo debe tener como claves los mismos nombres de los objetos del formulario. Una función muy util para llenar automáticamente un form con los datos desde la base de datos.


Bien, esta es la forma de usar formularios para crear y modificar objetos de nuestra base de datos.
¿Y como lo hacemos para borrar datos? Pues esta vez no usaremos ningún formulario, aunque podría hacerse, si se desea.


Borrando elementos

Si observamos, en el listado de albumes cada fila tiene la opcion Delete, que apunta a

http://localhost/miproyecto/public/album/delete/id/2

 lo que tambien podria escribirse
http://localhost/miproyecto/public/album/delete?id=2

Es decir, se llama al controlador AlbumController, a la acción deleteAction().
Entonces, en AlbumController.php, colocaremos el siguente código en deleteAction()

public function deleteAction()
    {
        //debe venir un parametro, por GET o POST, llamado id, con el id del album a borrar
        $id = $this->_getParam('id', 0);
        //creo objeto tabla Album
        $tabla = new Application_Model_DbTable_Album ();
        //llamo a la funcion borrar
        $tabla->borrar($id);
        //redirijo a la accion index de este controlador, es decir,
        //al listado de albumes
        $this->_helper->redirector('index');
    }


Probemos si funciona. Vamos a http://localhost/miproyecto/public/album y hagamos clic en 'Delete' en cualquier album, y ¡zás! se borra (sería bueno poner algun mensaje de confirmación antes de borrar, tal vez usando javascript en onclick(), para prevenir borrados involuntarios).

El codigo de las demás clases

Bien, de esa forma borramos un álbum. Las otras tablas se usan de una forma similar, así que me limitaré a poner el código de las clases que faltan. Examínenlo con calma, es similar al de la clase álbum. Una vez que lo hayan copiado, seguiremos viendo algunos detalles más del framework.

Para manejar Artistas

Si no lo hemos hecho, creamos el controlador Artista (alt-Z, buscamos create controller):
create controller Artista

/applications/controllers/ArtistaController.php :

Crearemos las acciones (Alt+Z, buscamos create action [nombreAccion] [nombreControlador], si no recuerdas como se hacía, mira acá ):

create action add Artista
create action update Artista
create action delete Artista


 Ahora, reemplazamos por este código:

class ArtistaController extends Zend_Controller_Action {

    public function init()
    {
        $this->initView();
        $this->view->baseUrl = $this->_request->getBaseUrl();
    }

    public function indexAction()
    {
        $table = new Application_Model_DbTable_Artista();
        $this->view->datos = $table->listar();
    }

    public function addAction()
    {
        $this->view->title = "Agregar artista";
        $this->view->headTitle($this->view->title);
        $form = new Application_Form_Artistaform ();
        $form->submit->setLabel('Add');
        $this->view->form = $form;

        if ($this->getRequest()->isPost())
        {
            $formData = $this->getRequest()->getPost();
            if ($form->isValid($formData))
            {
                // $artista_id = $form->getValue('artista_id');
                $nombre = $form->getValue('nombre');
                $fecha_ingreso = $form->getValue('fecha');
                $descripcion = $form->getValue('descripcion');
                $email = $form->getValue('email');

                //cambio formato de fecha para mysql
                $fecha = $this->fechaMysql($fecha);
                $artista = new Application_Model_DbTable_Artista ();
                $artista->agregar($nombre, $descripcion, $email, $fecha_ingreso);

                $this->_helper->redirector('index');
            } else
            {
                $form->populate($formData);
            }
        }
    }

    public function deleteAction()
    {
        $id = $this->_getParam('id', 0);
        $tabla = new Application_Model_DbTable_Artista ();
        $tabla->borrar($id);
        $this->_helper->redirector('index');
    }

    public function updateAction()
    {
        $this->view->title = "Modificar artista";
        $this->view->headTitle($this->view->title);

        $form = new Application_Form_Artistaform ();
        $form->submit->setLabel('Save');
        $this->view->form = $form;

        if ($this->getRequest()->isPost())
        {
            $formData = $this->getRequest()->getPost();
            if ($form->isValid($formData))
            {
                $id = $form->getValue('id');
                $nombre = $form->getValue('nombre');
                $fecha_ingreso = $form->getValue('fecha');
                $descripcion = $form->getValue('descripcion');
                $email = $form->getValue('email');

                //cambio formato de fecha para mysql
                $fecha = $this->fechaMysql($fecha);
                $artista = new Application_Model_DbTable_Artista ();
                $artista->cambiar($id, $nombre, $descripcion, $email, $fecha_ingreso);

                $this->_helper->redirector('index');
            } else
            {
                $form->populate($formData);
            }
        } else
        {
            $id = $this->_getParam('id', 0);
            if ($id > 0)
            {
                $albums = new Application_Model_DbTable_Artista ();
                $form->populate($albums->get($id));
            }
        }
    }
    /**
     * cambia una fecha de formato dd-mm-yyyy
     * a formato
     * yyyy-mm-dd
     * @param <type> $fecha
     * @return <type>
     */
    public  function fechaMysql($fecha)
    {
        $arr = split("-", $fecha);
        if (count($arr) != 3)
        {
            return $fecha;
        } else
        {
            return "$arr[2]-$arr[1]-$arr[0]";
        }
    }
}


Las vistas:

/application/views/scripts/artista/index.phtml

<a href="<?php echo $this->url(array('controller' => 'artista',
            'action' => 'add', 'id' => $d->id)); ?>">Agregar Artista</a>

<table>
    <tr>
        <th>Nombre</th>
        <th>Descripcion</th>
        <th>Email</th>
        <th>Fecha ingreso</th>
        <th>Borrar</th>
    </tr>
    <?php foreach ($this->datos as $d) : ?>
        <tr>
            <td>
                <a href="<?php echo $this->url(array('controller' => 'artista',
            'action' => 'update', 'id' => $d->id)); ?>">
                   <?php echo $this->escape($d->nombre); ?>
            </a>
        </td>
        <td><?php echo $d->descripcion; ?></td>
        <td><?php echo $this->escape($d->email); ?></td>
        <td><?php echo $this->escape($d->fecha_ingreso); ?></td>
        <td>

            <a href="<?php echo $this->url(array('controller' => 'artista',
                       'action' => 'delete', 'id' => $d->id)); ?>">Delete</a>
            </td>
        </tr>
    <?php endforeach; ?>
</table> 


/application/views/scripts/artista/add.phtml
<?php echo $this->form; ?>

/application/views/scripts/artista/update.phtml
<?php echo $this->form; ?>


El formulario:
Lo creamos mediante eo comando de ZF create form (al+Z , buscamos create form)
create form Artista


/application/forms/ArtistaForm.php
class Application_Form_Artistaform extends Zend_Form {

    public function init()
    {
        $this->setName('artista');

        //campo hidden para guardar id de album
        $id = new Zend_Form_Element_Hidden('id');
        $id->addFilter('Int');

        //creamos < input text="" / > para escribir nombre album
        $nombre = new Zend_Form_Element_Text('nombre');
        $nombre->setLabel('Nombre artista:')->setRequired(true)->
                addFilter('StripTags')->addFilter('StringTrim')->
                addValidator('NotEmpty');

        //descripcion album
        $descripcion = new Zend_Form_Element_Text('descripcion');
        $descripcion->setLabel('Descripcion:')->setRequired(false)->addFilter('StripTags')->addFilter('StringTrim');

        //fecha lanzamiento
        $fecha = new Zend_Form_Element_Text('fecha_ingreso');
        $fecha->setLabel('Fecha Ingreso:')->setRequired(true)->addFilter('StripTags')->
                addFilter('StringTrim')->addValidator('NotEmpty');
        //creo un validador de formato de fecha
        $valiDate = new Zend_Validate_Date();
        $valiDate->setFormat('dd-mm-YYYY');
        $fecha->addValidator($valiDate);
        $fecha->setValue(date("d-m-Y"));

        $mail = new Zend_Form_Element_Text('email');
        $mail->setLabel('E-mail:')->setRequired(false)->addFilter('StripTags')->
                addFilter('StringTrim');
        $validator = new Zend_Validate_EmailAddress();
        $mail->addValidator($validator);
        $mail->setValue('artista@mail.cl');


        //boton para enviar formulario
        $submit = new Zend_Form_Element_Submit('submit');
        $submit->setAttrib('id', 'submitbutton');

        //agregolos objetos creados al formulario
        $this->addElements(array($id, $nombre,
            $descripcion, $fecha, $mail, $submit));
    }
}

Habiendo creado las acciones (addAction(), updateAction() y deleteAction(), pues indexAction() se crea cuando se crea el controlador),  llenado las vistas asociadas (index.phtml, add.phtml, update.phtml, delete.phtml) y creado el formulario que se usará, estamos en condiciones de administrar a los artistas.

Dirjamos nuestra navegador a
http://localhost/miproyecto/public/artista

y veremos el listado de artistas y podremos agregar, editar y eliminar artistas.

Para manejar Temas (temas musicales me refiero)


Si no lo hemos hecho, creamos el controlador Tema(alt-Z, buscamos create controller):
create controller Tema
Y creamos las acciones (create action NombreAccion NombreControlador)
create action add Tema
create action update Tema
create action delete Tema

/applicacion/controllers/TemaController.php debe quedar asi:

class TemaController extends Zend_Controller_Action {

    public function init()
    {
        $this->initView();
        $this->view->baseUrl = $this->_request->getBaseUrl();
    }

    public function indexAction()
    {
        $table = new Application_Model_DbTable_Temas();
        $this->view->datos = $table->listar();
    }

    public function addAction()
    {
        $this->view->title = "Agregar tema";
        $this->view->headTitle($this->view->title);
        $form = new Application_Form_Temaform ();
        $form->submit->setLabel('Add');
        $this->view->form = $form;

        if ($this->getRequest()->isPost())
        {
            $formData = $this->getRequest()->getPost();
            if ($form->isValid($formData))
            {
                // $artista_id = $form->getValue('artista_id');
                $album = $form->getValue('album_id');
                $titulo = $form->getValue('titulo');
                $duracion = $form->getValue('duracion');

                $tema = new Application_Model_DbTable_Temas ();
                $tema->agregar($album, $titulo, $duracion);

                $this->_helper->redirector('index');
            } else
            {
                $form->populate($formData);
            }
        }
    }

    public function deleteAction()
    {
        $id = $this->_getParam('id', 0);
        $tabla = new Application_Model_DbTable_Temas ();
        $tabla->borrar($id);
        $this->_helper->redirector('index');
    }

    public function updateAction()
    {
        $this->view->title = "Modificar artista";
        $this->view->headTitle($this->view->title);

        $form = new Application_Form_Temaform ();
        $form->submit->setLabel('Save');
        $this->view->form = $form;

        if ($this->getRequest()->isPost())
        {
            $formData = $this->getRequest()->getPost();
            if ($form->isValid($formData))
            {
                $id = $form->getValue('id');
                 // $artista_id = $form->getValue('artista_id');
                $album = $form->getValue('album_id');
                $titulo = $form->getValue('titulo');
                $duracion = $form->getValue('duracion');

                $tema = new Application_Model_DbTable_Temas ();
                $tema->cambiar($id, $album, $titulo, $duracion);

                $this->_helper->redirector('index');
            } else
            {
                $form->populate($formData);
            }
        } else
        {
            $id = $this->_getParam('id', 0);
            if ($id > 0)
            {
                $albums = new Application_Model_DbTable_Temas ();
                $form->populate($albums->get($id));
            }
        }
    }
}

Las vistas asociadas

/applicacion/views/scripts/tema/index.phtml :
<a href="<?php echo $this->url(array('controller' => 'tema',
            'action' => 'add', 'id' => $d->id)); ?>">Agregar Tema</a>

<table>
    <tr>
        <th>Titulo</th>
        <th>Album</th>
        <th>Duracion</th>
        <th>Borrar</th>
    </tr>
    <?php foreach ($this->datos as $d) : ?>
        <tr>
            <td>
                <a href="<?php echo $this->url(array('controller' => 'tema',
            'action' => 'update', 'id' => $d->id)); ?>">
                   <?php echo $d->titulo; ?>
            </a>
        </td>
        <td><?php echo $this->escape($d->album_id); ?></td>
        <td><?php echo $this->escape($d->duracion); ?></td>
        <td>

            <a href="<?php echo $this->url(array('controller' => 'tema',
                       'action' => 'delete', 'id' => $d->id)); ?>">Delete</a>
            </td>
        </tr>
    <?php endforeach; ?>
</table>

/applicacion/views/scripts/tema/add.phtml :
 <?php echo $this->form; ?>

/applicacion/views/scripts/tema/update.phtml :
 <?php echo $this->form; ?>

El formulario:

Creamos un formulario (alt+Z, buscamos create form)
create form Tema

Y en /application/forms/TemaForm.php colocamos:

class Application_Form_Temaform extends Zend_Form {

    public function init()
    {
        $this->setName('tema');

        //campo hidden para guardar id de album
        $id = new Zend_Form_Element_Hidden('id');
        $id->addFilter('Int');

        //creamos <input text> para escribir nombre album
        $nombre = new Zend_Form_Element_Text('titulo');
        $nombre->setLabel('Titulo:')->setRequired(true)->
                addFilter('StripTags')->addFilter('StringTrim')->
                addValidator('NotEmpty');

        //creamos select para seleccionar artista
        $album = new Zend_Form_Element_Select('album_id');
        $album->setLabel('Pertenece a  Album:')->setRequired(true);
        //cargo en un select los tipos de usuario
        $table = new Application_Model_DbTable_Album();
        //obtengo listado de todos los artistas y los recorro en un
        //arreglo para agregarlos a la lista
        foreach ($table->listar() as $c)
        {
            $album->addMultiOption($c->id, $c->nombre);
        }


        //fecha lanzamiento
        $duracion = new Zend_Form_Element_Text('duracion');
        $duracion->setLabel('Duracion (mm:ss):')->setRequired(true)->addFilter('StripTags')->
                addFilter('StringTrim')->addValidator('NotEmpty');
        //creo un validador de formato de fecha
        $valiDate = new Zend_Validate_Date();
        $valiDate->setFormat('mm:ss');
        $duracion->addValidator($valiDate);
        $duracion->setValue('00:00');

        //boton para enviar formulario
        $submit = new Zend_Form_Element_Submit('submit');
        $submit->setAttrib('id', 'submitbutton');

        //agregolos objetos creados al formulario
        $this->addElements(array($id, $nombre,
            $album, $duracion, $submit));
    }

}

Bien, con esto ya tenemos una aplicación que mas o menos funciona.

Pero le faltan algunas cosas. Por ejemplo, hasta ahora solo hemos mostrado una tabla y un form, pero si vemos el código fuente, no hay tags <html></html> en nuestras páginas web. Para hacer una pagina web completa, tendriamos que poner el codigo de la pagina completa en cada vista ("pagina".phtml como add.phtml, index.phtml, etc.), algo como :

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title></title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body>
    <?php echo $this->form; ?>
  </body>
</html>

Pero ¿acaso eso significa que EN CADA VISTA TENDREMOS QUE HACER ESO?
¿Y qué hay si despues queremos poner algu menú o un banner en nuestra página? ¿Tendremos que hacer los cambios en todas las vistas (que hasta ahora son nueve)?

Pues... ¡NO! Más detalles en el próximo artículo.

11 comentarios :

Anónimo dijo...

Flaco a vos hay que hacerte un monumento.
Este tutorial es muy bueno y explicativo, lo vengo siguiendo, asi que espero el proximo!

Saludos! Seguí asi!

Angelorum dijo...

Gracias :D

mañana subo la siguiente parte

Anónimo dijo...

Definitivamente, estoy ansioso de ver el manual en PDF. Gracias por toda esta información

Unknown dijo...

TENGO UN PROBLEMA AL MOMENTO
DE CARGAR LA ACCIÓN ADD
DONDE ESTA EL FORMULARIO


ME SALE ESTE ERROR:
Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator, admin@example.com and inform them of the time the error occurred, and anything you might have done that may have caused the error.

More information about this error may be available in the server error log.

Additionally, a 500 Internal Server Error error was encountered while trying to use an ErrorDocument to handle the request.




SI ME PUDIERAN AYUDAR POR FAVOR.....

Ricard dijo...

Saludos Angelorum, estoy siguiendo tu tutorial, una perfecta explicación de como aprender Zend rapido y sencillo!! Te felicito.
Pero me ha salido un problemilla, cuando voy a crear la primera acción en AlbumController el add!! (Alt+z)->act-> add album, me crear la acción pero me da un mensaje en rojo
*************
Creating an action named add inside controller at C:\xampp\htdocs\miproyecto/application/controllers/AlbumController.php
PHP Notice: Undefined variable: testActionMethodResource in C:\xampp\php\PEAR\Zend\Tool\Project\Provider\Action.php on line 214
**************
como crea la acción yo igual añado el codigo dentro de la acción, y cuando vay al localhost/miproyecto/album le doy al boton agregar y se me queda la pantalla en blanco :S es por el error o porque estoy haciendo algo mal?
ayudaaaa

Sergio dijo...

Me pasa lo mismo que a Ricard, que me aparece la pantalla en blanco cuando le doy al enlace de agregar.
Lo del mensaje también me pasa, pero creo que no tiene nada que ver con el problema que tenemos ya que en el IndexController he creado un método prueba mediante el Run Zend Command. También me ha salido el mensaje rojo en el output de Netbeans, pero con todo y eso he creado una variable text con un texto predefinido, he hecho un echo en el prueba.phtml y ha salido el texto perfectamente.
Con todo esto deduzco que el problema podría estar en la interpretación del formulario.

Sergio dijo...

¡Solucionado!

Explico el motivo por si alguien se encuentra con el mismo problema:

La clave está al crear el formulario; al hacerlo mediante el Run Zend Command (create: form), como parámetro no tenemos que poner 'album' a secas, sino 'albumform'.

No me preguntéis por qué, pero con eso ya funciona :)

Anónimo dijo...

Excelente tutorial gracias por tomarte el tiempo de crearlo saludos!!!

Unknown dijo...

Excelente tutorial....

Espero que puedan ayudarme con lo siguiente:

Message: script 'album/add.phtml' not found in path (/Applications/XAMPP/xamppfiles/htdocs/PhpProject1/application/views/scripts/)

No se generó el add.phtml

Hice algo mal?

Unknown dijo...

Para quien no sepa cómo va lo de agregar la nueva acción o action os digo la solución.

Hacemos el proceso tal y como se explica en este maravilloso tutorial pero a la hora de hacer la llamada a zf.bat mediante el atajo de teclado Alt+Z tenemos que poner primero el nombre del action y luego el del controlador. Quedaría así

create action add album y ya está. ¡Solucionado!

si tenéis alguna duda escribidme a jesus@cedesa.es o bien vistad CEDESA Ingeniería

Ignacio Daluz dijo...

Primeramente, muchas gracias por estos aportes!!!! Realmente son muy buenos.

tengo un problema, luego de cargar todo el codigo en el primer formulario para agregar el album, me sale esto:
An error occurred
Application error

trate de quitar lo ultimo de codigo que habia ingresado, hasta varios pasos atras, pero no tengo solucion.
intente cambiar el entorno
// Define application environment
defined('APPLICATION_ENV')
|| define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'development')); estaba en production, para tratar de que me mostrara el codigo del error, pero no me ha dado resultados.

si esta a tu alcance, agradezco ayuda,
cordial saludo

ignacio daluz