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 50 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.2 sólo se usará lo nuevo y se eliminará lo 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 41: 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 50: 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 59: 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 ApplicationController {
+
class MenusController extends AppController {
 
     /**
 
     /**
 
     * Obtiene una lista para paginar los menus
 
     * Obtiene una lista para paginar los menus
Línea 90: 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(!$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 = 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');
 
 
             }
 
             }
 
         }
 
         }
Línea 106: Línea 102:
 
     /**
 
     /**
 
     * Edita un Registro
 
     * Edita un Registro
 +
    *
 +
    * @param int $id (requerido)
 
     */
 
     */
     public function edit($id = null)
+
     public function edit($id)
 
     {
 
     {
 
         $menu = new Menus();
 
         $menu = new Menus();
    if($id != null){
+
 
        //Aplicando la autocarga de objeto, para comenzar la edición
 
            $this->menus = $menu->find($id);
 
    }
 
 
         //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(!$menus->update(Input::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 = Input::post('menus');
 
            } else {
 
                Flash::valid('Operación exitosa');
 
                //enrutando al index para listar los menus
 
                return Router::redirect('menus');
 
 
             }
 
             }
 +
        } else {
 +
            //Aplicando la autocarga de objeto, para comenzar la edición
 +
            $this->menus = $menu->find_by_id((int)$id);
 
         }
 
         }
 
     }
 
     }
Línea 132: 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();
            $menu = new Menus();
+
        if ($menu->delete((int)$id)) {
            if (!$menu->delete($id)) {
 
                Flash::error('Falló Operación');
 
            }else{
 
 
                 Flash::valid('Operación exitosa');
 
                 Flash::valid('Operación exitosa');
            }
+
        }else{
 +
                Flash::error('Falló Operación');
 
         }
 
         }
         //enrutando al index para listar los menus
+
 
         return Router::redirect('menus');
+
         //enrutando por defecto al index del controller
 +
         return Redirect::to();
 
     }
 
     }
 
}
 
}
?>
 
 
</source>
 
</source>
  
Línea 157: 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 Html::link("menus/edit/$item->id/", 'Editar') ?>
+
         <?php echo Html::linkAction("edit/$item->id/", 'Editar') ?>
         <?php echo Html::link("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 169: Línea 163:
 
     </ul>
 
     </ul>
 
      
 
      
     <?php if($listMenus->prev) echo Html::link("menus/index/$listMenus->prev/", '<< Anterior |'); ?>
+
    <!-- ejemplo manual de paginador, hay partial listos en formato digg, clasic,.... -->
     <?php if($listMenus->next) echo Html::link("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 177: 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('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 Form::text(array('menus.nombre')) ?></td>
+
         <label>Nombre
    </tr>
+
         <?php echo Form::text('menus.nombre') ?></label>
    <tr>
+
       
         <td>Titulo</td>
+
         <label>Título
         <td><?php echo Form::text('menus.titulo') ?></td>
+
         <?php echo Form::text('menus.titulo') ?></label>
    </tr> 
+
 
    <tr>
+
         <?php echo Form::submit('Agregar') ?>
        <td></td>
+
 
         <td><?php echo Form::submit('Agregar') ?></td>
 
    </tr>
 
</table>
 
 
<?php echo Form::close() ?>
 
<?php echo Form::close() ?>
 +
</div>
 
</source>
 
</source>
  
Línea 199: 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('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 Form::text('menus.nombre') ?></td>
+
         <label>Nombre
    </tr>
+
         <?php echo Form::text('menus.nombre') ?></label>
    <tr>
+
 
         <td>Titulo</td>
+
         <label>Título
         <td><?php echo Form::text('menus.titulo') ?></td>
+
         <?php echo Form::text('menus.titulo') ?></label>
    </tr> 
+
 
    <tr>
 
        <td>&nbsp;</td>
 
 
         <?php echo Form::hidden('menus.id') ?>
 
         <?php echo Form::hidden('menus.id') ?>
         <td><?php echo Form::submit('Actualizar') ?></td>
+
         <?php echo Form::submit('Actualizar') ?>
    </tr>
+
 
</table>
 
 
<?php echo Form::close() ?>
 
<?php echo Form::close() ?>
 +
</div>
 
</source>
 
</source>
  
Línea 223: 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/

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.