V1.0 CRUD en KumbiaPHP Framework
{{#if:
|}}Este Artículo cumple con todos los requererimientos de los Kumbieros. |
{{{imageright}}} |
{{#if:
|}}{{{image}}} | Este ejemplo de CRUD es funcional para KumbiaPHP V1.0 |
{{{imageright}}} |
Sumario
Introducción
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 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.
[development] host = localhost username = user001 password = 2468 name = MiBase type = mysql
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 ( IdUsuario int unique not null auto_increment, Nombre varchar(100), Apellido varchar(100) not null, Email varchar(100) not null, Telefono varchar(100) not null, Direccion varchar(100) not null, Sexo varchar(100) not null, Edad varchar(100) not null, primary key(IdUsuario) )
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 menús para ser paginados
*
* @param int $page [requerido] página a visualizar
* @param int $ppage [opcional] por defecto 20 por página
*/
public function getMenus($page, $ppage=20)
{
return $this->paginate("page: $page", "per_page: $ppage", 'order: id desc');
}
}
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.
[app]/controllers/menus_controller.php:
<?php
class MenusController extends AppController
{
/**
* Obtiene una lista para paginar los menús
*
* @param int $page [opcional]
*/
public function index($page = 1)
{
$this->listMenus = (new Menus)->getMenus($page);
}
/**
* Crea un Registro
*/
public function create()
{
/**
* Se verifica si el usuario envío el form (submit) y si además
* 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->create()) {
Flash::valid('Operación exitosa');
//Eliminamos el POST, si no queremos que se vean en el form
Input::delete();
return;
}
Flash::error('Falló Operación');
}
}
/**
* Edita un Registro
*
* @param int $id (requerido)
*/
public function edit($id)
{
$menu = new Menus();
//se verifica si se ha enviado el formulario (submit)
if (Input::hasPost('menus')) {
if ($menu->update(Input::post('menus'))) {
Flash::valid('Operación exitosa');
//enrutando por defecto al index del controller
return Redirect::to();
}
Flash::error('Falló Operación');
return;
}
//Aplicando la autocarga de objeto, para comenzar la edición
//Si en la vista usamos menus.nombre, la autocarga buscará una variable llamada $menus
//para apoyar los helpers de Form
$this->menus = $menu->find_by_id((int) $id);
}
/**
* Eliminar un menú
*
* @param int $id (requerido)
*/
public function del($id)
{
if ((new Menus)->delete((int) $id)) {
Flash::valid('Operación exitosa');
} else {
Flash::error('Falló Operación');
}
//enrutando por defecto al index del controller
return Redirect::to();
}
}
Vistas
Agregamos las vistas...
[apps]/views/menus/index.phtml
<div class="content">
<?php View::content() ?>
<h3>Menus</h3>
<ul>
<?php foreach ($listMenus->items as $item) : ?>
<li>
<?= Html::linkAction("edit/$item->id/", 'Editar') ?>
<?= Html::linkAction("del/$item->id/", 'Borrar') ?>
<strong><?= $item->nombre ?> - <?= $item->titulo ?></strong>
</li>
<?php endforeach ?>
</ul>
<!-- ejemplo manual de paginador, hay partial listos en formato digg, clasic,.... -->
<?php if($listMenus->prev) echo Html::linkAction("index/$listMenus->prev/", '<< Anterior |') ?>
<?php if($listMenus->next) echo Html::linkAction("index/$listMenus->next/", 'Próximo >>') ?>
</div>
[apps]/views/menus/create.phtml
<div class="content">
<?php View::content() ?>
<h3>Crear menu<h3>
<?= Form::open(); // por defecto llama a la misma url ?>
<label>Nombre
<?= Form::text('menus.nombre') ?></label>
<label>Título
<?= Form::text('menus.titulo') ?></label>
<?= Form::submit('Agregar') ?>
<?= Form::close() ?>
</div>
[apps]/views/menus/edit.phtml
<div class="content">
<?php View::content() ?>
<h3>Editar menu<h3>
<?= Form::open(); // por defecto llama a la misma url ?>
<label>Nombre
<?= Form::text('menus.nombre') ?></label>
<label>Título
<?= Form::text('menus.titulo') ?></label>
<?= Form::hidden('menus.id') ?>
<?= Form::submit('Actualizar') ?>
<?= Form::close() ?>
</div>
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.