Framework Llibreries Lliures

71
www.dunlock.com Framework Web desenvolupat amb llibreries lliures Jordi Catà Castillo - [email protected] ASSL Party 2009 – 10 de Febrer Escola Universitària Politècnica de Mataró

description

Seminario Framework de desarrollo web a partir de librerias Libres: Smarty, PEAR::DataObject

Transcript of Framework Llibreries Lliures

Page 1: Framework Llibreries Lliures

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ó

Page 2: Framework Llibreries Lliures

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

Page 3: Framework 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

Page 4: Framework 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

Page 5: Framework 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

Page 6: Framework 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

Page 7: Framework 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

Page 8: Framework 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

Page 9: Framework 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

Page 10: Framework 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

Page 11: Framework 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

Page 12: Framework Llibreries Lliures

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

Page 13: Framework Llibreries Lliures

Base dades

Presentació/Vista: Smarty

CONTROLLER

MODEL

VISTAPetició

Resposta

Pear::DataObject

Smarty

HTML

ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures

Page 14: Framework 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

Page 15: Framework Llibreries Lliures

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è ?

Page 16: Framework Llibreries Lliures

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ó

Page 17: Framework Llibreries Lliures

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ó

Page 18: Framework Llibreries Lliures

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ó

Page 19: Framework Llibreries Lliures

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

Page 20: Framework Llibreries Lliures

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

Page 21: Framework Llibreries Lliures

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

Page 22: Framework Llibreries Lliures

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

Page 23: Framework Llibreries Lliures

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

Page 24: Framework Llibreries Lliures

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

Page 25: Framework Llibreries Lliures

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

Page 26: Framework Llibreries Lliures

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

Page 27: Framework Llibreries Lliures

/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

Page 28: Framework Llibreries Lliures

<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

Page 29: Framework Llibreries Lliures

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

Page 30: Framework Llibreries Lliures

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 !!!

Page 31: Framework Llibreries Lliures

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

Page 32: Framework Llibreries Lliures

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

Page 33: Framework 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

Page 34: Framework 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

Page 35: Framework 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

Page 36: Framework 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

Page 37: Framework 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

Page 38: Framework 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

Page 39: Framework 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

Page 40: Framework 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

Page 41: Framework 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

Page 42: Framework 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

Page 43: Framework 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

Page 44: Framework 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

Page 45: Framework 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

Page 46: Framework 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

Page 47: Framework Llibreries Lliures

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

Page 48: Framework 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

Page 49: Framework 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

Page 50: Framework 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

Page 51: Framework 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

Page 52: Framework 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

Page 53: Framework 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

Page 54: Framework 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

Page 55: Framework 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

Page 56: Framework 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

Page 57: Framework 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

Page 58: Framework 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

Page 59: Framework Llibreries Lliures

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

Page 60: Framework 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

Page 61: Framework 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

Page 62: Framework 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

Page 63: Framework 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

Page 64: Framework 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

Page 65: Framework 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

Page 66: Framework 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

Page 67: Framework 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

Page 68: Framework Llibreries Lliures

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;

Page 69: Framework Llibreries Lliures

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

Page 70: Framework 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

Page 71: Framework 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ó