Beta2 CRUD en KumbiaPHP Framework

De KumbiaPHP Framework Wiki
{{#if:Information icon4.png |}}

{{#if:

|}}


{{#if: |}}

{{#if:

|}}


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.

El CRUD de la beta1 sigue funcionando igual en la beta2, pero queda desaconsejado.

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.

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:

<?php
class Menus extends ActiveRecord
{
    /**
     * Retorna los menu para ser paginados
     *
     */
    public function getMenus($page, $ppage=20)
    {
        return $this->paginate("page: $page", "per_page: $ppage");
    }
}

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:

<?php
class MenusController extends ApplicationController {
    //Carga del modelo Menus, porque tenemos la autocarga de modelos desactivada (off)
    public $models = array('menus');   

    /**
     * Obtiene una lista para paginar los menus
     */
    public function index($page=1) 
    {
        $this->listMenus = $this->Menus->getMenus($page);
    }
    
    /**
     * Crea un Registro
     */
    public function create ()
    {
        /**
         * Se verifica si el usuario envio el form (submit) y si ademas 
         * dentro del array POST existe uno llamado "menus"
         * el cual aplica la autocarga de objeto para guardar los 
         * datos enviado por POST utilizando autocarga de objeto
         */
        if($this->has_post('menus')){
            /**
             * se le pasa al modelo por constructor los datos del form y ActiveRecord recoge esos datos
             * y los asocia al campo correspondiente siempre y cuando se utilice la convención
             * model.campo
             */
            $menu = new Menus($this->post('menus'));
            //En caso que falle la operación de guardar
            if(!$menu->save()){
                Flash::error('Falló Operación');
                //se hacen persistente los datos en el formulario
                $this->menus = $this->post('menus');
                /**
                 * NOTA: para que la autocarga aplique de forma correcta, es necesario que llame a la variable de instancia
                 * igual como esta el model de la vista, en este caso el model es "menus" y quedaria $this->menus
                 */
            }else{
                Flash::succes('Operación exitosa');
            }
        }
    }

    /**
     * Edita un Registro
     */
    public function edit($id = null)
    {
    	if($id != null){
    	    //Aplicando la autocarga de objeto, para comenzar la edición
            $this->menus = $this->Menus->find($id);
    	}
        //se verifica si se ha enviado el formulario (submit)
        if($this->has_post('menus')){
            
            if(!$this->Menus->update($this->post('menus'))){
                Flash::error('Falló Operación');
                //se hacen persistente los datos en el formulario
                $this->menus = $this->post('menus');
            } else {
                Router::route_to('action: index');
            }
        }
    }

    /**
     * Eliminar un menu
     * 
     * @param int $id
     */
    public function del($id = null)
    {
        if ($id) {
            if (!$this->Menus->delete($id)) {
                Flash::error('Falló Operación');
            }
        }
        //enrutando al index para listar los menus
        Router::route_to('action: index');
    }
}
?>

Vistas

Agregamos las vistas...

[apps]/views/menus/index.phtml

<div class="content">
    <?php echo View::content(); ?>
    <h3>Menus</h3>
    <ul>
    <?php foreach ($listMenus->items as $item) : ?>
    <li>
        <?php echo link_to(array("menus/edit/$item->id/", 'Editar')) ?>
        <?php echo link_to(array("menus/del/$item->id/", 'Borrar')) ?>
        <strong><?php echo $item->nombre ?> - <?php echo $item->titulo ?></strong>
    </li>
    <?php endforeach; ?>
    </ul>
    
    <?php if($listMenus->prev) echo link_to(array("menus/index/$listMenus->prev/", '<< Anterior |')); ?>
    <?php if($listMenus->next) echo link_to(array("menus/index/$listMenus->next/", 'Próximo >>')); ?>
</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.