Framework Llibreries Lliures

975 views

Published on

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

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
975
On SlideShare
0
From Embeds
0
Number of Embeds
39
Actions
Shares
0
Downloads
4
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Framework Llibreries Lliures

  1. 1. www.dunlock.com Framework Web desenvolupat amb llibreries lliures Jordi Catà Castillo - jordi.cata@dunlock.com ASSL Party 2009 – 10 de Febrer Escola Universitària Politècnica de Mataró
  2. 2. Taula de continguts 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 ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
  3. 3. Objectius de la Xerrada 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 ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
  4. 4. 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'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  5. 5. 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'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  6. 6. 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'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  7. 7. 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'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  8. 8. Disseny 3 capes Físic Negoci HTML + Smarty Tags Presentació HTML + JavaScript ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  9. 9. Disseny 3 capes - 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. ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  10. 10. Arquitectura Model – Vista - Controlador MODEL Petició CONTROLLER VISTA 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'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  11. 11. Arquitectura Model – Vista - Controlador Petició VISTA CONTROLLER Resposta Smarty ACCIO MODEL HTML Base dades Pear::DataObject ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  12. 12. Llibreries Bàsiques del Framework 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 VISTA CONTROLLER Anem a veure com funcionen per Smarty Separat MODEL HTML Base dades Pear::DataObject ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  13. 13. Presentació/Vista: Smarty Petició VISTA CONTROLLER Resposta Smarty MODEL HTML Base dades Pear::DataObject ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
  14. 14. Presentació/Vista: Smarty 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.net ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  15. 15. Presentació/Vista: Smarty, per què ? 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: HTML smarty.php.net ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  16. 16. Presentació/Vista: Smarty Instal·lació Instal·lació Smarty, última versió 2.6.22 http://smarty.net/ Descomprimim el paquet dins de libs/ obtenim: libs/internals libs/plugins libs/Smarty_Compiler.class.php libs/Smarty.class.php Sortida: HTML smarty.php.net ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  17. 17. Presentació/Vista: Smarty Configuració 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: HTML smarty.php.net ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  18. 18. 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: HTML smarty.php.net ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  19. 19. Presentació/Vista: Smarty Exemple 1 Projecte/exemple1.php <? include “Smarty_template.php”; $smarty = new Smarty_template; $smarty->assign (quot;TITTLEquot;, quot;Titol de provesquot;); $smarty->assign (quot;NOMquot;, quot;Pepe Floresquot;); $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: HTML smarty.php.net ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  20. 20. Presentació/Vista: Smarty Exemple 1 <html> plantilla.tpl <body> Nom: {$NOM}<br> Cognom: {$COGNOM} </body> </html> $smarty = new Smarty_template ; prova.php $smarty->assign (“NOM”, “Josep”); $smarty->assign (“COGNOM”, “Foix”); $smarty->display (“plantilla.tpl”); <html> <body> Nom: Josep<br> Sortida Cognom: Cognom </body> </html> ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  21. 21. Presentació/Vista: Smarty modificadors Projecte/templates/main.tpl <html> <head><title>{$TITTLE|default:Intranet}</title></head> <body> Hola: {$NOM|truncate:10|upper}<br> {$smarty.now|date_format:quot;%d-%m-%Yquot;} </body> </html> Objectius dels modificadors -> aplicar conversions a les variables d'smarty a nivell de plantilla (no a nivell de PHP) Sortida: HTML smarty.php.net ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  22. 22. Presentació/Vista: Smarty, IF 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'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  23. 23. Presentació/Vista: Smarty, Exemple 2 IF {if $USUARI_ADMIN} Ets un admin plantilla.tpl {else} Usuari normal {/if}<br> Nom: {$NOM}<br> Cognom: {$COGNOM} $smarty = new Smarty_template ; prova.php $smarty->assign (“USUARI_ADMIN”, true); $smarty->assign (“NOM”, “Josep”); $smarty->assign (“COGNOM”, “Foix”); $smarty->display (“plantilla.tpl”); <html> <body> Ets un admin Sortida Nom: Josep<br> Cognom: Cognom </body> </html> ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  24. 24. Presentació/Vista: Smarty, Section 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'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  25. 25. Presentació/Vista: Smarty, Section, exemple 3 {section name=line loop=$DADES} plantilla.tpl <br> {$DADES[line][0]}, {$DADES[line][1]} {/section} $smarty = new Smarty_template ; $smarty->assign (“USUARI_ADMIN”, true); $smarty->assign (“DADES”, array ( prova.php array(“Josep”, “Pepet”), array(“Jordi”, “Bosc”) ) ); $smarty->display (“plantilla.tpl”); <br> Sortida Josep, Pepet <br> Jordi, Bosc ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  26. 26. Presentació/Vista: Smarty, constants 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.conf NOM = “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'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  27. 27. Presentació/Vista: Smarty, constants, exemple 4 /projecte/config/catala.conf /projecte/config/castella.conf config NOM=”Nom” NOM”Nombre” TELEFON=”Telefon” TELEFON=”Telefono” plantilla.tpl {config_load file=”catala.conf”} {config_load file=”castella.conf”} <html> <html> <body> <body> {#NOM#}: {$NOM}<br> {#NOM#}: {$NOM}<br> {#TELEFON#}: {$TELEFON} {#TELEFON#}: {$TELEFON} </body> </body> </html> </html> <html> <html> <body> <body> Nom: Josep<br> Nombre: Josep<br> Sortida Telefon: Pepet Apellido: Pepet </body> </body> </html> </html> ASSL Party, EUPMT'09 ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
  28. 28. Presentació/Vista: Smarty, includes 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 <body> Nom {$NOM}, Cognom: {$COGNOM} <div align=”center”> Peu de pàgina </div> {include file=”peu_pagina.tpl”} </body> ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  29. 29. Presentació/Vista: Smarty, includes, exemple 5 capcalera.tpl main5.tpl <title> {$TITTLE|default:quot;Intranetquot;} {include file=quot;capcalera.tplquot;} </title> {$TITTLE}, Idiomes<br> llibre.tpl {config_load file=quot;lan/catalan.confquot;} {#NOM#}: {$NOM} <br><b> Català</b> </br> {#TITOL#}: {$TITOL} {#ADRECA#}: {$ADRECA} {include file=quot;llibre.tplquot;} {include file=quot;peu.tplquot;} peu.tpl Peu de pàgina ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  30. 30. Presentació/Vista: Smarty, Session, Get, Post 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} aillar la presentació del negoci !!! ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  31. 31. Presentació/Vista: Smarty 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 Petició VISTA CONTROLLER Resposta Smarty MODEL HTML Base dades Pear::DataObject ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
  32. 32. Física/Model: PEAR::DataObject Petició VISTA CONTROLLER Resposta Smarty MODEL HTML Base dades Pear::DataObject ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  33. 33. Física/Model: PEAR::DataObject 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 ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  34. 34. Física/Model: PEAR::DataObject 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. ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  35. 35. Física/Model: PEAR::DataObject: Instal·lació 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 quot;libs/DB/DataObject.phpquot;; ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  36. 36. Física/Model: PEAR::DataObject: Instal·lació 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. ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  37. 37. Física/Model: PEAR::DataObject: Generació Fitxer de configuració: /projecte/config/generate_do.ini [DB_DataObject] database = mysql://root:@localhost/test_db schema_location = classes/dbmapping class_location = classes/dbmapping require_prefix = DataObjects/ class_prefix = DataObjects_ extends_location = DataObject.php extends = DB_DataObject Executem el procés de generació php libs/DB/DataObject/createTables.php generate_do.ini ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  38. 38. Física/Model: PEAR::DataObject: Generació El generador ens genera classes dins de classes/dbmapping/ <?php class 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 } ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  39. 39. Física/Model: PEAR::DataObject Exemple 1: select $usuari = DB_DataObject::factory(quot;tusuarisquot;) $usuari->find(); ->executa quot;SELECT * FROM tusuarisquot;; $usuari = DB_DataObject::factory(quot;tusuarisquot;) $usuari->USUARI = quot;nom_usuariquot;; $usuari->CLAU = quot;contrasenyaquot;; $usuari->find(); ->executa quot;SELECT * FROM tusuaris where USUARI = quot;nom_usuariquot; AND CLAU = quot;contrasenyaquot;; $usuari = DB_DataObject::factory(quot;tusuarisquot;) $usuari->find(); while ($usuari->fetch ()) { echo quot;<br> nom usuari: quot; .$usuari->NOM_USUARI; } ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  40. 40. Física/Model: PEAR::DataObject Exemple 2: insert insert $usuari = DB_DataObject::factory(quot;tusuarisquot;) $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'); ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  41. 41. Física/Model: PEAR::DataObject Exemple 3: update, setFrom update $usuari = DB_DataObject::factory(quot;tusuarisquot;) $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(quot;tusuarisquot;) $usuari->setFrom ($_REQUEST); $usuari->insert (); --> INSERT INTO tusuaris (NOM, COGNOM) VALUES (NOM_INTRODUIT, COGNOM_INTRODUIT) } ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  42. 42. Física/Model: PEAR::DataObject Exemple 4: delete, order By delete $usuari = DB_DataObject::factory(quot;tusuarisquot;) $usuari->USUARI = “pboch”; $usuari->delete (); ->DELETE FROM tusuaris WHERE USUARI = 'pboch'; orderBy $usuari = DB_DataObject::factory(quot;tusuarisquot;) $usuari->orderBy (“NOM, COGNOM”); $usuari->find (); ->SELECT * FROM tusuaris order by NOM, COGNOM ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  43. 43. Física/Model: PEAR::DataObject Model Exemple 5: getLink 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 ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  44. 44. Física/Model: PEAR::DataObject Model Exemple 6: whereAdd $person->name = quot;testquot;; $person->whereAdd(quot;name like '%test%quot;); $person->whereAdd(quot; edat > 24”); $total = $person- >count(DB_DATAOBJECT_WHEREADD_ONLY); echo quot;There are {$total} names in the databasequot;; SELECT count(person.id) AS DATAOBJECT_NUM FROM person WHERE name like '%test%' AND edat > 24; ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  45. 45. Física/Model: PEAR::DataObject Model Altres métodes 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 !!! ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  46. 46. Física/Model: PEAR::DataObject Model 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 Petició VISTA CONTROLLER Resposta Smarty MODEL HTML Base dades Pear::DataObject ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
  47. 47. MVC: El Controlador Petició VISTA CONTROLLER Resposta Smarty MODEL HTML Base dades Pear::DataObject ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  48. 48. 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'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  49. 49. 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'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  50. 50. MVC: El Controlador: Funcionament ListUsuarislAction Petició CONTROLLER APPLICATION FRONTAL CONTROLLER GenericaView Resposta tpl_llista.php Es crida a partir de la URL: http://servidor/controller.php?page=ListUsuariAction $actions = array ( array(“GestionHotelActionquot;, quot;LlistatGenericaViewquot; , quot;tpl_lista.phpquot;), ), ); ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  51. 51. MVC: El Controlador: Application controller Application 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'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  52. 52. 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'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  53. 53. DMVC: estructura Estructura de Directoris: projecte/ classes/action/ -> Accions classes/view/ -> vistes classes/dbmapping/ -> classes de mapping BD “Models” classes/utils/ -> classes d'utilitats config/ -> fitxers de configuració libs/ -> llibreries PEAR, Smarty, etc templates/ -> templates d'smarty controller.php ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  54. 54. 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'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  55. 55. 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'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  56. 56. 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(“ListUsuariActionquot;, quot;GenericaViewquot; , quot;tpl_lista.phpquot;), array(“UsuariActionquot;, quot;GenericaViewquot;, quot;tpl_form.phpquot; ), ); $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'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  57. 57. 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'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  58. 58. El “Framework”, Classes S'encarrega de gestionar el que Process hem de fer: insert, delete, update, filtres, etc S'encarregen de configurar ListUsuarisAction UsuariAction quines taules gestionen ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  59. 59. el “Framework”: Acció i Model classes/action/ListUsuarisAction.php class ListUsuarisAction extends Process { protected $dataobject = quot;NOM_CLASSE_MAPPEIG_TAULAquot;; } Es crida a partir de la URL: http://servidor/controller.php?page=ListUsuarisAction ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  60. 60. 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(quot;idquot;,quot;Idquot;,quot;textquot;), array(quot;nomquot;,quot;Nomquot;,quot;textquot;), array(quot;cognomquot;,quot;Cognomquot;,quot;textquot;), ); ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  61. 61. el “Framework”: Acció i Model classes/dbampping/NOM_CLASSE_MAPPEIG_TAULA.php public function gets () { $this->orderBy (quot;cognom, nomquot;); $this->find (); $data = array(); while ($this->fetch ()) { $data[] = clone ($this); // -> retornem la informació //per Array d'objectes } return $data; } ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  62. 62. el “Framework”: Accions classes/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 registre function Update ($id_hotel) //s'encarrega d'actualizar el registre function Delete ($id_hotel) //esborrar el registre function Gets () //retorna la llista de registres function 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=add http://servidor/controller.php?page=UsuariAction&type=mod&id=9198 http://servidor/controller.php?page=UsuariAction&type=del&id=9198 ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  63. 63. el “Framework”: Accions classes/action/Process.php class Process { function Perform () //s'encarrega de gestionar el que hem de fer { switch ($action) { case ADD: //mostrem formulari i afegim case MOD: //mostrem formulari i editem case DEL: //esborrem case VIEW: default: //mostrem llistat amb el cercador } } } ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  64. 64. el “Framework”: Accions <?php class UsuariAction extends Process { public $title = quot;Userquot;; protected $dataobject = quot;usuarisquot;; protected $redirect; public function __construct () { $this->redirect = URL_PAGE_CONTROLLER .quot;ListUsuarisAction&type=quot; .VIEW; } function Add () // per afegir per defecte un grup d'usuari { $_REQUEST[“PERMISOS”] = 3; return parent::Add (); } } ?> ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  65. 65. el “Framework”: Accions <?php class UsuariAction extends Process { public function Add () { $_REQUEST[quot;grupquot;] = CLIENT; $_REQUEST[quot;passwordquot;] = md5($_REQUEST[quot;passwordquot;]); return parent::Add (); } public function Update ($id) { $_REQUEST[quot;passwordquot;] = md5($_REQUEST[quot;passwordquot;]); return parent::Update ($id); } } ?> ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  66. 66. 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.php tpl_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'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  67. 67. el “Framework”: permisos Container: Usuaris -< Grups -< Permisos S'encarrega de donat el grup de l'usuari controlar si pot executar l'acció o no. CONTAINER CONTAINER ListUsuarislAction CONTROLLER APPLICATION FRONTAL GenericaView CONTROLLER tpl_llista.php ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  68. 68. el “Framework”: permisos, Container Container: Usuaris -< Grups -< Permisos S'encarrega de donat el grup de l'usuari controlar si pot executar l'acció o no. id grup accio 1 1 ListArticleAction 2 1 ListClientAction 3 1 ListTipusIncidenciaAction 4 1 ListUsuariAction 5 1 ListOperariAction 8 1 ListIncidenciaExternaAction $ACTION_FACTORY = &singleton::getInstance ('ActionFactory'); $container = $ACTION_FACTORY->factory (quot;ContainerActionquot;); $container->Perform(); $usuari = new Usuaris; $REQUEST = &singleton::getInstance ('Request'); $page = $REQUEST->Get(quot;pagequot;); if (CHECK_PERMISION && !$usuari->TeAccesMenu ($page)) return false; ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  69. 69. 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'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  70. 70. Frameworks MVC 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 ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures ASSL Party, EUPMT'09,
  71. 71. Gràcies per la vostra assistencia Framework Web desenvolupat amb llibreries lliures www.dunlock.com Jordi Catà Castillo - jordi.cata@dunlock.com ASSL Party 2009 – 10 de Febrer Escola Universitària Politècnica de Mataró

×