Diferencia entre revisiones de «Beta2 CRUD en KumbiaPHP Framework»

De KumbiaPHP Framework Wiki
m (Revertidos los cambios de Joanhey (disc.) a la última edición de Pau curro)
 
(No se muestran 68 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_Spirit | Versión Beta2]]'''<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 />
 
}}
 
}}
== Texto de titular ==
+
== 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 (<s>StandardForm</s>) y un manejo correcto del MVC en KumbiaPHP.
 
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 (<s>StandardForm</s>) y un manejo correcto del MVC en KumbiaPHP.
  
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 15: Línea 16:
  
 
== Modelo ==
 
== 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 (la misma del ejemplo de [[AutoCarga_de_Objetos_KumbiaPHP | Auto Carga de Objetos]])
+
'''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.
  
 
<pre>
 
<pre>
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.
  
En esta parte es importante que se haya visto el [[AutoCarga_de_Objetos_KumbiaPHP | Tutorial de Auto Carga de Objetos]]
 
  
 
'''''[app]/controllers/menus_controller.php:'''''
 
'''''[app]/controllers/menus_controller.php:'''''
Línea 55: Línea 55:
 
<source lang="php">
 
<source lang="php">
 
<?php
 
<?php
class MenusController extends ApplicationController {
+
/**
    //Carga del modelo Menus, porque tenemos la autocarga de modelos desactivada (off)
+
* Carga del modelo Menus...
    public $models = array('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
 
     * Obtiene una lista para paginar los menus
Línea 64: Línea 66:
 
     public function index($page=1)  
 
     public function index($page=1)  
 
     {
 
     {
         $this->listMenus = $this->Menus->getMenus($page);
+
        $menu = new Menus();
 +
         $this->listMenus = $menu->getMenus($page);
 
     }
 
     }
 
      
 
      
Línea 78: Línea 81:
 
         * datos enviado por POST utilizando autocarga de objeto
 
         * datos enviado por POST utilizando autocarga de objeto
 
         */
 
         */
         if($this->has_post('menus')){
+
         if(Input::hasPost('menus')){
 
             /**
 
             /**
 
             * se le pasa al modelo por constructor los datos del form y ActiveRecord recoge esos datos
 
             * se le pasa al modelo por constructor los datos del form y ActiveRecord recoge esos datos
Línea 84: Línea 87:
 
             * model.campo
 
             * model.campo
 
             */
 
             */
             $menu = new Menus($this->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(!$menu->save()){
+
             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');
                //se hacen persistente los datos en el formulario
 
                $this->menus = $this->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::succes('Operación exitosa');
 
 
             }
 
             }
 
         }
 
         }
Línea 102: Línea 102:
 
     /**
 
     /**
 
     * Edita un Registro
 
     * Edita un Registro
 +
    *
 +
    * @param int $id (requerido)
 
     */
 
     */
     public function edit($id = null)
+
     public function edit($id)
 
     {
 
     {
    if($id != null){
+
        $menu = new Menus();
        //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)
 
         //se verifica si se ha enviado el formulario (submit)
         if($this->has_post('menus')){
+
         if(Input::hasPost('menus')){
 
              
 
              
             if(!$this->Menus->update($this->post('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');
 
                 Flash::error('Falló Operación');
                //se hacen persistente los datos en el formulario
 
                $this->menus = $this->post('menus');
 
            } else {
 
                Router::route_to('action: index');
 
 
             }
 
             }
 +
        } else {
 +
            //Aplicando la autocarga de objeto, para comenzar la edición
 +
            $this->menus = $menu->find_by_id((int)$id);
 
         }
 
         }
 
     }
 
     }
Línea 125: Línea 128:
 
     * Eliminar un menu
 
     * Eliminar un menu
 
     *  
 
     *  
     * @param int $id
+
     * @param int $id (requerido)
 
     */
 
     */
     public function del($id = null)
+
     public function del($id)
 
     {
 
     {
         if ($id) {
+
         $menu = new Menus();
            if (!$this->Menus->delete($id)) {
+
        if ($menu->delete((int)$id)) {
                 Flash::error('Falló Operación');
+
                Flash::valid('Operación exitosa');
            }
+
        }else{
 +
                 Flash::error('Falló Operación');  
 
         }
 
         }
         //enrutando al index para listar los menus
+
 
         Router::route_to('action: index');
+
         //enrutando por defecto al index del controller
 +
         return Redirect::to();
 
     }
 
     }
 
}
 
}
?>
 
 
</source>
 
