Diferencia entre revisiones de «Como hacer un CRUD en KumbiaPHP Framework»

De KumbiaPHP Framework Wiki
Línea 1: Línea 1:
Este manual nos permitirá de manera sencilla conocer y entender la implementación de un CRUD Crear, Obtener, Actualizar y Borrar (Create, Read, Update y Delete en inglés).
+
Este manual 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>).
  
 +
==Paso 1==
 +
'''Crear el Modelo''' el cual esta viene dado por la difinición de una tabla en la BD, para efecto del ejemplo creamos la siguiente tabla en la BD (la misma del ejemplo de [[AutoCarga_de_Objetos_KumbiaPHP | Auto Carga de Obejtos]])
  
== El modelo ==
+
<pre>
 +
CREATE TABLE menus
 +
(
 +
id          int            unique not null auto_increment,
 +
nombre      varchar(100),
 +
titulo      varchar(100)  not null,
 +
primary key(id),
 +
)
 +
</pre>
  
Vamos ahora a definir el modelo, este arhivo va en la carpeta '''models''' de nuestra aplicación y lo nombramos como: parte_maquina.php
+
Vamos ahora a definir el modelo el cual nos permite interactuar con la BD.
  
'''Modelo:'''
+
'''''[app]/models/menus.php:'''''
 
<source lang="php" line>
 
<source lang="php" line>
 
<?php
 
<?php
class ParteMaquina extends ActiveRecord{
+
class Menus extends ActiveRecord
      
+
{
 +
     /**
 +
    * Retorna los menu para ser paginados
 +
    *
 +
    /*
 +
    public function getMenus($page, $ppage=20)
 +
    {
 +
        return $this->paginate("page: $page", "per_page: $ppage");
 +
    }
 
}
 
}
?>
 
 
</source>
 
</source>
  
== El controlador ==
+
== Paso 2 ==
 +
 
 +
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 nuestro eje principal, es quien recibe las peticiones de las vistas y se las pasa al modelo.
+
En esta parte es importante que se haya visto el [[AutoCarga_de_Objetos_KumbiaPHP | Tutorial de Auto Carga de Obejtos]]
  
<source lang="php" line>
+
'''''[app]/controllers/menus_controller.php:'''''
 +
 
 +
<source lang="php">
 
<?php
 
<?php
class ParteMaquinaController extends ApplicationController {
+
class MenusController extends ApplicationController {
     //Carga del modelo ParteMaquina, porque tenemos la autocarga de modelos desactivada (off)
+
     //Carga del modelo Menus, porque tenemos la autocarga de modelos desactivada (off)
     public $models = array('parte_maquina');   
+
     public $models = array('menus');   
  
     /*
+
     /**
    * Función que consulta y pagina la lista de  
+
    * Obtiene una lista para paginar de los menus
    * partes de máquina.
+
    */
    */
+
     public function index($page=1)  
     public function index($page=1) {
+
    {
        $cons="";
+
         $this->listMenus = $this->Menus->getMenus($pages);
        if(isset ($this->parameters[1])) {
 
            $cons= "order: ".$this->parameters[1]." asc";
 
            $this->orden="/".$this->parameters[1];
 
        }else {
 
            $this->orden="";
 
        }
 
        $this->count = $this->ParteMaquina->count();
 
         $this->page = $this->ParteMaquina->paginate('per_page: 20', "page: $page");
 
 
     }
 
     }
 
      
 
      
     /*
+
     /**
    * Función que muestra la información
+
    * Función que muestra la información
    * partes de máquina. Se consulta a través de su identificador
+
    * partes de máquina. Se consulta a través de su identificador
    */
+
    */
     public function show($id) {      
+
     public function show($id) {
         $this->obj = $this->ParteMaquina->find($id);
+
 
 +
         //Si id tiene valor se hace la busqueda
 +
        if($id){
 +
            $this->obj = $this->ParteMaquina->find($id);
 +
        } else {
 +
            //enrutamiento porque no se coloco un ID
 +
            return Router::route_to('action: index');
 +
        }
 
     }
 
     }
 
      
 
      
     /*
+
     /**
    * Función que toma los datos del POST
+
    * Crea un Controlador para el menu
    * crea una ParteMaquina y lo almacena.
+
    *
    */
+
    */
     public function create() {
+
     public function create ()
         //Si ha datos 'parte_maquina' en el POST
+
    {
         if ($this->has_post('parte_maquina')) {
+
         /**
             //Se crea un nuevo objeto tipo ParteMaquina
+
        * Se verifica si el usuario envio el form (submit) y si ademas
             $obj = new ParteMaquina($this->post('parte_maquina'));          
+
        * dentro del array POST existe uno llamado "menus"
           
+
        * el cual aplica la autocarga de objeto para guardar los
             //Si guarda el objeto
+
        * datos enviado por POST utilizando autocarga de objeto
             if ($obj->save()) {
+
        */
                //Muestra un mensaje de exito y nos envía a listado
+
         if($this->has_post('menus')){
                 Flash::notice('Operación Exitosa');
+
             /**
                Router::route_to('controller: parte_maquina','action: index','id: 1');
+
            * se le pasa al modelo por constructor los datos del form y ActiveRecord recoge esos datos
            } else {
+
            * y los asocia al campo correspondiente siempre y cuando se utilice la convención
                 //Muestra un mensaje de error,
+
            * model.campo
                Flash::error('No se Guardo!');
+
            */
                //Cargamos el objeto en una variable, para mostralo en la vista
+
             $menu = new Menus($this->post('menus'));
                 $this->$obj = $obj;
+
             //En caso que falle la operación de guardar
                 //Se renderiza de nuevo la vista create
+
             if(!$menu->save()){
                $this->render('create');
+
                 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
 +
                */
 
             }
 
             }
 
         }
 
         }
 
     }
 
     }
  
     public function edit($id=0) {
+
    /**
 +
    * Edita un registro
 +
    */
 +
     public function edit($id=null) {
 
          
 
          
 
         if ($this->has_post('parte_maquina')) {
 
         if ($this->has_post('parte_maquina')) {

Revisión del 16:09 19 ago 2009

Este manual 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).

Paso 1

Crear el Modelo el cual esta viene dado por la difinición de una tabla en la BD, para efecto del ejemplo creamos la siguiente tabla en la BD (la misma del ejemplo de Auto Carga de Obejtos)

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");
    }
}

Paso 2

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 Tutorial de Auto Carga de Obejtos

[app]/controllers/menus_controller.php:

<?php
class MenusController extends ApplicationController {
    //Carga del modelo Menus, porque tenemos la autocarga de modelos desactivada (off)
    public $models = array('menus');   

    /**
     * Obtiene una lista para paginar de los menus
     */
    public function index($page=1) 
    {
        $this->listMenus = $this->Menus->getMenus($pages);
    }
    
    /**
     * Función que muestra la información
     * partes de máquina. Se consulta a través de su identificador
     */
    public function show($id) {

        //Si id tiene valor se hace la busqueda
        if($id){
            $this->obj = $this->ParteMaquina->find($id);
        } else {
            //enrutamiento porque no se coloco un ID
            return Router::route_to('action: index');
        }
    }
    
    /**
     * Crea un Controlador para el menu
     *
     */
    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($this->has_post('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($this->post('menus'));
            //En caso que falle la operación de guardar
            if(!$menu->save()){
                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
                 */
            }
        }
    }

    /**
     * Edita un registro
     */
    public function edit($id=null) {
        
        if ($this->has_post('parte_maquina')) {
            $obj = new ParteMaquina($this->post('parte_maquina'));
            //$obj->version=  $this->ciudad->version+1;
            if ($obj->update()) {
                Flash::notice('Operación Exitosa');
                Router::route_to('controller: parte_maquina','action: index','id: 1');
            } else {
                Flash::error('No se Guardo!');
                $this->render('edit');
            }
        }else {
            $this->obj = $this->ParteMaquina->find($id);
        }
    }

    public function delete($id=0) {
        $obj  = $this->ParteMaquina->find($id);

        if($obj->delete()) {
            Flash::notice('Operación Exitosa');
        }else{
            Flash::error('No se Eliminó!');
        }

        Router::route_to('controller: parte_maquina','action: index','id: 1');
    }
}
?>

Las vistas

create.phtml

<h1>Crear parte de máquina</h1>
<?php View::content() ?>

<?php echo form_tag("parte_maquina/create")?>

<label for="parte_maquina_nombre">Nombre:</label>
        
<?php echo textupper_field_tag('parte_maquina.nombre') ?>
        
<?php echo submit_tag('Guardar') ?>
<?php echo end_form_tag(); ?>