Diferencia entre revisiones de «Beta2 CRUD en KumbiaPHP Framework»
(No se muestran 53 ediciones intermedias de 7 usuarios) | |||
Línea 4: | Línea 4: | ||
}} | }} | ||
{{cleanupbox | {{cleanupbox | ||
− | |texto ='''Este ejemplo es funcional para la [[KumbiaPHP_Framework_Versión_1.0_Beta2| Versión Beta2 en desarrollo]]'''<br /> | + | |texto ='''Este ejemplo es funcional para la [[KumbiaPHP_Framework_Versión_1.0_Beta2| Versión Beta2 en desarrollo]]''' es un boceto de CRUD <br /> |
}} | }} | ||
== Introducción == | == Introducción == | ||
Línea 10: | Línea 10: | ||
'''El CRUD de la beta1 sigue funcionando igual en la beta2, pero queda desaconsejado.''' | '''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 == | == Configurando database.ini == | ||
Línea 40: | Línea 41: | ||
public function getMenus($page, $ppage=20) | public function getMenus($page, $ppage=20) | ||
{ | { | ||
− | return $this->paginate("page: $page", "per_page: $ppage"); | + | return $this->paginate("page: $page", "per_page: $ppage", 'order: id desc'); |
} | } | ||
} | } | ||
Línea 49: | Línea 50: | ||
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. | 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:''''' | '''''[app]/controllers/menus_controller.php:''''' | ||
Línea 58: | Línea 58: | ||
* Carga del modelo Menus... | * Carga del modelo Menus... | ||
*/ | */ | ||
− | Load::models('menus'); | + | Load::models('menus');// No es necesario en la v1, los modelos se autocargan |
− | class MenusController extends | + | class MenusController extends AppController { |
/** | /** | ||
* Obtiene una lista para paginar los menus | * Obtiene una lista para paginar los menus | ||
Línea 66: | Línea 66: | ||
public function index($page=1) | public function index($page=1) | ||
{ | { | ||
− | $menu = Menus(); | + | $menu = new Menus(); |
$this->listMenus = $menu->getMenus($page); | $this->listMenus = $menu->getMenus($page); | ||
} | } | ||
Línea 89: | Línea 89: | ||
$menu = new Menus(Input::post('menus')); | $menu = new Menus(Input::post('menus')); | ||
//En caso que falle la operación de guardar | //En caso que falle la operación de guardar | ||
− | if( | + | if($menu->create()){ |
+ | 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'); | Flash::error('Falló Operación'); | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
} | } | ||
} | } | ||
Línea 105: | Línea 102: | ||
/** | /** | ||
* Edita un Registro | * Edita un Registro | ||
+ | * | ||
+ | * @param int $id (requerido) | ||
*/ | */ | ||
− | public function edit($id | + | public function edit($id) |
{ | { | ||
− | $menu = Menus(); | + | $menu = new Menus(); |
− | + | ||
− | |||
− | |||
− | |||
//se verifica si se ha enviado el formulario (submit) | //se verifica si se ha enviado el formulario (submit) | ||
if(Input::hasPost('menus')){ | if(Input::hasPost('menus')){ | ||
− | if( | + | if($menu->update(Input::post('menus'))){ |
+ | Flash::valid('Operación exitosa'); | ||
+ | //enrutando por defecto al index del controller | ||
+ | return Redirect::to(); | ||
+ | } else { | ||
Flash::error('Falló Operación'); | Flash::error('Falló Operación'); | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
} | } | ||
+ | } else { | ||
+ | //Aplicando la autocarga de objeto, para comenzar la edición | ||
+ | $this->menus = $menu->find_by_id((int)$id); | ||
} | } | ||
} | } | ||
Línea 131: | Línea 128: | ||
* Eliminar un menu | * Eliminar un menu | ||
* | * | ||
− | * @param int $id | + | * @param int $id (requerido) |
*/ | */ | ||
− | public function del($id | + | public function del($id) |
{ | { | ||
− | + | $menu = new Menus(); | |
− | + | if ($menu->delete((int)$id)) { | |
− | |||
− | |||
− | |||
Flash::valid('Operación exitosa'); | Flash::valid('Operación exitosa'); | ||
− | + | }else{ | |
+ | Flash::error('Falló Operación'); | ||
} | } | ||
− | //enrutando al index | + | |
− | return | + | //enrutando por defecto al index del controller |
+ | return Redirect::to(); | ||
} | } | ||
} | } | ||
− | |||
</source> | </source> | ||
Línea 156: | Línea 151: | ||
<source lang=php> | <source lang=php> | ||
<div class="content"> | <div class="content"> | ||
− | <?php | + | <?php View::content(); ?> |
<h3>Menus</h3> | <h3>Menus</h3> | ||
<ul> | <ul> | ||
<?php foreach ($listMenus->items as $item) : ?> | <?php foreach ($listMenus->items as $item) : ?> | ||
<li> | <li> | ||
− | <?php echo Html:: | + | <?php echo Html::linkAction("edit/$item->id/", 'Editar') ?> |
− | <?php echo Html:: | + | <?php echo Html::linkAction("del/$item->id/", 'Borrar') ?> |
<strong><?php echo $item->nombre ?> - <?php echo $item->titulo ?></strong> | <strong><?php echo $item->nombre ?> - <?php echo $item->titulo ?></strong> | ||
</li> | </li> | ||
Línea 168: | Línea 163: | ||
</ul> | </ul> | ||
− | <?php if($listMenus->prev) echo Html:: | + | <!-- ejemplo manual de paginador, hay partial listos en formato digg, clasic,.... --> |
− | <?php if($listMenus->next) echo Html:: | + | <?php if($listMenus->prev) echo Html::linkAction("index/$listMenus->prev/", '<< Anterior |'); ?> |
+ | <?php if($listMenus->next) echo Html::linkAction("index/$listMenus->next/", 'Próximo >>'); ?> | ||
</div> | </div> | ||
</source> | </source> | ||
Línea 176: | Línea 172: | ||
'''''[apps]/views/menus/create.phtml''''' | '''''[apps]/views/menus/create.phtml''''' | ||
<source lang=php> | <source lang=php> | ||
+ | <div class="content"> | ||
<?php View::content(); ?> | <?php View::content(); ?> | ||
− | <?php echo Form::open( | + | <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() ?> | <?php echo Form::close() ?> | ||
+ | </div> | ||
</source> | </source> | ||
Línea 198: | Línea 193: | ||
'''''[apps]/views/menus/edit.phtml''''' | '''''[apps]/views/menus/edit.phtml''''' | ||
<source lang=php> | <source lang=php> | ||
+ | <div class="content"> | ||
<?php View::content(); ?> | <?php View::content(); ?> | ||
− | <?php echo Form::open( | + | <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::hidden('menus.id') ?> | ||
− | + | <?php echo Form::submit('Actualizar') ?> | |
− | + | ||
− | |||
<?php echo Form::close() ?> | <?php echo Form::close() ?> | ||
+ | </div> | ||
</source> | </source> | ||
Línea 222: | Línea 216: | ||
* '''index''' es la acción para listar http://localhost/menus/index/ | * '''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 | + | NOTA: index/ se puede pasar de forma implícita o no |
− | buscara por defecto un index | + | KumbiaPHP en caso que no se le pase una acción, buscara por defecto un index. Es decir si colocamos |
http://localhost/menus/ | http://localhost/menus/ | ||
* '''create''' crea un menu en la Base de Datos http://localhost/menus/create/ | * '''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. | * 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. | ||
[[Categoría:Tutoriales KumbiaPHP]] | [[Categoría:Tutoriales KumbiaPHP]] | ||
+ | [[Categoría:Tutoriales KumbiaPHP Beta2]] |
Revisión actual del 15:41 3 feb 2017
{{#if:
|}}Este Artículo cumple con todos los requererimientos de los Kumbieros. |
{{{imageright}}} |
{{#if:
|}}{{{image}}} | Este ejemplo es funcional para la Versión Beta2 en desarrollo es un boceto de CRUD |
{{{imageright}}} |
Sumario
Introducción[editar]
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[editar]
Configurar el archivo databases.ini, con los datos y motor de Base de Datos a utilizar.
Modelo[editar]
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[editar]
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');// No es necesario en la v1, los modelos se autocargan
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->create()){
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 Redirect::to();
} 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 Redirect::to();
}
}
Vistas[editar]
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>
<?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
<div class="content">
<?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() ?>
</div>
[apps]/views/menus/edit.phtml
<div class="content">
<?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() ?>
</div>
Probando el CRUD[editar]
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.