www.dunlock.com
Framework Webdesenvolupat amb llibreries lliures
Jordi Catà Castillo - [email protected]
ASSL Party 2009 – 10 de FebrerEscola Universitària Politècnica de Mataró
Objectius de la xerrada
Antecedents
Què és un Framework ? Objectius
Introducció Arquitectura Model-Vista-Controlador (disseny 3 capes)
Llibreries abstracció de la base de dades (Pear::DataObject) -> Model
Llibreries separació lògica de negoci de HTML (Smarty) -> Vista
Funcionamnet del Controlador
Framework: Com ajuntemt Model, Vista, Controllador ?
Exemple
Altres Frameworks MVC lliures
Taula de continguts
ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
Veure algunes llibreries estandars que ens permeten organitzar el codi de maneres més “interessants” per arribar a tenir un codi escalable, mantenible, robust, etc.
Exemple “adaptat” d'arquitectura Model – Vista – Controlador
Entendre el que és un framework i que ens pot aportar.
Algunes Llibreries com:
-Smarty: Motor de plantilles que ens permet separar l'HTML del PHP.
-Pear Dataobject: Classes que ens permet “abstreure/encapsular” la base de dades d'una forma cómode.
Exemples de funcionament del Framework desenvolupat a Dunlock
Objectius de la Xerrada
ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
Antecedents
Que és/pot ser desenvolupar en PHP ?
- Programació sense ordre, sense cap tipus “d'enginyeria”- Les modificacions en el codi son lentes.- La reutilització de codi és fa pràcticament impossible. - Codi rebuscat -> codi Spaggethi
Desenvolupament d'aplicacions des del punt de vista de l'Enginyeria del Software garanteixen:
- Manteniment- Escalabilitat- Reutilització- Robustesa i Lliure d'errors
-> Estructurar el codi a 3 nivells per tal de facilitar aquests punts.
ASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
Framework, què és ?
Un framework pot ser considerat com el conjunt de processos i tecnologies utilitzats per a resoldre problemes complexes.
Un framework és un espai de treball on s'intenta automatitzar tasques repetitives i s'assumeixen uns convenis de desenvolupament.
Son dissenyats amb l'intent de facilitar el desenvolupament de Software, encapsulant detalls de baix nivell i permetent enfocar-nos en les funcionalitats importants.
ASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
Framework, què és ?
Ara bé, hi ha un debat obert amb que el us de frameworks afegeix codi innecessari en el projecte, son pesats d'execució, no son escalables, etc.
-> Que és més important centrar-se en detalls de baix nivell o centrar-se en funcionalitats d'alt nivell ?
Opinió personal: Per la meva part prefereixo treballar a alt nivell i aprofitar llibreries existents, framework que m'encapsulin el baix nivell, i centrar-me amb funcionalitats
desenvolupament ràpid -> - cost -> + benefici + robustesa
ASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
Framework, objectius
Enfocat per facilitar i automatitzar les tasques que son repetitives:
●Alta●Baixa●Modificació●Llistat●Saber on hem de “tocar” per afegir funcionalitats a l'aplicació
● Per exemple si hem de crear una nova Gestió de Factures: hem de crear un nou Model, Acció i template (sinó és generic)
ASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
HTML + Smarty Tags
HTML + JavaScript
Físic
Negoci
Presentació
Disseny 3 capes
ASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
- Física: formada per la llibreria Pear i les classes que accediran a les dades, garantint la independència del Sistema Gestor de Bases de Dades.
- Negoci: s'encarrega de gestionar, manipular les dades que li passa la capa física.
- Presentació: presenta les dades a la interfície d'usuari. Utilitza les llibreries Smarty.
Disseny 3 capes
ASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
CONTROLLER
MODEL
Arquitectura Model – Vista - Controlador
VISTA
Petició
Resposta
Controlador: Respón als events d'un usuari i executa els models necesaris i mostra les vistes que han de presentar les dades.
Model: Es la representació específica de la informació. Un model es pot encarregar de calcular el preu d'una compra, afegir un nou usuari, etc
Vista: Presenta el model en un format adecuat, habitualment es la interficie d'usuari, en el cas web per exemple HTML, XML, etc.
ASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
Base dades
Arquitectura Model – Vista - Controlador
CONTROLLER
MODEL
VISTAPetició
Resposta
Pear::DataObject
Smarty
HTML
ASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
ACCIO
Per tal d'explicar el funcionament del framework, explicarem les capes d'accés a dades (Física) i la capa de presentació.
Presentació/Vista: Smarty-separació de PHP del HTML
Física/Model: PEAR::DataObject-generació de classes de mapping base de dades-us d'aquests models
Anem a veure com funcionen perSeparat
Llibreries Bàsiques del Framework
ASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
Base dades
CONTROLLER
MODEL
VISTA
Pear::DataObject
Smarty
HTML
Base dades
Presentació/Vista: Smarty
CONTROLLER
MODEL
VISTAPetició
Resposta
Pear::DataObject
Smarty
HTML
ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
Smarty: motor de plantilles fàcilment extensible via plugins. Ens permet separar l'HTML del codi PHP
Format per Tags que dins plantilla/fitxer HTML ens indiquen els paràmetres a substituir. Variables instanciades des de PHP: {$variable}
Constants instanciades des de fitxer de configuració: {#constant#}
Estructures de Control: {if}{/if}, {section} {/section}
Template: HTML + Smarty Tags
Smarty PHP
Sortida: HTML
smarty.php.netASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
Presentació/Vista: Smarty
Permet separar la informació (dades) de la forma en que es mostra. Permet Separar les capes de negoci i Física de la presentació, Smarty només s'encarrega de mostrar la informació
Permet gestionar funcionalitats a nivell de Smarty sense programar en PHP.
Permet accedir a variables de Sessio, Post, Get, Constants de PHP:
●$smarty.session.VARIABLE●$smarty.post.VARIABLE●$smarty.get.VARIABLE●$smarty.const.CONSTANT
Altres ...
Sortida: HTMLsmarty.php.netASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
Presentació/Vista: Smarty, per què ?
Instal·lació Smarty, última versió 2.6.22
http://smarty.net/
Descomprimim el paquet dins de libs/
obtenim:
libs/internalslibs/pluginslibs/Smarty_Compiler.class.phplibs/Smarty.class.php
Sortida: HTMLsmarty.php.netASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
Presentació/Vista: Smarty Instal·lació
Smarty requereix dels directoris per poder treballar:
●projecte/templates●projecte/templates_c●projecte/config
-templates: directori on tenim els fitxers de “plantilles”.
-templates_c: directori on es “compila” les plantilles per poder-se “executar” de forma ràpida
-config: directori on troba fitxers de configuració (constants smarty)
Es important tenir permisos 777 ( a+wrx) en templates_c
Sortida: HTMLsmarty.php.netASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
Presentació/Vista: Smarty Configuració
include 'Smarty.class.php';
define ('DIR_TEMPLATES' , ROOT_PATH .'templates/');define ('DIR_TEMPLATES_C' , ROOT_PATH .'templates_c/');define ('DIR_CONFIG' , ROOT_PATH .'config/');
class Smarty_template extends Smarty{
function Smarty_template(){
$this->Smarty();$this->template_dir = DIR_TEMPLATES;$this->compile_dir = DIR_TEMPLATES_C;$this->config_dir = DIR_CONFIG;
}}
Sortida: HTMLsmarty.php.netASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
Presentació/Vista: Smarty Configuració
Projecte/exemple1.php
<?include “Smarty_template.php”;
$smarty = new Smarty_template;$smarty->assign ("TITTLE", "Titol de proves");$smarty->assign ("NOM", "Pepe Flores");
$smarty->display('main.tpl'); -> mostrem la plantilla?>
Projecte/templates/main.tpl
<html><head><title>{$TITTLE|default:Intranet}</title></head><body>
Hola: {$NOM}<br></body></html>
Sortida: HTMLsmarty.php.netASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
Presentació/Vista: Smarty Exemple 1
plantilla.tpl
prova.php
Sortida
<html><body>
Nom: {$NOM}<br>Cognom: {$COGNOM}
</body></html>
$smarty = new Smarty_template ;$smarty->assign (“NOM”, “Josep”);$smarty->assign (“COGNOM”, “Foix”);$smarty->display (“plantilla.tpl”);
<html><body>
Nom: Josep<br>Cognom: Cognom
</body></html>
ASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
Presentació/Vista: Smarty Exemple 1
Projecte/templates/main.tpl
<html><head><title>{$TITTLE|default:Intranet}</title></head><body>
Hola: {$NOM|truncate:10|upper}<br>
{$smarty.now|date_format:"%d-%m-%Y"}</body></html>
Objectius dels modificadors -> aplicar conversions a les variables d'smarty a nivell de plantilla (no a nivell de PHP)
Sortida: HTMLsmarty.php.netASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
Presentació/Vista: Smarty modificadors
La sentència IF d'smarty es molt similar a la sentencia IF de PHP.
La seva sintaxis és:
{if condicio}codi a mostrar si es compleix la condició
{elseif condicio2}codi a mostrar si es compleix la condició 2
{/if}
Exemples
{if $NOM == “Josep”} Soc en Josep{elseif $NOM == “Jordi”} Soc en Jordi{/if}
{if $NOM == “Josep” || $NOM == “Jordi”} Soc en Josep o en Jordi
ASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
Presentació/Vista: Smarty, IF
plantilla.tpl
prova.php
Sortida
{if $USUARI_ADMIN} Ets un admin{else} Usuari normal{/if}<br>
Nom: {$NOM}<br>Cognom: {$COGNOM}
$smarty = new Smarty_template ;$smarty->assign (“USUARI_ADMIN”, true);$smarty->assign (“NOM”, “Josep”);$smarty->assign (“COGNOM”, “Foix”);$smarty->display (“plantilla.tpl”);
<html><body>Ets un admin
Nom: Josep<br>Cognom: Cognom
</body></html>ASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
Presentació/Vista: Smarty, Exemple 2 IF
La sentència SECTION d'smarty es molt similar a la sentencia FOR de php.
La seva sintaxis és:
{section name=INDEX loop=$DADES}mostrem dada actual[INDEX]
{/section}
Exemples
plantilla.tpl
{section name=line loop=$DADES}<br>{$DADES[line].nom}, {$DADES[line].cognom}
{/section}
ASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
Presentació/Vista: Smarty, Section
plantilla.tpl
prova.php
Sortida
{section name=line loop=$DADES}<br>{$DADES[line][0]}, {$DADES[line][1]}
{/section}
$smarty = new Smarty_template ;$smarty->assign (“USUARI_ADMIN”, true);$smarty->assign (“DADES”,
array (array(“Josep”, “Pepet”), array(“Jordi”, “Bosc”))
);$smarty->display (“plantilla.tpl”);
<br>Josep, Pepet<br>Jordi, Bosc
ASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
Presentació/Vista: Smarty, Section, exemple 3
Smarty permet carregar “constants” directament a les plantilles, a través del tag {#NOM_CONSTANT#}. Aquests fitxers son interessants pel tema d'idiomes...
Per exemple
{#NOM#}
Aquestes constants es troben dins dels fitxers ubicats en /projecte/config/, per exemple:
/projecte/config/catala.confNOM = “Nom”
Per indicar a Smarty que carregi un d'aquest fitxers en la plantilla s'utilitza
plantilla.tpl{config_load file=”catala.conf”}{#NOM#}: {$NOM}
ASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
Presentació/Vista: Smarty, constants
/projecte/config/catala.conf /projecte/config/castella.conf
NOM=”Nom” NOM”Nombre”TELEFON=”Telefon” TELEFON=”Telefono”
{config_load file=”catala.conf”}<html><body>
{#NOM#}: {$NOM}<br>{#TELEFON#}: {$TELEFON}
</body></html>
plantilla.tpl
config
{config_load file=”castella.conf”}<html><body>
{#NOM#}: {$NOM}<br>{#TELEFON#}: {$TELEFON}
</body></html>
Sortida
<html><body>
Nom: Josep<br>Telefon: Pepet
</body></html>
<html><body>
Nombre: Josep<br>Apellido: Pepet
</body></html>
ASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
Presentació/Vista: Smarty, constants, exemple 4
<div align=”center”> Peu de pàgina </div>
<body>Nom {$NOM}, Cognom: {$COGNOM}
{include file=”peu_pagina.tpl”}</body>
El funcionament es similar a la comanda include de php, ens permet incloure el codi html d'un altre fitxer.
La sintaxis es la següent:
{include file='NOM_PLANTILLA.tpl'}
Per exemple
plantilla.tpl peu_pagina.tpl
ASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
Presentació/Vista: Smarty, includes
ASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
Presentació/Vista: Smarty, includes, exemple 5
main5.tpl
{include file="capcalera.tpl"}
{$TITTLE}, Idiomes<br>
{config_load file="lan/catalan.conf"}
<br><b> Català</b> </br>
{include file="llibre.tpl"}
{include file="peu.tpl"}
capcalera.tpl
<title>{$TITTLE|default:"Intranet"}
</title>
llibre.tpl
{#NOM#}: {$NOM}{#TITOL#}: {$TITOL}{#ADRECA#}: {$ADRECA}
peu.tpl
Peu de pàgina
Smarty permet gestionar la informació de
●$_SESSION●$_POST●$_GET●Constants de PHP
{if $smarty.const.ADMINISTRADOR == $smarty.session.GRUPUSUARI}Es usuari administrador
{else if $smarty.constant.REGISTRAT == $smarty.session.GRUPUSUARI}Es registrat
{/if}
{if $smarty.get.ACCIO == “Afegir”}Estem Afegint -> Mostrem formular d'afegir
{else}Estem llistant -> mostrem llistat
{/if}
ASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
Presentació/Vista: Smarty, Session, Get, Post
aillar la presentació del negoci !!!
Base dades
Presentació/Vista: Smarty
CONTROLLER
MODEL
VISTAPetició
Resposta
Pear::DataObject
Smarty
HTML
ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
Que hem vist ?
-Com utilitzar Smarty per separar el PHP de l'HTML
-Exemples d'us
Dins el nostre Framework amb Smarty mostrem la informació que ens arriba des del Model a través del Controller
Base dades
Física/Model: PEAR::DataObject
CONTROLLER
MODEL
VISTAPetició
Resposta
Pear::DataObject
Smarty
HTML
ASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
Pear :PHP Extension and Aplication Repository, és un framework i sistema de distribució per crear components de PHP reutilitzables.
D'entre d'altres funcionalitats destaquem la d'independitzar i encapsular la base de dades:
-Mysql-Postgres-Oracle-Sqlite- ...
pear.php.net
Física/Model: PEAR::DataObject
ASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
Dataobject permet utilitzar “objectes” per poder treballar amb les diferents taules de la base de dades.
Per exemple:
$usuari = DB_DataObject::factory('tusuaris');$usuari->NOM = “Pepet”;$usuari->insert ();
Per tal de poder treballar d'aquesta forma cal generar les classes que mapeigen les taules de la base de dades.
Física/Model: PEAR::DataObject
ASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
http://pear.php.net
Descarregem el paquet DataObject i el descomprimim a:
libs/
en el nostre codi haurem de fer Includes a aquestes llibreries
include_once "libs/DB/DataObject.php";
Física/Model: PEAR::DataObject: Instal·lació
ASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
Creem la base de dades: test_db
Creem la taula usuaris
CREATE TABLE IF NOT EXISTS `usuaris` ( `id` int(11) NOT NULL, `nom` varchar(255) NOT NULL, `cognom` varchar(255) NOT NULL, PRIMARY KEY (`id`)
) ENGINE=MyISAM;
Anem a generar les classes per “Mapeijar” les taules de la BD.
Física/Model: PEAR::DataObject: Instal·lació
ASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
Fitxer de configuració:
/projecte/config/generate_do.ini
[DB_DataObject]
database = mysql://root:@localhost/test_dbschema_location = classes/dbmappingclass_location = classes/dbmappingrequire_prefix = DataObjects/class_prefix = DataObjects_extends_location = DataObject.phpextends = DB_DataObject
Executem el procés de generació
php libs/DB/DataObject/createTables.php generate_do.ini
Física/Model: PEAR::DataObject: Generació
ASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
El generador ens genera classes dins de classes/dbmapping/
<?phpclass DataObjects_Usuaris extends DB_DataObject { ###START_AUTOCODE public $__table = 'usuaris'; // table name public $id; // int(11) not_null primary_key public $nom; // string(255) not_null public $cognom; // string(255) not_null
/* Static get */ function staticGet($k,$v=NULL) {
return DB_DataObject::staticGet('DataObjects_Usuaris',$k,$v); }
/* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE}
Física/Model: PEAR::DataObject: Generació
ASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
$usuari = DB_DataObject::factory("tusuaris")$usuari->find();
->executa "SELECT * FROM tusuaris";
$usuari = DB_DataObject::factory("tusuaris")$usuari->USUARI = "nom_usuari";$usuari->CLAU = "contrasenya";$usuari->find();
->executa "SELECT * FROM tusuaris whereUSUARI = "nom_usuari" AND CLAU = "contrasenya";
$usuari = DB_DataObject::factory("tusuaris")$usuari->find();while ($usuari->fetch ()){
echo "<br> nom usuari: " .$usuari->NOM_USUARI;}
Física/Model: PEAR::DataObject Exemple 1: select
ASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
insert
$usuari = DB_DataObject::factory("tusuaris")$usuari->NOM = “Pepet”;$usuari->COGNOM = “Boch”;$usuari->USUARI = “pboch”;$usuari->CLAU = “2323”;$usuari->insert ();
->INSERT INTO tusuaris (NOM,COGNOM,USUARI,CLAU) VALUES ('Pepet', 'Boch', 'pboch', '2323');
Física/Model: PEAR::DataObjectExemple 2: insert
ASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
update
$usuari = DB_DataObject::factory("tusuaris")$usuari->get(1); -> SELECT * FROM tusuaris WHERE CODI_USUARI = 1$usuari->CLAU = “1234”;$usuari->update ();
->UPDATE tusuaris SET CLAU = '1234' WHERE CODI_USUARI = 1 AND NOM = 'Pepet' AND COGNOM = 'Boch' AND USUARI = 'pboch';
setFrom
assigna de forma automàtica valors del REQUEST a camps de l'objecte Dataobject
$usuari = DB_DataObject::factory("tusuaris")$usuari->setFrom ($_REQUEST);
$usuari->insert ();
--> INSERT INTO tusuaris (NOM, COGNOM) VALUES (NOM_INTRODUIT, COGNOM_INTRODUIT)
}
Física/Model: PEAR::DataObjectExemple 3: update, setFrom
ASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
delete
$usuari = DB_DataObject::factory("tusuaris")$usuari->USUARI = “pboch”;$usuari->delete ();
->DELETE FROM tusuaris WHERE USUARI = 'pboch';
orderBy
$usuari = DB_DataObject::factory("tusuaris")$usuari->orderBy (“NOM, COGNOM”);$usuari->find ();
->SELECT * FROM tusuaris order by NOM, COGNOM
Física/Model: PEAR::DataObjectExemple 4: delete, order By
ASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
retorna el registre relacionat d'una altra taula.
Creem una nova Taula:
CREATE TABLE IF NOT EXISTS `adreces` ( `id` int(11) NOT NULL auto_increment, `adreca` varchar(255) NOT NULL, `id_usuari` int(11) NOT NULL, PRIMARY KEY (`id`)) ENGINE=MyISAM ;
Generem els Dbmapping
php libs/DB/DataObject/createTables.php config/generate_do.ini
Física/Model: PEAR::DataObject ModelExemple 5: getLink
ASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
$person->name = "test";
$person->whereAdd("name like '%test%");
$person->whereAdd(" edat > 24”);
$total = $person-
>count(DB_DATAOBJECT_WHEREADD_ONLY);
echo "There are {$total} names in the database";
SELECT count(person.id) AS DATAOBJECT_NUM
FROM person
WHERE name like '%test%' AND edat > 24;
Física/Model: PEAR::DataObject ModelExemple 6: whereAdd
ASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
Altres métodes
Limit -> SELECT * FROM usuaris LIMIT 0,30
GroupBy
escape
Count
joinAdd -> per fer joins entre dos objectes dataobject
toArray -> converteix un objecte a array
validate -> comprova que els camps de l'objecte tingui valors vàlids
DB_DataObject::debugLevel(5); -> IMPORTANTISIM Per Debugar Dataobject !!!
Física/Model: PEAR::DataObject ModelAltres métodes
ASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
Base dades
Física/Model: PEAR::DataObject Model
CONTROLLER
MODEL
VISTAPetició
Resposta
Pear::DataObject
Smarty
HTML
ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
Que hem vist ?
-Com utilitzar Dataobject per encapsular accés a DB.
-Exemples d'us
Dins el nostre Framework amb DataOBject encapsulem les gestions amb la base de dades, etc
Base dades
MVC: El Controlador
CONTROLLER
MODEL
VISTAPetició
Resposta
Pear::DataObject
Smarty
HTML
ASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
MVC: El Controlador, funcionament
Respon als events d'un usuari i executa els models necessaris i mostra les vistes que han de presentar les dades.
Donada una petició sap quina Acció hem d'executar, quina vista i quin template hem de mostrar
ASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
MVC: El Controlador, funcionament
Respon als events d'un usuari i executa els models necessaris i mostra les vistes que han de presentar les dades.
De forma simple el controller té una lògica com:
switch ($_REQUEST[‘action’]) {
case ‘llibre’: $action_class = ‘Llibre’; break;case ‘user’: $action_class = ‘User’; break;case ‘show’:default: $action_class = ‘Inici’;
}
require_once ‘actions/’.$action_class.’.php’
$action = $ACTION_FACTORY->factory ($action_class);$action->Perform();
$vista = $VIEW_FACTORY->factory (“VISTA_A_MOSTRAR”);$vista->Show($action);
ASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
MVC: El Controlador: Funcionament
GenericaView
Petició
Resposta
APPLICATIONCONTROLLER
ListUsuarislAction
CONTROLLERFRONTAL
tpl_llista.phpEs crida a partir de la URL:
http://servidor/controller.php?page=ListUsuariAction
$actions = array(array(“GestionHotelAction", "LlistatGenericaView" , "tpl_lista.php"),),
);ASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
MVC: El Controlador: Application controllerApplication Controller classes/utils/inc_controller.php
class Controller{
public function Exec() {
//Get the action to exec
$ACTION_FACTORY = &singleton::getInstance ('ActionFactory');
$action = $ACTION_FACTORY->factory ($this->actions[$key]);
$action->Perform();
//Get the view and show it
$VIEW_FACTORY = &singleton::getInstance ('ViewFactory');
$view = $VIEW_FACTORY->factory ($this->views[$key]);
$view->SetTemplate ($this->templates[$key]);$view->Show($action);
}}
ASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
DMVC: Convenis
Estructura de Directoris
Model: accés a la Base de dades, consultes, etc, sempre la informació es retorna via toArray() o array d'objectes
Plantilla: mostrar la informació, conversions de la informació, etc
ASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
DMVC: estructura
Estructura de Directoris:
projecte/classes/action/ -> Accionsclasses/view/ -> vistesclasses/dbmapping/ -> classes de mapping BD “Models”classes/utils/ -> classes d'utilitatsconfig/ -> fitxers de configuraciólibs/ -> llibreries PEAR, Smarty, etctemplates/ -> templates d'smartycontroller.php
ASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
El “Framework”, Pasos
Configuració del Framework
-> configurar la base de dades-> Generació de dbmappings -> PEAR::Dataobject-> creació controller.php -> definició de models,vistes i templates-> creació de model-> creació de vista i template
ASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
El “Framework”, configuració base de dades
config/config.php
define('HOSTNAME_DB', “servidor_base_de_dades”); define('DATABASE', “nom_base_de_dades”;define('USERNAME_DB', “usuari_base_de_dades”);define('PASSWORD_DB', “password_base_de_dades”);
Generació DBMAPPINGS
ASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
El “Framework”, configuració controller
Controller.php
include_once 'config/config.php';include_once 'config/path.php';include_once 'config/includes.php';
-> estem a punt per treballar amb el framework
$actions = array(array(“ListUsuariAction", "GenericaView" , "tpl_lista.php"),array(“UsuariAction", "GenericaView", "tpl_form.php" ),
);
$CONTROLLER = &singleton::getInstance ('Controller');$CONTROLLER->SetActionMap ($actions);
$CONTROLLER->Exec ();
--> Executarà l'accio a realitzar i després passarà dades a la Vista corresponent
ASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
El “Framework”, convenis
Cada Capa s'encarrega de controlar que la informació que té es correcte, i la informació que torna es correcte
classes/action/ListNomAccioAction.php -> Llistat de Dades
classes/action/NomAccioAction.php -> Acció de Alta/Baixa/Modificació
ASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
El “Framework”, Classes
ASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
Process
ListUsuarisAction UsuariAction
S'encarrega de gestionar el que hem de fer: insert, delete, update, filtres, etc
S'encarregen de configurar quines taules gestionen
el “Framework”: Acció i Model
classes/action/ListUsuarisAction.php
class ListUsuarisAction extends Process{
protected $dataobject = "NOM_CLASSE_MAPPEIG_TAULA";}
Es crida a partir de la URL:
http://servidor/controller.php?page=ListUsuarisAction
ASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
el “Framework”: Acció i Model
classes/dbampping/NOM_CLASSE_MAPPEIG_TAULA.php
Definició dels camps dels formularis, cercadors i llistats
public $generate_list_array;public $generate_search_array;public $generate_form_array;
$this->generate_list_array = $this->generate_search_array = $this->generate_form_array = array (
array("id","Id","text"),array("nom","Nom","text"),array("cognom","Cognom","text"),
);
ASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
el “Framework”: Acció i Model
classes/dbampping/NOM_CLASSE_MAPPEIG_TAULA.php
public function gets (){
$this->orderBy ("cognom, nom");
$this->find ();$data = array();while ($this->fetch ()){
$data[] = clone ($this); // -> retornem la informació //per Array d'objectes
}return $data;
}
ASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
el “Framework”: Accionsclasses/action/Process.php
class Process{
function PrepareData () //prepara dades per a mostrar un formulari //per afegir un nou registre
function getData ($id) //obte les dades del registre per mostrar //un formulari per modificar registre
function Add () //s'encarrega de afegir un nou registrefunction Update ($id_hotel) //s'encarrega d'actualizar el registrefunction Delete ($id_hotel) //esborrar el registre function Gets () //retorna la llista de registresfunction Perform () //s'encarrega de gestionar el que hem de fer
function AplySearchParameters () //s'encarrega de filtrar }
Els mètodes es criden de forma automàtica per la classe Process segons els parametres de la URL, per exemple:
http://servidor/controller.php?page=UsuariAction&type=addhttp://servidor/controller.php?page=UsuariAction&type=mod&id=9198http://servidor/controller.php?page=UsuariAction&type=del&id=9198
ASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
el “Framework”: Accionsclasses/action/Process.php
class Process{
function Perform () //s'encarrega de gestionar el que hem de fer {
switch ($action){
case ADD: //mostrem formulari i afegimcase MOD: //mostrem formulari i editemcase DEL: //esborrem case VIEW:default: //mostrem llistat amb el cercador
}}
}
ASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
el “Framework”: Accions
<?phpclass UsuariAction extends Process{ public $title = "User"; protected $dataobject = "usuaris"; protected $redirect; public function __construct () { $this->redirect = URL_PAGE_CONTROLLER ."ListUsuarisAction&type=" .VIEW; }
function Add () // per afegir per defecte un grup d'usuari {
$_REQUEST[“PERMISOS”] = 3; return parent::Add ();
}}?>
ASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
el “Framework”: Accions
<?phpclass UsuariAction extends Process{ public function Add ()
{$_REQUEST["grup"] = CLIENT;$_REQUEST["password"] = md5($_REQUEST["password"]);return parent::Add ();
}
public function Update ($id){
$_REQUEST["password"] = md5($_REQUEST["password"]);return parent::Update ($id);
}}?>
ASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
el “Framework”: templates
Template per defecte:
tpl_main.php
{include tpl_menu.php} Mostra el menu en funció de l'usuari
{include file=$TEMPLATE_CONTENT_FILE}
tpl_search.phptpl_list.php
Genera un llistat amb el cercador integrat
tpl_form.php
Genera un formulari d'afegir/modificar donat els parametres dels camps del DBMapping
ASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
el “Framework”: permisos
ASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
GenericaViewAPPLICATIONCONTROLLER
ListUsuarislAction
CONTROLLERFRONTAL
tpl_llista.php
CONTAINER
Container: Usuaris -< Grups -< Permisos
S'encarrega de donat el grup de l'usuari controlar si pot executar l'acció o no.
CONTAINER
id grup accio1 1 ListArticleAction2 1 ListClientAction3 1 ListTipusIncidenciaAction4 1 ListUsuariAction5 1 ListOperariAction8 1 ListIncidenciaExternaAction
el “Framework”: permisos, Container
ASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
Container: Usuaris -< Grups -< Permisos
S'encarrega de donat el grup de l'usuari controlar si pot executar l'acció o no.
$ACTION_FACTORY = &singleton::getInstance ('ActionFactory');$container = $ACTION_FACTORY->factory ("ContainerAction");
$container->Perform();
$usuari = new Usuaris;
$REQUEST = &singleton::getInstance ('Request'); $page = $REQUEST->Get("page");
if (CHECK_PERMISION && !$usuari->TeAccesMenu ($page)) return false;
el “Framework”: Millores
Automatizació de relacions 1:N, N:M
Creació de Filtres en el Frontal Controller per exemple
HtmlCommentFilter
per poder filtar continguts, preprocessar/postprocessar dades.
Generació de codi de funcionalitats: Alta, Baixa, Modificació, llistat de Registre, paginació de llistats, etc
Creació de sistema de “plugins” per poder extendre funcionalitats de forma ràpida.
Integració fàcil d'AJAX a nivell de framework.
Publicar el Framework en Sourceforge
ASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
Hi ha multitud de Frameworks lliures en diferents tecnologies com poden ser:
PHP:-Symfony-CakePHP-Akelos-...
Python:-Django-Pylons-Zope-...
Ruby on Rails
Java -Seam-LifeRay
Frameworks MVC Lliures
ASSL Party, EUPMT'09ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
www.dunlock.com
Gràcies per la vostra assistencia
Framework Webdesenvolupat amb llibreries lliures
Jordi Catà Castillo - [email protected]
ASSL Party 2009 – 10 de FebrerEscola Universitària Politècnica de Mataró
Top Related