programación por capas: capas gestor de base de datos y orm ii

22
Programación por Capas: Capas gestor de base de Datos y ORM II Diseño y Construcción de Productos de Software Daniel Correa Botero Jeferson David Ossa Universidad Nacional de Colombia Sede Medellín 2013

Upload: amena

Post on 16-Mar-2016

99 views

Category:

Documents


0 download

DESCRIPTION

Programación por Capas: Capas gestor de base de Datos y ORM II. Diseño y Construcción de Productos de Software Daniel Correa Botero Jeferson David Ossa Universidad Nacional de Colombia Sede Medellín 2013. Extracción de datos de múltiples tablas (example10.php) Código.

TRANSCRIPT

Page 1: Programación por Capas: Capas gestor de base de Datos y  ORM II

Programación por Capas:Capas gestor de base de Datos y ORM II

Diseño y Construcción de Productos de SoftwareDaniel Correa Botero

Jeferson David OssaUniversidad Nacional de Colombia

Sede Medellín 2013

Page 2: Programación por Capas: Capas gestor de base de Datos y  ORM II

Extracción de datos de múltiples tablas (example10.php)

Código

<?php

require('./configs/include.php');

class c_multiples extends super_controller {

public function display() { $cod['boss']['id']=1; $options['boss']['lvl2']="one"; $cod['clerk']['boss']=1; $options['clerk']['lvl2']="by_boss"; $components['boss']['clerk']=array("b_p"); $this->orm->connect(); $this->orm->read_data(array("boss","clerk"),$options,$cod); $boss = $this->orm->get_objects("boss",$components); $this->engine->assign('boss',$boss[0]); $this->engine->assign('title','Datos Multiples'); $this->engine->display('header.tpl'); $this->engine->display('multiples.tpl'); $this->engine->display('footer.tpl'); } public function run() { $this->display(); }}

$call = new c_multiples();$call->run();

?>

Page 3: Programación por Capas: Capas gestor de base de Datos y  ORM II

Extraer el jefe con el

documento 1 y todas las

personas a su mando

Page 4: Programación por Capas: Capas gestor de base de Datos y  ORM II

<div class="square"><table border="0" width="100%" cellpadding="0" cellspacing="10"><tr><td><b>Personas a Cargo del jefe: {$boss->get('name')} - con id: {$boss-

>get('id')}</b></td></tr>{section loop=$boss->components['clerk']['b_p'] name=i}<tr><td><b>Id:</b> {$boss->components['clerk']['b_p'][i]->get('id')}<br /> <b>Nombre:</b> {$boss->components['clerk']['b_p'][i]->get('name')}<br /> <b>Salario:</b> {$boss->components['clerk']['b_p'][i]->get('salary')} </td></tr>{/section}</table></div>

Extracción de datos de múltiples tablas (multiples.tpl)

Page 5: Programación por Capas: Capas gestor de base de Datos y  ORM II

Funcion read_data: $this->orm->read_data(array("boss","person"),$options,$cod);

Recordemos que esta función recibe 3 parámetros:- par1 (vector con nombres de las clases o tablas que se desean leer): en el ejemplo anterior solo deseábamos hacer una lectura de boss, pero en este ejemplo debemos hacer 2 lecturas una de boss para sacar la info del jefe con documento 1, y otra de person para sacar la info de todas las personas que tiene como jefe aquel con documento 1

- par2 ($options): enviamos los lvl2 diciendo que para ‘boss’ deseamos hacer una lectura de un solo boss por documento y para ‘clerk’ por el código del boss (en el caso de boss esta lectura es en base a su id donde sea igual a 1, en el caso de clerk es en base al atributo boss donde este sea igual a 1).

- par3 ($cod): se envían los códigos de id y boss respectivamente para las clases 'boss' y ‘clerk'

Explicación de funciones

Page 6: Programación por Capas: Capas gestor de base de Datos y  ORM II

Explicación de funcionesFuncion get_objetcs: $boss = $this->orm->get_objects("boss",$components);

