Edición de «Como hacer un CRUD en KumbiaPHP Framework»

De KumbiaPHP Framework Wiki

Advertencia: no has iniciado sesión. Tu dirección IP se hará pública si haces cualquier edición. Si inicias sesión o creas una cuenta, tus ediciones se atribuirán a tu nombre de usuario, además de otros beneficios.

Puedes deshacer la edición. Antes de deshacer la edición, comprueba la siguiente comparación para verificar que realmente es lo que quieres hacer, y entonces guarda los cambios para así efectuar la reversión.

Revisión actual Tu texto
Línea 1: Línea 1:
{{cleanupbox
+
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).
|image=[[Archivo:Information_icon4.png|45px]]
 
|texto ='''Este Artículo cumple con todos los requererimientos de los Kumbieros.'''<br />
 
}}
 
{{cleanupbox
 
|texto ='''Este ejemplo es funcional para la [[KumbiaPHP_Framework_Versión_1.0_Spirit | Versión Beta1]]'''<br />
 
}}
 
== Texto de titular ==
 
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.
 
  
== Configurando database.ini ==
 
Configurar el archivo [[KumbiaPHP_Framework_Versión_1.0_Spirit#databases.ini|databases.ini]], con los datos y motor de Base de Datos a utilizar.
 
  
== Modelo ==
+
== El 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]])
 
  
<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
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 el cual nos permite interactuar con la BD.
+
'''Modelo:'''
 
 
'''''[app]/models/menus.php:'''''
 
 
<source lang="php" line>
 
<source lang="php" line>
 
<?php
 
<?php
class Menus extends ActiveRecord
+
class ParteMaquina extends ActiveRecord{
{
+
      
    /**
 
    * Retorna los menu para ser paginados
 
    *
 
    */
 
    public function getMenus($page, $ppage=20)
 
    {
 
        return $this->paginate("page: $page", "per_page: $ppage");
 
     }
 
 
}
 
}
 +
?>
 
</source>
 
</source>
  
== Controller ==
+
== El controlador ==
 
 
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]]
+
El controlador es nuestro eje principal, es quien recibe las peticiones de las vistas y se las pasa al modelo.
 
 
'''''[app]/controllers/menus_controller.php:'''''
 
  
 
<source lang="php" line>
 
<source lang="php" line>
 
<?php
 
<?php
/**
+
class ParteMaquinaController extends ApplicationController {
* Carga del modelo Menus...
+
    //Carga del modelo ParteMaquina, porque tenemos la autocarga de modelos desactivada (off)
*/
+
    public $models = array('parte_maquina');  
Load::models('menus');
 
  
class MenusController extends ApplicationController {
+
     /*
 
+
    * Función que consulta y pagina la lista de
     /**
+
    * partes de máquina.
    * Obtiene una lista para paginar los menus
+
    */
    */
+
     public function index($page=1) {
     public function index($page=1)  
+
        $cons="";
    {
+
        if(isset ($this->parameters[1])) {
         $menu = new Menus();
+
            $cons= "order: ".$this->parameters[1]." asc";
         $this->listMenus = $menu->getMenus($page);
+
            $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
 +
    * partes de máquina. Se consulta a través de su identificador
 +
    */
 +
    public function show($id) {       
 +
        $this->obj = $this->ParteMaquina->find($id);
 
     }
 
     }
 
      
 
      
     /**
+
     /*
    * Crea un Registro
+
    * Función que toma los datos del POST
    */
+
    * crea una ParteMaquina y lo almacena.
     public function create ()
+
    */
    {
+
     public function create() {
         /**
+
         //Si ha datos 'parte_maquina' en el POST
        * Se verifica si el usuario envio el form (submit) y si ademas
+
         if ($this->has_post('parte_maquina')) {
        * dentro del array POST existe uno llamado "menus"
+
             //Se crea un nuevo objeto tipo ParteMaquina
        * el cual aplica la autocarga de objeto para guardar los
+
             $obj = new ParteMaquina($this->post('parte_maquina'));          
        * datos enviado por POST utilizando autocarga de objeto
+
           
        */
+
             //Si guarda el objeto
         if($this->has_post('menus')){
+
             if ($obj->save()) {
             /**
+
                //Muestra un mensaje de exito y nos envía a listado
            * se le pasa al modelo por constructor los datos del form y ActiveRecord recoge esos datos
+
                 Flash::notice('Operación Exitosa');
            * y los asocia al campo correspondiente siempre y cuando se utilice la convención
+
                Router::route_to('controller: parte_maquina','action: index','id: 1');
            * model.campo
+
            } else {
            */
+
                 //Muestra un mensaje de error,
             $menu = new Menus($this->post('menus'));
+
                Flash::error('No se Guardo!');
             //En caso que falle la operación de guardar
+
                //Cargamos el objeto en una variable, para mostralo en la vista
             if(!$menu->save()){
+
                 $this->$obj = $obj;
                 Flash::error('Falló Operación');
+
                 //Se renderiza de nuevo la vista create
                 //se hacen persistente los datos en el formulario
+
                $this->render('create');
                 $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');
 
 
             }
 
             }
 
         }
 
         }
 
     }
 
     }
  
    /**
+
     public function edit($id=0) {
    * Edita un Registro
+
       
    */
+
         if ($this->has_post('parte_maquina')) {
     public function edit($id = null)
+
             $obj = new ParteMaquina($this->post('parte_maquina'));
    {
+
            //$obj->version=  $this->ciudad->version+1;
    $menu = new Menus();
+
             if ($obj->update()) {
         if($id != null){
+
                 Flash::notice('Operación Exitosa');
        //Aplicando la autocarga de objeto, para comenzar la edición
+
                 Router::route_to('controller: parte_maquina','action: index','id: 1');
             $this->menus = $menu->find((int)$id);
 
    }
 
        //se verifica si se ha enviado el formulario (submit)
 
        if($this->has_post('menus')){
 
           
 
             if(!$menu->update($this->post('menus'))){
 
                 Flash::error('Falló Operación');
 
                 //se hacen persistente los datos en el formulario
 
                $this->menus = $this->post('menus');
 
 
             } else {
 
             } else {
                 Router::route_to('action: index');
+
                 Flash::error('No se Guardo!');
 +
                $this->render('edit');
 
             }
 
             }
 +
        }else {
 +
            $this->obj = $this->ParteMaquina->find($id);
 
         }
 
         }
 
     }
 
     }
  
