Beta2 CRUD en KumbiaPHP Framework
{{#if:
|}}Este Artículo cumple con todos los requererimientos de los Kumbieros. |
{{{imageright}}} |
{{#if:
|}}{{{image}}} | Este ejemplo es funcional para la Versión Beta2 |
{{{imageright}}} |
Sumario
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(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)
{
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(Input::hasPost('menus')){
if(!$this->Menus->update(Input::post('menus'))){
Flash::error('Falló Operación');
//se hacen persistente los datos en el formulario
$this->menus = Input::post('menus');
} else {
return Router::redirect('menus');
}
}
}
/**
* 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
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 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> </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.