Beta2 CRUD en KumbiaPHP Framework
![]() |
Este Artículo cumple con todos los requererimientos de los Kumbieros. |
Este ejemplo es funcional para la Versión Beta2 |
Contenido
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 /** * Carga del modelo Menus... */ Load::models('menus'); class MenusController extends ApplicationController { /** * Obtiene una lista para paginar los menus */ public function index($page=1) { $menu = Menus(); $this->listMenus = $menu->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(Input::hasPost('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(Input::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 = Input::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::valid('Operación exitosa'); } } } /** * Edita un Registro */ public function edit($id = null) { $menu = Menus(); if($id != null){ //Aplicando la autocarga de objeto, para comenzar la edición $this->menus = $menu->find($id); } //se verifica si se ha enviado el formulario (submit) if(Input::hasPost('menus')){ if(!$menus->update(Input::post('menus'))){ Flash::error('Falló Operación'); //se hacen persistente los datos en el formulario $this->menus = Input::post('menus'); } else { Flash::valid('Operación exitosa'); //enrutando al index para listar los menus return Router::redirect('menus'); } } } /** * Eliminar un menu * * @param int $id */ public function del($id = null) { if ($id) { $menu = Menus(); if (!$menu->delete($id)) { Flash::error('Falló Operación'); }else{ Flash::valid('Operación exitosa'); } } //enrutando al index para listar los menus return Router::redirect('menus/'); } } ?>
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 Html::link("menus/edit/$item->id/", 'Editar') ?> <?php echo Html::link("menus/del/$item->id/", 'Borrar') ?> <strong><?php echo $item->nombre ?> - <?php echo $item->titulo ?></strong> </li> <?php endforeach; ?> </ul> <?php if($listMenus->prev) echo Html::link("menus/index/$listMenus->prev/", '<< Anterior |'); ?> <?php if($listMenus->next) echo Html::link(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> </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> </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.
- index es la acción para listar http://localhost/menus/index/
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.