    /**
+
     public function delete($id=0) {
    * Eliminar un menu
+
         $obj  = $this->ParteMaquina->find($id);
    *
+
 
    * @param int $id
+
         if($obj->delete()) {
    */
+
            Flash::notice('Operación Exitosa');
     public function del($id = null)
+
        }else{
    {
+
             Flash::error('No se Eliminó!');
         $menu = new Menus();
 
         if ($id) {
 
            if (!$menu->delete((int)$id)) {
 
                Flash::error('Falló Operación');
 
             }
 
 
         }
 
         }
        //enrutando al index para listar los menus
+
 
         Router::route_to('action: index');
+
         Router::route_to('controller: parte_maquina','action: index','id: 1');
 
     }
 
     }
 
}
 
}
 +
?>
 
</source>
 
</source>
  
== Vistas ==
+
== Las vistas ==
Agregamos las vistas...
 
 
 
'''''[apps]/views/menus/index.phtml'''''
 
<source lang="php" line>
 
<div class="content">
 
    <?php echo View::content(); ?>
 
    <h3>Menus</h3>
 
    <ul>
 
    <?php foreach ($listMenus->items as $item) : ?>
 
    <li>
 
        <?php echo link_to("menus/create",'Agregar'); ?>
 
        <?php echo link_to(array("menus/edit/$item->id/", 'Editar')) ?>
 
        <?php echo link_to(array("menus/del/$item->id/", 'Borrar')) ?><br/>
 
        <strong><?php echo $item->nombre ?> - <?php echo $item->titulo ?></strong>
 
    </li>
 
    <?php endforeach; ?>
 
    </ul>
 
   
 
    <?php if($listMenus->prev) echo Html::link("menus/index/$listMenus->prev/", '<< Anterior |'); ?>
 
    <?php if($listMenus->next) echo Html::link("menus/index/$listMenus->next/", '| Próximo >>'); ?>
 
</div>
 
</source>
 
  
 +
create.phtml
  
'''''[apps]/views/menus/create.phtml'''''
 
 
<source lang="php" line>
 
<source lang="php" line>
<?php View::content(); ?>
+
<h1>Crear parte de máquina</h1>
<?php echo form_tag('menus/create/') ?>
+
<?php View::content() ?>
<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() ?>
 
</source>
 
  
 +
<?php echo form_tag("parte_maquina/create")?>
  
'''''[apps]/views/menus/edit.phtml'''''
+
<label for="parte_maquina_nombre">Nombre:</label>
<source lang="php" line>
+
          
<?php View::content(); ?>
+
<?php echo textupper_field_tag('parte_maquina.nombre') ?>
<?php echo form_tag('menus/edit/') ?>
+
          
<table>
+
<?php echo submit_tag('Guardar') ?>
    <tr>
+
<?php echo end_form_tag(); ?>
         <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>
 
        <?php echo hidden_field_tag(array('menus.id')) ?>
 
        <td><?php echo submit_tag('Actualizar') ?></td>
 
    </tr>
 
</table>
 
<?php echo end_form_tag() ?>
 
 
</source>
 
</source>
  
== Probando el CRUD ==
 
Ahora solo resta probar todo el código que hemos generado, en este punto es importante conocer el comportamiento de las [[Hola_Mundo_KumbiaPHP_Framework#KumbiaPHP_URLS|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.
 
 
[[Categoría:Tutoriales KumbiaPHP]]
 
[[Categoría:Tutoriales KumbiaPHP]]
 
== Descarga ==
 
Descarga: [http://dl.dropbox.com/u/2807704/kumbiaPHP/v1_b1/app_crud.zip app_crud] para el '''core''' de Spirit v1.0 '''beta1'''.
 
 
Este ejemplo de descarga esta apuntado a la base de datos '''test''', usuario '''root''' y clave '''123'''.
 

Ten en cuenta que todas las contribuciones a KumbiaPHP Framework Wiki pueden ser editadas, modificadas o eliminadas por otros colaboradores. Si no deseas que las modifiquen sin limitaciones, no las publiques aquí.
Al mismo tiempo, asumimos que eres el autor de lo que escribiste, o lo copiaste de una fuente en el dominio público o con licencia libre (véase Proyecto:Derechos de autor para más detalles). ¡No uses textos con copyright sin permiso!

Para editar esta página, responde la pregunta que aparece abajo (más información):

Cancelar Ayuda de edición (se abre en una ventana nueva)

Plantilla usada en esta página: