Elementos de desarrorllo
Este es una lista de las generalidades del proyecto
- Estructura de archivos
- estructura de base de datos
- librerias
- practicas de desarrollo
- elementos de ayuda
Estructura de archivos
la estructura esta formada por :
- fedepapa (raiz)
- build :donde van los scripts PHP de la aplicacion, tres directorios :
- controllers
:es aqui donde van las clases q interactuan con las tablas de la base de datos, estoas clases se extiende de ADODB_active_record para ver su estructura de clic aqui.
- models
: es aqui donde estan las clases que implementan la aplicacion deacuerdo a los diseños
- view
: en este direcctorio estan los scripts de presentacion de las didtintas opciones del sistema se recomienda q dentro de el se guarde los scripts separando por modulos la opciones afin de facilitar su mantenimiento:
- directorio modulo
- directorio opcion
- script de presentacion <nombre>_i.php, normalmente este archivo retornaria un javascript deacuerdo a los privilegios del usuario.
- script de proceso(interactua con los modelos) <nombre>_l.php , este archivo proporciona las respuestas asincronas a las solicitudes del script cliente, para este proyecto las respuestas deben tener la estructura json.
- conf: los archivos de confuguracion
- adodb.php configuracion de la conexion a base de datos
- db.inc.php configuracion de los diferentes entornos de trabajo
- system.php variables de uso general.
- help directorio para los archivos de ayuda.
- js (archivos q crean los elementos generales de la aplicacion(Escritorio menu barra de herramientas))
- lib directorio de librerias
- presentation( todo lo q tiene q ver con la presentacion del sitio css, iconos ,temas)
- upload dentro deste van los directorios de subida de archivos q se necesiten para cada modulo.
Estructura de base de datos
- los nombres de las tablas deben tener un prefijo(4 caracteres + _) ya sea por su funcion o por el modulo al cual pertenecen para facilitar el mantenimiento de cada modulo ya q aparecen agrupadas en el front end.
- la llave primaria debe llamarse id
- las llaves foraneas debe costruirse para update y delete en cascada
- el nombre de campo de una llave foranea debe estar compuesto por <nombre-tabla>_id
ejemplo:
CREATE TABLE persona (
id serial NOT NULL PRYMARY KEY,
documento character varying(30), NOT NULL,
nombre character varying(40), NOT NULL,
apellido character varying(40), NOT NULL
);
CREATE TABLE finca
(
id serial NOT NULL,
nombre character varying(30),
persona_id bigint,
ciudad character varying(30),
CONSTRAINT finca_pkey PRIMARY KEY (id),
CONSTRAINT finca_id_persona_fkey FOREIGN KEY (persona_id)
REFERENCES persona (id) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE CASCADE
);
librerias (lib)
- adodb5: Libreria q provee la conectividad con la base de datos, una brebe reseña de como usar el objeto de conexion , tambien una breve explicacion de active_record
- ext3.2.1 proveee los elementos de presentacion aqui unos ejemplos de como crear algunos objetos , estos son los ejemplos de la libreria
- ZipFolder provee la capacidad de extraer archivos .zip
- createZip permite crear archivos .zip
- excel permite la lectura de archivos xls
- jsonrpc permite crear webservices con json
- xmlrpc permite crear webservices con xml
Desarrollo
Creacion de scripts de presentacion ejemplo
- Crear el directorio donde estaran alojados los archivos siguiendo el esquema antes mencionado en el directorio buil/view
- crear la opcion en la base de datos por la opcion de administracion de modulos a fin de ver el id del componente.
- crear el acrivo <opcion>_i.php
- incluir los siguientes archivos :
- conf/system.php: variables generales
- conf/sesiones.php:manejo de sesion ,base de datos , por defecto vienen incluidas los controladores de core_sql core_error
- Cargar los controladores q el script necesita
: usar la variable $controllers.<nombre_tabla >.php
- Definir una funcionde inicio con el nombre: inicioComponente_<id_componente> ya que el sistema automaticamente carga esta funcion para construir la opcion en el menu.
Creación de scripts de manejo ejemplo de estructura del archivo
- junto al archivo _i.php crear el archivo <opcion>_l.php
- incluir los siguientes archivos :
- conf/system.php: variables generales
- conf/sesiones.php:manejo de sesion ,base de datos , por defecto vienen incluidas los controladores de core_sql core_error
- Cargar los controladores q el script necesita
: usar la variable $controllers.<nombre_tabla >.php
- definir dentro de un switch los procedimientos a seguir para las acciones lista, add, mod, del basicas
algo de codigo
retornar un listado de datos de una tabla para contruir una grilla a partir de un objeto active record
$lista=$obj->Find(' una condicion'); //de un objeto active record sacamos un listado
if($lista!==FALSE){
$noms=$obj->getAttributeNames();
$nodes=array();
foreach($lista as $ob){
//extraer los datos del registro
$r = array();//definimos un array para los atributos para asignar valores sin usar contador
foreach( $noms as $nom)
$r[$nom]=$h->{$nom};//las llaves son para q tome el valor de la variable y lo busque en los atributos d la clase
$nodes[]=$r;//se ubica al final de la lista
}
$suc=true;
$total=count($lista);
}else{
if(obj->errorMsg()!=''){
$suc=false;
$msg='mensaje de error elegante ';
if($_SESSION[debug]=='s') nl2br($obj->errorMsg());//si en la sesion deben mostrarse los errores
}else{
$suc=true;
$total=0;
}
}
echo json_encode(array("success"=>$suc,"message"=>$msg,"total"=>$total,"data"=>$nodes));
retornar un listado de datos de una tabla para contruir una grilla a partir de una consulta normal
$rs=$con->Execute(' una SQL');
if($rs!==FALSE){
$noms=array_keys($rs->fields);
$nodes=array();
do{
//extraer los datos del registro
$r = array();//definimos un array para los atributos para asignar valores sin usar contador
foreach( $noms as $nom=>$val)
if(!is_numeric($nom))$r[$nom]=$val;//se valida q solo incluya los nombres de las columnas no los numeros
$nodes[]=$r;//se ubica al final de la lista
}while($rs->MoveNext());
$suc=true;
$total=count($lista);
}else{
$suc=false;
$msg='mensaje de error elegante ';
if($_SESSION[debug]=='s') nl2br($obj->errorMsg());//si en la sesion deben mostrarse los errores
}
echo json_encode(array("success"=>$suc,"message"=>$msg,"total"=>$total,"data"=>$nodes));
retornar un array anidado para construir un arbol : esto se usa si solo se hace una consulta para cargar todo el arbol
$sql= new core_sql();
$sql->Load('id=xxx');
//SQL q cargue los nodos del arbol a dibujar
//se debe tenere e cuenta q la sql debe ordenar los registros primero los q son nodos padres, luego rodenar por id_del padre
//luego el resto de los criterios esto a fin de garantizar q se ubiquen primero los padre y no queden nodos sueltos
$rs=$con->Execute($sql->sql);
if($rs!==FALSE){
$nodos=array();//AQUI SE FORMA LA ESTRUCTURA
$pads=array();//AQUI SE ALMACENA DONDE QUEDA GUARDADO CADA NODO
do{
$id=$rs->fields['id'];
$id_pad=$rs->fields['padre'];
if($rs->fields['is_pad']=='s'){//'aqui se diferencia los q son padres de los q son hojas '
$item=array(
'id' => $rs->fields[id],
'text' => $rs->fields[etiqueta],
'expand'=>true,
.
.
.
);
}else{
$item=array(
'id' => $rs->fields[id],
'com' => $rs->fields[etiqueta],
'leaf'=>true,
.
.
.
);
}
if($id_pad==0){//si el padre es la raiz
$c=count($nodos);
$nodos[$c]=$item; //SE UBICA EL ITEM
$pads[$id]=&$nodos[$c];
//SE ALMACENA DONDE QUEDO GUARDADO
//EL & SIMBOLIZA Q NO SE GUARDA LA VARIABLE SINO SU UBICACION EN MEMORIA
}else{
$c=count($pads[$id_pad]['children']); //CUANTOS HIJOS TIENE EL NODO PADRE
$pads[$id_pad]['children'][$c]=$item; //SE UBICA EL ITEM EN LA ULTIMA POSISION
$pads[$id]=&$pads[$id_pad]['children'][$c];
//SE ALMACENA DONDE QUEDO GUARDADO
//EL & SIMBOLIZA Q NO SE GUARDA LA VARIABLE SINO SU UBICACION EN MEMORIA
}
}while($rs->MoveNext());
//al terminar se ha construido un array con arrays anidados.
echo json_encode($nodos);