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. En la versión 1.0 se podrá usar de las 2 maneras. Y la 1.2 que saldrá junto a la 1.0 sólo se usará lo nuevo y se eliminará lo 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", '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 /** * Carga del modelo Menus... */ Load::models('menus'); class MenusController extends AppController { /** * Obtiene una lista para paginar los menus */ public function index($page=1) { $menu = new 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::valid('Operación exitosa'); //Eliminamos el POST, si no queremos que se vean en el form Input::delete(); return; }else{ 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 Router::redirect(); } else { Flash::error('Falló Operación'); } } else { //Aplicando la autocarga de objeto, para comenzar la edición $this->menus = $menu->find_by_id((int)$id); } } /** * Eliminar un menu * * @param int $id (requerido) */ public function del($id) { $menu = new Menus(); if ($menu->delete((int)$id)) { Flash::valid('Operación exitosa'); }else{ Flash::error('Falló Operación'); } //enrutando por defecto al index del controller return Router::redirect(); } }
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::linkAction("edit/$item->id/", 'Editar') ?> <?php echo Html::linkAction("del/$item->id/", 'Borrar') ?> <strong><?php echo $item->nombre ?> - <?php echo $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
<?php View::content(); ?> <h3>Crear menu<h3> <?php echo Form::open(); // por defecto llama a la misma url ?> <label>Nombre <?php echo Form::text('menus.nombre') ?></label> <label>Título <?php echo Form::text('menus.titulo') ?></label> <?php echo Form::submit('Agregar') ?> <?php echo Form::close() ?>
[apps]/views/menus/edit.phtml
<?php View::content(); ?> <h3>Editar menu<h3> <?php echo Form::open(); // por defecto llama a la misma url ?> <label>Nombre <?php echo Form::text('menus.nombre') ?></label> <label>Título <?php echo Form::text('menus.titulo') ?></label> <?php echo Form::hidden('menus.id') ?> <?php echo Form::submit('Actualizar') ?> <?php echo Form::close() ?>