TRADUCTOR

domingo, 14 de julio de 2013

Esquema de Acceso a Bases de Datos en Kumbia


Modelos

La segunda capa de abstracción de datos utiliza un mapeo objeto/relacional para
representar las entidades del modelo de datos en nuestras aplicaciones. Estos modelos
son parte integral de la arquitectura MVC (Model View Controller) y están basados en el
patrón ActiveRecord.

Características de los modelos

* Implementan las clases de la capa de negocios: Productos, Clientes, Facturas,
Empleados, etc.

* Mantienen los datos y su lógica juntos: Un producto tiene una cantidad y se vende
sólo si está activo.


Representar relaciones en el modelo: Una Cliente tiene muchas Facturas.

Primera Aplicación en Kumbia


Primera Aplicación en Kumbia

El presente capítulo tiene como objetivo entender la creación de una primera
aplicación usando Kumbia, que nos servirá para entender la arquitectura MVC y
algunos características interesantes.

Modelos y Bases de Datos en Kumbia
        Kumbia posee una doble capa de abstracción de base de datos. La primera mantiene un
acceso uniforme que evita reescribir código en caso de cambiar el motor de
almacenamiento y la segunda llamada ActiveRecord que está basada en su análogo de
Rails; permite mapear las relaciones de la base de datos a objetos. Este mapeo permite
el fácil acceso y modificación de las relaciones de la base de datos. Este capítulo explica
la creación de estos objetos, la forma en que trabajan y cómo integrarlos con las demás
partes de la arquitectura.

Capa de Abstracción Independiente

         Kumbia posee una primera capa que evita la reescritura del código que accede a bases
de datos en caso de cambiar de un motor a otro. Posee todas las funciones básicas para
efectuar operaciones sobre tablas, mantener conexiones, ejecutar consultas, etc. sin
perder independencia. Esta capa funciona bajo la capa objeto relacional y es
ampliamente usada por todo el framework. Debería ser usada en caso de necesitar un
acceso de bajo nivel a la base de datos.
Otra ventaja es que cursores y streams de conexión son encapsulados en objetos
evitando escribir código repetitivo.

Adaptadores Kumbia

       Mientras estos adaptadores estén disponibles se puede tener acceso a un motor de base
de datos en particular. Actualmente existen: MySQL, PostgreSQL (Beta) y Oracle (beta).

lunes, 24 de junio de 2013

CRUD en KumbiaPHP Framework

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
  • Configurar el archivo databases.ini, con los datos y motor de Base de Datos a utilizar.
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.
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:
  1. <?php
  2. class Menus extends ActiveRecord
  3. {
  4.     /**
  5.      * Retorna los menu para ser paginados
  6.      *
  7.      */
  8.     public function getMenus($page, $ppage=20)
  9.     {
  10.         return $this->paginate("page: $page", "per_page: $ppage", 'order: id desc');
  11.     }
  12. }
    
    
    CONTROLLER
    
    
    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');
     
    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->save()){
                    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 Router::redirect();
                } 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 Router::redirect();
        }
    }
    
    
    VISTAS
    
    
    Agregamos las vistas...
    [apps]/views/menus/index.phtml
    <div class="content">
        <?php echo 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
    
    
    <?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() ?>
    
    
    [apps]/views/menus/edit.phtml
    
    
    
    
    <?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() ?>
    
    
    
    

Qué es KumbiaPHP ?

KumbiaPHP es un framework para aplicaciones web libre escrito en PHP5. Basado en las prácticas de desarrollo web como DRY y el Principio KISS para software comercial y educativo. Kumbiaphp fomenta la velocidad y eficiencia en la creación y mantenimiento de aplicaciones web, reemplazando tareas de codificación repetitivas por poder, control y placer.


Sus principales características son: 

  • Sistema de Plantillas sencillo. 
  • Administración de Cache. 
  • Scaffolding Avanzado. 
  • Modelo de Objetos y Separación MVC. 
  • Soporte para AJAX. 
  • Generación de Formularios. 
  • Componentes Gráficos. 
  • Seguridad.
Propiedad Descripción

$fields: Listado de Campos de la tabla que han sido mapeados.

$count: Conteo del último Resultado de un Select.

$primary_key: Listado de columnas que conforman la llave primaria.

$non_primary: Listado de columnas que no son llave primaria.

$not_null: Listado de campos que son not_null.

$attributes_names: Nombres de todos los campos que han sido mapeados.

$is_view: Soporte para las Vista.