Diferencia entre revisiones de «AutoCarga de Objetos KumbiaPHP»

De KumbiaPHP Framework Wiki
 
(No se muestran 16 ediciones intermedias de 5 usuarios)
Línea 1: Línea 1:
 +
{{cleanupbox
 +
|image=[[Archivo:Information_icon4.png|45px]]
 +
|texto ='''Este Artículo cumple con todos los quererimientos de los Kumbieros.'''<br />
 +
}}
 
== Sobre la AutoCarga de Objetos ==
 
== Sobre la AutoCarga de Objetos ==
En KumbiaPHP Framework existe una implementación que ahorra muchísimo trabajo y como la intención es aprovechar al máximo las bondades del framework, en este sentido tenemos la '''AutoCarga de Objeto''', la cual como su nombre indica asocia un campo de formulario (form) a una tabla y campo de la BD.
+
En [http://www.kumbiaphp.com KumbiaPHP Framework] existe una implementación que ahorra muchísimo trabajo y como la intención es aprovechar al máximo las bondades del framework, en este sentido tenemos la '''AutoCarga de Objeto''', la cual como su nombre indica asocia un campo de formulario (form) a una tabla y campo de la BD.
  
KumbiaPHP implementa la autocarga de objeto la cual siguiendo la convencion model.field en este caso el model es "controllers" si vamos a la BD se vera que existe una tabla llamada "controllers" y field (campo) serán los campos de esa tabla.
+
[http://www.kumbiaphp.com KumbiaPHP Framework] implementa la '''AutoCarga de Objeto''' la cual siguiendo una convención mínima '''model.field''' donde el model es "menus", es decir existe una tabla llamada "menus" y field (campo) serán los campos de esa tabla.
  
Veamos la estructura de tabla ''controllers'':
+
Veamos la estructura de tabla ''menus'':
  
 
<pre>
 
<pre>
CREATE TABLE controllers
+
CREATE TABLE menus
 
(
 
(
 
  id          int            unique not null auto_increment,
 
  id          int            unique not null auto_increment,
 
  nombre      varchar(100),
 
  nombre      varchar(100),
  url          varchar(100)  not null,
+
  titulo      varchar(100)  not null,
status      char(1)        not null,
 
perfiles_id  int            not null,
 
menu_id      int            not null,
 
 
  primary key(id),
 
  primary key(id),
foreign key(perfiles_id) references perfiles(id),
 
foreign key(menu_id) references menus(id)
 
 
)
 
)
 
</pre>
 
</pre>
  
En concordancia con los fields (campos) de la tabla "controllers" se indica el comportamiento de la ''AutoCarga de Objeto'' para que el controller no tener que recoger cada uno de los valores enviado por POST.
+
En concordancia con los fields (campos) de la tabla "menus" se indica el comportamiento de la ''AutoCarga de Objeto'' para que el controller no tenga que recoger cada uno de los valores enviado por POST.
  
 
Para este caso haremos en los helpers:
 
Para este caso haremos en los helpers:
 
<pre>
 
<pre>
text_field_tag(array('controllers.url'))
+
text_field_tag(array('menus.titulo'))
 
</pre>
 
</pre>
 +
En la Beta2
 +
<pre>
 +
Form::text('menus.titulo')
 +
</pre>
 +
 +
Automáticamente cuando ese valor vaya al action menus/create KumbiaPHP interpreta que existe una tabla "menus" con un campo "titulo" y si vemos la estructura de la tabla es así.
  
Automáticamente cuando ese valor vaya al action menus/create KumbiaPHP interpreta que existe una tabla "controllers" con un campo "url" y si vemos la estructura de la tabla es asi.
+
== La Vista (create.phtml) ==
  
<source lang=php >
+
<source lang="php" line>
 
<?php View::content(); ?>
 
<?php View::content(); ?>
<?php echo form_tag('controllers/create') ?>
+
<?php echo form_tag('menus/create/') ?>
 
<table>
 
<table>
<tr>
+
    <tr>
<td>Perfil</td>
+
         <td>Nombre:</td>
<td><?php echo select_tag(array('controllers.perfiles_id',
+
         <td><?php echo text_field_tag(array('menus.nombre')) ?></td>
                                        $perfiles, 'option' => 'nombre',
+
    </tr>
                                        'include_blank' => 'Seleccione...')) ?>
+
    <tr>
         </td>
+
        <td>Titulo:</td>
</tr>
+
        <td><?php echo text_field_tag(array('menus.titulo')) ?></td>
<tr>
+
    </tr>  
<td>Menú</td>
+
    <tr>
<td><?php echo select_tag(array('controllers.menu_id',
+
         <td>&nbsp;</td>
                                        $menus, 'option' => 'nombre',
+
        <td><?php echo submit_tag('Agregar') ?></td>
                                        'include_blank' => 'Seleccione...')) ?>
+
    </tr>
         </td>
 
</tr>
 
<tr>
 
<td>URL</td>
 
<td><?php echo text_field_tag(array('controllers.url')) ?></td>
 
</tr>
 
<tr>
 
<td>Nombre a mostrar</td>
 
<td><?php echo text_field_tag(array('controllers.nombre')) ?></td>
 
</tr>
 
<tr>
 
<td>Estado</td>
 
<td><?php echo select_tag(array('controllers.status',
 
                                        array('A'=>'Activo','D'=>'Desactivado'),
 
                                        'include_blank' => 'Seleccione...'))?>
 
         </td>
 
</tr>
 
<tr>
 
<td>&nbsp;</td>
 
<td><?php echo submit_tag('Agregar') ?></td>
 
</tr>
 
 
</table>
 
</table>
 
<?php echo end_form_tag() ?>
 
<?php echo end_form_tag() ?>
 
</source>
 
</source>
  
==AutoCarga en el Controller ==
+
En la Beta2
Ahora vemos el código que se utiliza en controllers/controllers_controller.php en su acción create().
 
  
 +
<source lang="php" line>
 +
<?php View::content(); ?>
 +
<?php echo Form::open('menus/create/') ?>
 +
<table>
 +
    <tr>
 +
        <td>Nombre:</td>
 +
        <td><?php echo Form::text('menus.nombre') ?></td>
 +
    </tr>
 +
    <tr>
 +
        <td>Titulo:</td>
 +
        <td><?php echo Form::text('menus.titulo') ?></td>
 +
    </tr> 
 +
    <tr>
 +
        <td>&nbsp;</td>
 +
        <td><?php echo Form::submit('Agregar') ?></td>
 +
    </tr>
 +
</table>
 +
<?php echo Form::close() ?>
 +
</source>
 +
 +
== El Modelo Menus (menus.php) ==
 
<source lang=php>
 
<source lang=php>
     /**
+
<?php
 +
 
 +
     class Menus extends ActiveRecord{
 +
       
 +
    }
 +
 
 +
?>
 +
</source>
 +
 
 +
== AutoCarga en el Controller (menus_controller.php) ==
 +
Ahora vemos el código que se utiliza en controllers/menus_controller.php en su acción create().
 +
 
 +
<source lang="php" line>
 +
<?php
 +
/**
 +
    * Crea un Controlador para el menu
 +
    *
 +
    */
 +
    Load::model('menus');
 +
     
 +
class MenusController extends ApplicationController
 +
{
 +
   
 +
    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
 +
                */
 +
            }
 +
        }
 +
        else
 +
        {
 +
          Flash::success('Operación exitosa: datos Guardado');
 +
        }
 +
    }
 +
}
 +