Recordemos que esta función retorna objetos de la clase indicada por par1 y cuenta con 3 parámetros:- par1: nombre de la clase que se desea retorna en forma objetual (en este caso 'boss' ya que deseamos retornar un jefe con sus personas a cargo asignadas por dentro - pero también podría ser al contrario retornar las personas y a cada persona asignarle por dentro los datos de su jefe).

- par2 ($components) $components['boss']['clerk']=array("b_p");: Debe completarse de la siguiente manera: $components[‘nombre_de_la_clase_a_la_que_se_le_desea_asignar_otra']['nombre_de_la_clase_que_se_desea_agisnar'] = array('lista_de_las_relaciones_entre_las_clases')De este modo en el ejemplo actual estamos indicando que a la clase boss le queremos asignar elementos de la clase clerk, y que para poder asignar estos elementos se debe hacer una verificar de la relación b_p (esta relación se creo y se explico anteriormente en tutoriales de la capa clases).

- par3 ($auxiliars): será visto en tutoriales posteriores.

Page 7: Programación por Capas: Capas gestor de base de Datos y  ORM II

• De esta manera ya tenemos una lista de jefes con sus personas a cargo asignadas, como en este ejemplo sabemos que solo existe un jefe con id 1, entonces simplemente asignamos el jefe de la primera posición (posición cero)

$this->engine->assign('boss',$boss[0]);

Explicación de funciones

Page 8: Programación por Capas: Capas gestor de base de Datos y  ORM II

• Agregar un nuevo switche de nivel 1, en la función insert en el db.php con lo siguiente

Inserción de un objeto

case "clerk":switch($options['lvl2']){

case "normal":$id=mysql_real_escape_string($object->get('id'));$name=mysql_real_escape_string($object->get('name'));$salary=mysql_real_escape_string($object->get('salary'));$boss=mysql_real_escape_string($object->get('boss'));$this->do_operation("INSERT INTO clerk (id, name, salary, boss) VALUES ('$id',

'$name', '$salary', '$boss');");break;

}break;

Page 9: Programación por Capas: Capas gestor de base de Datos y  ORM II

• Estas funciones pertenecen a la clase gestor de base de datos y son usadas dentro del db.php, ambas reciben un solo parámetro que es la consulta sql que se desea ejecutar

• La función get_data se utiliza cuando se desea obtener información de la base de datos (es usada en todos los selects)

• La función do_operation se usa para realizar el resto de operaciones en la base de datos las cuales no retornan información (es usada es insert, delete, update).

Función do_operation y get_data del gestor de base de datos

Page 10: Programación por Capas: Capas gestor de base de Datos y  ORM II

Inserción de un objeto (insert.php)

Page 11: Programación por Capas: Capas gestor de base de Datos y  ORM II
Page 12: Programación por Capas: Capas gestor de base de Datos y  ORM II

Inserción de un objeto (código)

insert.php

<?php

require('configs/include.php');

class c_insert extends super_controller { public function add() { $clerk = new clerk($this->post); if(is_empty($clerk->get('id')))

{throw_exception("Debe ingresar un id");}

$this->orm->connect(); $this->orm->insert_data("normal",$clerk); $this->orm->close(); $this->type_warning = "success"; $this->msg_warning = "Persona agregada correctamente"; $this->temp_aux = 'message.tpl'; $this->engine->assign('type_warning',$this->type_warning); $this->engine->assign('msg_warning',$this->msg_warning); }

public function display() { $this->engine->display('header.tpl'); $this->engine->display($this->temp_aux); $this->engine->display('insert.tpl'); $this->engine->display('footer.tpl'); } public function run() { try {if (isset($this->get->option)){$this->{$this->get->option}();}} catch (Exception $e)

{$this->error=1; $this->msg_warning=$e-

>getMessage();$this->engine->assign('type_warning',$this-

>type_warning);$this->engine->assign('msg_warning',$this-

>msg_warning);$this->temp_aux = 'message.tpl';

} $this->display(); }}

$call = new c_insert();$call->run();

?>

Page 13: Programación por Capas: Capas gestor de base de Datos y  ORM II

Inserción de un objeto (insert.tpl)<div class="square"><form action="{$gvar.l_global}insert.php?option=add" method="post"><table width="100%" border="0" cellpadding="0" cellspacing="5"><tr><td><b>Agregar un empleado</b><br /><br /><b>Ingrese el nombre:</b> <input type="text" name="name" /><br /><b>Ingrese el id:</b> <input type="text" name="id" /><br /><b>Ingrese el salario:</b> <input type="text" name="salary" /><br /><b>Ingrese el jefe:</b> <input type="text" name="boss" /><br /><input class="btn btn-primary" type="submit" value="Registrar" /></td></tr></table></form></div>

Page 14: Programación por Capas: Capas gestor de base de Datos y  ORM II

• $this->type_warning = por defecto contiene el valor de error (color rojo) pero puede tomar los valores de: (information - success - error - alerts)

• $this->msg_warning = por defecto es vacio y se le debe asignar el mensaje que va a acompañar el tipo de error.

• $this-> error = por defecto es 0 y en caso de encontrar un error se debe cambiar a 1

Variables de manejo de error del controlador

Page 15: Programación por Capas: Capas gestor de base de Datos y  ORM II

Explicación función insert_data$this->orm->insert_data(par1, par2):

- par1: recibe un string, el case de LVL2 del tipo de insert que se desea realizar, en el caso del ejemplo es igual a "normal" que es el caso que creamos anteriormente en el db.php para inserción de datos de clerk).

