Como hacer un CRUD en KumbiaPHP Framework

De KumbiaPHP Framework Wiki
Revisión de 00:26 26 jun 2010 por J053D (Discusión | contribuciones) (Vistas)

Saltar a: navegación, buscar



Texto de titular

Este ejemplo nos permitirá de manera sencilla conocer y entender la implementación de un CRUD (Create, Read, Update y Delete en inglés) sin la necesidad de un Scaffold (StandardForm) y un manejo correcto del MVC en KumbiaPHP.

Configurando database.ini

Configurar el archivo databases.ini, con los datos y motor de Base de Datos a utilizar.

Modelo

Crear el Modelo el cual esta viene dado por la definición de una tabla en la BD, para efecto del ejemplo creamos la siguiente tabla (la misma del ejemplo de Auto Carga de Objetos)

CREATE TABLE menus
(
 id           int            unique not null auto_increment,
 nombre       varchar(100),
 titulo       varchar(100)   not null,
 primary key(id)
)

Vamos ahora a definir el modelo el cual nos permite interactuar con la BD.

[app]/models/menus.php:

  1. <?php
  2. class Menus extends ActiveRecord
  3. {
  4.     /**
  5.      * Retorna los menu para ser paginados
  6.      *
  7.      */
  8.     public function getMenus($page, $ppage=20)
  9.     {
  10.         return $this->paginate("page: $page", "per_page: $ppage");
  11.     }
  12. }

Controller

El controlador es encargado de atender las peticiones del cliente (ej. browser) y a su vez de darle una respuesta. En este controller vamos a definir todas las operaciones CRUD que necesitamos.

En esta parte es importante que se haya visto el Tutorial de Auto Carga de Objetos

[app]/controllers/menus_controller.php:

  1. <?php
  2. class MenusController extends ApplicationController {
  3.     //Carga del modelo Menus, porque tenemos la autocarga de modelos desactivada (off)
  4.     public $models = array('menus');   
  5.  
  6.     /**
  7.      * Obtiene una lista para paginar los menus
  8.      */
  9.     public function index($page=1) 
  10.     {
  11.         $this->listMenus = $this->Menus->getMenus($page);
  12.     }
  13.  
  14.     /**
  15.      * Crea un Registro
  16.      */
  17.     public function create ()
  18.     {
  19.         /**
  20.          * Se verifica si el usuario envio el form (submit) y si ademas 
  21.          * dentro del array POST existe uno llamado "menus"
  22.          * el cual aplica la autocarga de objeto para guardar los 
  23.          * datos enviado por POST utilizando autocarga de objeto
  24.          */
  25.         if($this->has_post('menus')){
  26.             /**
  27.              * se le pasa al modelo por constructor los datos del form y ActiveRecord recoge esos datos
  28.              * y los asocia al campo correspondiente siempre y cuando se utilice la convención
  29.              * model.campo
  30.              */
  31.             $menu = new Menus($this->post('menus'));
  32.             //En caso que falle la operación de guardar
  33.             if(!$menu->save()){
  34.                 Flash::error('Falló Operación');
  35.                 //se hacen persistente los datos en el formulario
  36.                 $this->menus = $this->post('menus');
  37.                 /**
  38.                  * NOTA: para que la autocarga aplique de forma correcta, es necesario que llame a la variable de instancia
  39.                  * igual como esta el model de la vista, en este caso el model es "menus" y quedaria $this->menus
  40.                  */
  41.             }else{
  42.                 Flash::success('Operación exitosa');
  43.             }
  44.         }
  45.     }
  46.  
  47.     /**
  48.      * Edita un Registro
  49.      */
  50.     public function edit($id = null)
  51.     {
  52.     	if($id != null){
  53.     	    //Aplicando la autocarga de objeto, para comenzar la edición
  54.             $this->menus = $this->Menus->find($id);
  55.     	}
  56.         //se verifica si se ha enviado el formulario (submit)
  57.         if($this->has_post('menus')){
  58.  
  59.             if(!$this->Menus->update($this->post('menus'))){
  60.                 Flash::error('Falló Operación');
  61.                 //se hacen persistente los datos en el formulario
  62.                 $this->menus = $this->post('menus');
  63.             } else {
  64.                 Router::route_to('action: index');
  65.             }
  66.         }
  67.     }
  68.  
  69.     /**
  70.      * Eliminar un menu
  71.      * 
  72.      * @param int $id
  73.      */
  74.     public function del($id = null)
  75.     {
  76.         if ($id) {
  77.             if (!$this->Menus->delete($id)) {
  78.                 Flash::error('Falló Operación');
  79.             }
  80.         }
  81.         //enrutando al index para listar los menus
  82.         Router::route_to('action: index');
  83.     }
  84. }
  85. ?>

Vistas

Agregamos las vistas...

[apps]/views/menus/index.phtml

  1. <div class="content">
  2.     <?php echo View::content(); ?>
  3.     <h3>Menus</h3>
  4.     <ul>
  5.     <?php foreach ($listMenus->items as $item) : ?>
  6.     <li>
  7.         <?php echo link_to("menus/create",'Agregar'); ?>
  8.         <?php echo link_to(array("menus/edit/$item->id/", 'Editar')) ?>
  9.         <?php echo link_to(array("menus/del/$item->id/", 'Borrar')) ?><br/>
  10.         <strong><?php echo $item->nombre ?> - <?php echo $item->titulo ?></strong>
  11.     </li>
  12.     <?php endforeach; ?>
  13.     </ul>
  14.  
  15.     <?php if($listMenus->prev) echo link_to(array("menus/index/$listMenus->prev/", '<< Anterior |')); ?>
  16.     <?php if($listMenus->next) echo link_to(array("menus/index/$listMenus->next/", 'Próximo >>')); ?>
  17. </div>


[apps]/views/menus/create.phtml

<?php View::content(); ?>
<?php echo form_tag('menus/create/') ?>
<table>
    <tr>
        <td>Nombre</td>
        <td><?php echo text_field_tag(array('menus.nombre')) ?></td>
    </tr>
    <tr>
        <td>Titulo</td>
        <td><?php echo text_field_tag(array('menus.titulo')) ?></td>
    </tr>   
    <tr>
        <td>&nbsp;</td>
        <td><?php echo submit_tag('Agregar') ?></td>
    </tr>
</table>
<?php echo end_form_tag() ?>


[apps]/views/menus/edit.phtml

<?php View::content(); ?>
<?php echo form_tag('menus/edit/') ?>
<table>
    <tr>
        <td>Nombre</td>
        <td><?php echo text_field_tag(array('menus.nombre')) ?></td>
    </tr>
    <tr>
        <td>Titulo</td>
        <td><?php echo text_field_tag(array('menus.titulo')) ?></td>
    </tr>   
    <tr>
        <td>&nbsp;</td>
        <?php echo hidden_field_tag(array('menus.id')) ?>
        <td><?php echo submit_tag('Actualizar') ?></td>
    </tr>
</table>
<?php echo end_form_tag() ?>

Probando el CRUD

Ahora solo resta probar todo el código que hemos generado, en este punto es importante conocer el comportamiento de las URL's en KumbiaPHP.

 NOTA: index/ se puede pasar de forma implícita o no KumbiaPHP en caso que no se le pase una acción 

buscara por defecto un index, es decir si colocamos

 http://localhost/menus/
  • create crea un menu en la Base de Datos http://localhost/menus/create/
  • Las acciones del y edit a ambas se debe entrar desde el index, ya que reciben el parámetros a editar o borrar según el caso.

Descarga

Descarga: app_crud para el core de Spirit v1.0 beta1.

Este ejemplo de descarga esta apuntado a la base de datos test, usuario root y clave 123.