?></source>
 +
 
 +
Para la Beta2
 +
<source lang="php" line>
 +
<?php
 +
/**
 
     * Crea un Controlador para el menu
 
     * Crea un Controlador para el menu
 
     *
 
     *
 
     */
 
     */
 +
    Load::model('menus');
 +
     
 +
class MenusController extends ApplicationController
 +
{
 +
   
 
     public function create ()
 
     public function create ()
 
     {
 
     {
        //Datos del select
 
        $this->perfiles = $this->Perfiles->find('order: nombre');
 
        $this->menus = $this->Menus->find('order: nombre');
 
 
         /**
 
         /**
 
         * Se verifica si el usuario envio el form (submit) y si ademas  
 
         * Se verifica si el usuario envio el form (submit) y si ademas  
         * dentro del array POST existe uno llamado "controllers"
+
         * dentro del array POST existe uno llamado "menus"
 
         * el cual aplica la autocarga de objeto para guardar los  
 
         * el cual aplica la autocarga de objeto para guardar los  
 
         * datos enviado por POST utilizando autocarga de objeto
 
         * datos enviado por POST utilizando autocarga de objeto
 
         */
 
         */
         if ($this->has_post('controllers')) {
+
         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 96: Línea 162:
 
             * model.campo
 
             * model.campo
 
             */
 
             */
             $controller = new Controllers($this->post('controllers'));
+
             $menu = new Menus(Input::post('menus'));
             //En caso que falle la operación
+
             //En caso que falle la operación de guardar
             if (!$controller->save()) {
+
             if(!$menu->save()){
 
                 Flash::error('Falló Operación');
 
                 Flash::error('Falló Operación');
 
                 //se hacen persistente los datos en el formulario
 
                 //se hacen persistente los datos en el formulario
                 $this->controllers = $this->post('controllers');
+
                 $this->menus = Input::post('menus');
 
                 /**
 
                 /**
 
                 * NOTA: para que la autocarga aplique de forma correcta, es necesario que llame a la variable de instancia
 
                 * 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 "controllers"
+
                 * igual como esta el model de la vista, en este caso el model es "menus" y quedaria $this->menus
 
                 */
 
                 */
 
             }
 
             }
 +
        }
 +
        else
 +
        {
 +
          Flash::success('Operación exitosa: datos Guardado');
 
         }
 
         }
 
     }
 
     }
</source>
+
}
 +
?></source>
 +
 
 +
== Descarga este ejemplo ==
 +
Descarga: [http://dl.dropbox.com/u/2807704/kumbiaPHP/v1_b1/app_autocarga_objetos.zip app_autocarga_objetos.zip] para el '''core''' del beta1
  
 
[[Categoría:Tutoriales KumbiaPHP]]
 
[[Categoría:Tutoriales KumbiaPHP]]

Revisión actual del 15:52 29 mar 2013

{{#if:Information icon4.png |}}

{{#if:

|}}


Sobre la AutoCarga de Objetos[editar]

En KumbiaPHP Framework existe una implementación que ahorra muchísimo trabajo y como la intención es aprovechar al máximo las bondades del framework, en este sentido tenemos la AutoCarga de Objeto, la cual como su nombre indica asocia un campo de formulario (form) a una tabla y campo de la BD.

KumbiaPHP Framework implementa la AutoCarga de Objeto la cual siguiendo una convención mínima model.field donde el model es "menus", es decir existe una tabla llamada "menus" y field (campo) serán los campos de esa tabla.

Veamos la estructura de tabla menus:

CREATE TABLE menus
(
 id           int            unique not null auto_increment,
 nombre       varchar(100),
 titulo       varchar(100)   not null,
 primary key(id),
)

En concordancia con los fields (campos) de la tabla "menus" se indica el comportamiento de la AutoCarga de Objeto para que el controller no tenga que recoger cada uno de los valores enviado por POST.

Para este caso haremos en los helpers:

text_field_tag(array('menus.titulo'))

En la Beta2

Form::text('menus.titulo')

Automáticamente cuando ese valor vaya al action menus/create KumbiaPHP interpreta que existe una tabla "menus" con un campo "titulo" y si vemos la estructura de la tabla es así.

La Vista (create.phtml)[editar]

<?php View::content(); ?>
<?php echo form_tag('menus/create/') ?>
<table>
    <tr>
        <td>Nombre:</td>
        <td><?php echo text_field_tag(array('menus.nombre')) ?></td>
    </tr>
    <tr>
        <td>Titulo:</td>
        <td><?php echo text_field_tag(array('menus.titulo')) ?></td>
    </tr>   
    <tr>
        <td>&nbsp;</td>
        <td><?php echo submit_tag('Agregar') ?></td>
    </tr>
</table>
<?php echo end_form_tag() ?>

En la Beta2

<?php View::content(); ?>
<?php echo Form::open('menus/create/') ?>
<table>
    <tr>
        <td>Nombre:</td>
        <td><?php echo Form::text('menus.nombre') ?></td>
    </tr>
    <tr>
        <td>Titulo:</td>
        <td><?php echo Form::text('menus.titulo') ?></td>
    </tr>   
    <tr>
        <td>&nbsp;</td>
        <td><?php echo Form::submit('Agregar') ?></td>
    </tr>
</table>
<?php echo Form::close() ?>

El Modelo Menus (menus.php)[editar]

<?php

    class Menus extends ActiveRecord{
        
    }

?>

AutoCarga en el Controller (menus_controller.php)[editar]

Ahora vemos el código que se utiliza en controllers/menus_controller.php en su acción create().

 <?php
 /**
     * Crea un Controlador para el menu
     *
     */
    Load::model('menus');
      
class MenusController extends ApplicationController
{
    
    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
                 */
            }
        }
        else
        {
           Flash::success('Operación exitosa: datos Guardado');
        }
    }
}
?>

Para la Beta2

 <?php
 /**
     * Crea un Controlador para el menu
     *
     */
    Load::model('menus');
      
class MenusController extends ApplicationController
{
    
    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::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::success('Operación exitosa: datos Guardado');
        }
    }
}
?>

Descarga este ejemplo[editar]

Descarga: app_autocarga_objetos.zip para el core del beta1