</source>
  
Línea 147: Línea 151:
 
<source lang=php>
 
<source lang=php>
 
<div class="content">
 
<div class="content">
     <?php echo View::content(); ?>
+
     <?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 link_to(array("menus/edit/$item->id/", 'Editar')) ?>
+
         <?php echo Html::linkAction("edit/$item->id/", 'Editar') ?>
         <?php echo link_to(array("menus/del/$item->id/", 'Borrar')) ?>
+
         <?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 159: Línea 163:
 
     </ul>
 
     </ul>
 
      
 
      
     <?php if($listMenus->prev) echo link_to(array("menus/index/$listMenus->prev/", '<< Anterior |')); ?>
+
    <!-- ejemplo manual de paginador, hay partial listos en formato digg, clasic,.... -->
     <?php if($listMenus->next) echo link_to(array("menus/index/$listMenus->next/", 'Próximo >>')); ?>
+
     <?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 167: 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_tag('menus/create/') ?>
+
<h3>Crear menu<h3>
<table>
+
 
    <tr>
+
<?php echo Form::open(); // por defecto llama a la misma url ?>
         <td>Nombre</td>
+
       
         <td><?php echo text_field_tag(array('menus.nombre')) ?></td>
+
         <label>Nombre
    </tr>
+
         <?php echo Form::text('menus.nombre') ?></label>
    <tr>
+
       
         <td>Titulo</td>
+
         <label>Título
         <td><?php echo text_field_tag(array('menus.titulo')) ?></td>
+
         <?php echo Form::text('menus.titulo') ?></label>
    </tr> 
+
 
    <tr>
+
         <?php echo Form::submit('Agregar') ?>
        <td>&nbsp;</td>
+
 
         <td><?php echo submit_tag('Agregar') ?></td>
+
<?php echo Form::close() ?>
    </tr>
+
</div>
</table>
 
<?php echo end_form_tag() ?>
 
 
</source>
 
</source>
  
Línea 189: 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_tag('menus/edit/') ?>
+
<h3>Editar menu<h3>
<table>
+
 
    <tr>
+
<?php echo Form::open(); // por defecto llama a la misma url ?>
         <td>Nombre</td>
+
 
         <td><?php echo text_field_tag(array('menus.nombre')) ?></td>
+
         <label>Nombre
    </tr>
+
         <?php echo Form::text('menus.nombre') ?></label>
    <tr>
+
 
         <td>Titulo</td>
+
         <label>Título
         <td><?php echo text_field_tag(array('menus.titulo')) ?></td>
+
         <?php echo Form::text('menus.titulo') ?></label>
    </tr> 
+
 
    <tr>
+
         <?php echo Form::hidden('menus.id') ?>
        <td>&nbsp;</td>
+
         <?php echo Form::submit('Actualizar') ?>
         <?php echo hidden_field_tag(array('menus.id')) ?>
+
 
         <td><?php echo submit_tag('Actualizar') ?></td>
+
<?php echo Form::close() ?>
    </tr>
+
</div>
</table>
 
<?php echo end_form_tag() ?>
 
 
</source>
 
</source>
  
Línea 213: 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, es decir si colocamos
+
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:Information icon4.png |}}

{{#if:

|}}


{{#if: |}}

{{#if:

|}}


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.

 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.