- par2: recibe el objeto que se va a insertar en la base de datos (en este caso $clerk).

Notas (ejercicio propuesto):- El ejemplo se podría modificar de tal manera que cuando se inserte un dato y este sea invalido se vuelva a cargar la información en el formulario, para esto se agrega la línea $this->engine->assign('object',$this->post); después de this->error==1 Y ademas se modifica el insert.tpl para que haga un if en cada input preguntando si esta seteado “object” y en caso afirmativo muestre los datos.

Page 16: Programación por Capas: Capas gestor de base de Datos y  ORM II

Función update_data$this->orm->update_data(par1, par2):

- par1: recibe un string el LVL2 al cual se desea acceder a hacer el udpate (por lo general se usa el el case "normal" y se crea un switche de nivel 2 en los updates en el gestor de base de datos con ese caso normal).

- par2: recibe el objeto que se va a editar en la base de datos.

Nota: es importante resaltar que si se desea editar un objeto y se permite editar la clave primaria, entonces en este caso se deberá enviar la clave primaria inicial en una variable adicional (en este caso se usa el vector auxiliars definido en todas las clases) esto para poder hacer la edición.

Por ejemplo: supongamos que deseamos editar el documento de una persona, para ese fin es importante guardar en $clerk->auxiliars[‘id_aux’] el id inicial y en $clerk->id el nuevo documento

Para acceder y asignar valores a auxiliars NO ES NECESARIO usar las funciones GET y SET debido a que no son variables principales de la clase.

Page 17: Programación por Capas: Capas gestor de base de Datos y  ORM II

• $this->orm->delete_data(par1, par2)

- par1: recibe un string con el case de LVL2 que se desea realizar el borrado (normalmente se usa "normal" que es el caso básico que se crea en db.php en cada clase para el borrado de datos).

- par2: recibe el objeto que se va a borrar de la base de datos (por lo general se envía un objeto solo con la clave primaria asignada)

Función delete_data

Page 18: Programación por Capas: Capas gestor de base de Datos y  ORM II

• Crear un controlador, que permita ingresar un id de una clerk, luego en base a ese id muestre la información del clerk y finalmente permita editarla.

• Si se ingresa un documento invalido, el controlador debe mostrar un mensaje indicando el error.

• En la parte de la edición de la persona no es necesario validar datos.

Actividad 3 (Edición de datos)

Page 19: Programación por Capas: Capas gestor de base de Datos y  ORM II

actividad3.php caso inicial (pantallazo por defecto):

Page 20: Programación por Capas: Capas gestor de base de Datos y  ORM II

actividad3.php caso inicial con id erróneo:

Page 21: Programación por Capas: Capas gestor de base de Datos y  ORM II

actividad3.php caso inicial satisfactorio (caso secundario edición de datos)

Page 22: Programación por Capas: Capas gestor de base de Datos y  ORM II

actividad3.php caso secundario satisfactorio: