Slideshow transcript
Slide 1: Programació en PHP Jordi Catà Programació PHP Jordi Catà Castillo - jordi.cata@dunlock.com Dunlock – Enginyeria Informàtica Anoia PHP Conference
Slide 2: Objectius de la Xerrada Veure algunes llibreries estandars que ens permeten organitzar el codi de maneres més “interessants”. 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.
Slide 3: Introducció Que és/pot ser desenvolupar en PHP ? Programació sense ordre, sense cap tipus de disseny. 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.
Slide 4: Disseny 3 capes Físic Negoci HTML + Smarty Tags Presentació HTML + JavaScript
Slide 5: 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.
Slide 6: Capa presentació: 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
Slide 7: Smarty, exemple plantilla.tpl Nom Usuari: {$NOM},{$COGNOM} <br> Contactes {section name=line loop=$DADES} <br> {$DADES[line].nom}, {$DADES[line].cognom} {/section} Sortida navegador Nom Usuari: Josep<br> Cognom Usuari: Foix <br> Contactes <br>Jordi, Mata <br>David, Folch <br>
Slide 8: Smarty, configuració Smarty requereix 4 directoris per poder treballar: -TEMPLATE_DIR: directori on tenim els fitxers de “plantilles”. -COMPILE_DIR: directori on es “compila” les plantilles per poder-se “executar” de forma ràpida -CONFIG_DIR: directori on troba fitxers de configuració (constants smarty) -CACHE_DIR: directori de cache per les plantilles compilades Es important tenir permisos 777 ( a+wrx) en CACHE_DIR, COMPILE_DIR
Slide 9: Smarty, configuració COMPILE_DIR CACHE_DIR /projecte/templates_c /projecte/cache TEMPLATE_DIR CONFIG_DIR /projecte/templates /projecte/config ->plantilla.tpl /projecte/ ->prova.php
Slide 10: Smarty, configuració include 'Smarty.class.php'; define ('DIR_TEMPLATES' , ROOT_PATH .'templates/'); define ('DIR_CACHE' , ROOT_PATH .'cache/'); 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; $this->cache_dir = DIR_CACHE; $this->caching = false; } }
Slide 11: Smarty, Utilització, Variables prova.php include “Smarty_template.php”; $smarty = new Smarty_template; $smarty->assign('NOM','Josep'); $smarty->assign('COGNOM','Pepet'); $smarty->display('plantilla.tpl'); -> mostrem la plantilla plantilla.tpl <html> <body> Nom: {$NOM}<br> Cognom: {$COGNOM} </body> </html>
Slide 12: Smarty, Utilització, Exemple <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>
Slide 13: Smarty, Utilització, 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
Slide 14: Smarty, Utilització, 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>
Slide 15: Smarty, Utilització, 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}
Slide 16: Smarty, Utilització, Section {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
Slide 17: Smarty, Utilització, fitxers de configuració 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}
Slide 18: Smarty, Utilització, fitxers de configuració /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>
Slide 19: Smarty, Utilització, 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 <body> Nom {$NOM}, Cognom: {$COGNOM} {include file=”peu_pagina.tpl”} </body> peu_pagina.tpl <div align=”center”> Peu de pàgina </div>
Slide 20: Smarty, Utilització, includes <body> plantilla.tpl Nom {$NOM}, Cognom: {$COGNOM} {include file=”peu_pagina.tpl”} </body> $smarty = new Smarty_template ; $smarty->display (“plantilla.tpl”); prova.php <body> Nom Pepet, Cognom: Pepe Sortida <div align=”center”> Peu de pàgina </div> </body>
Slide 21: Capa física: PEAR 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
Slide 22: Capa física: PEAR, DataObject Exemple de codi sense utilitzar Pear $query = 'SELECT * FROM my_table'; $link = mysql_connect('my_host', 'my_user', 'my_password'); mysql_select_db('my_database'); $result = mysql_query($query); $line = mysql_fetch_array($result) $link = pg_pconnect('host=host port=5432 dbname=database user=user password=pwd'); $result = pg_query($link, $query); $line = pg_fetch_result($result) $link = Ora_Logon(\"my_user\", \"my_password\"); $result = ora_do( $ora_conn, $query); ora_fetch_into( $result, $line);
Slide 23: PEAR, Dataobject Exemple de codi utilitzant Pear: $dbh = DB::connect('mysql://my_user:my_pass@my_host/my_database); $dbh = DB::connect('pgsql://my_user:my_pass@my_host/my_database); $dbh = DB::connect ('oracle://my_user:my_pass@my_host/my_database); $result = $dbh>Query ( 'SELECT * FROM * my_table'); $line = $result>fetchRow();
Slide 24: PEAR, Dataobject, generació 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.
Slide 25: PEAR, Dataobject, generació Fitxer de configuració: /projecte/generate_do.ini [DB_DataObject] database = mysql://root:@localhost/basededades 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
Slide 26: PEAR, Dataobject, generació El codi que ens genera el procés es com el següent: class DataObjects_Tusuaris extends DB_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ public $__table = 'tusuaris'; // table name public $CODI_USUARI; // int(10) not_null primary_key public $NOM; // string(50) public $COGNOM; // string(50) public $USUARI; // string(50) public $CLAU; // string(50) public $PERMISOS; // string(50) /* Static get */ function staticGet($k,$v=NULL) { return DB_DataObject::staticGet('DataObjec /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE }
Slide 27: PEAR, Dataobject, utilització <?php $opts = &PEAR::getStaticProperty('DB_DataObject','options'); $opts = array( 'class_location' => '/var/www/html/projects/classes/dbmapping', 'class_prefix' => 'DataObjects_', 'database' => 'mysql://usuari:password@localhost/basededades' ); $usuari = DB_DataObject::factory('tusuaris'); if ($usuari->get(12)) { echo \"<br> usuari trobat\"; } else { echo \"No s'ha trobat el registre d'usuari amb id 12\"; }
Slide 28: PEAR, Dataobject, utilització $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 where USUARI = \"nom_usuari\" AND CLAU = \"contrasenya\"; $usuari = DB_DataObject::factory(\"tusuaris\") $usuari->find(); while ($usuari->fetch ()) { echo \"<br> nom usuari: \" .$usuari->NOM_USUARI; }
Slide 29: PEAR, Dataobject, utilització 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'); 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';
Slide 30: PEAR, Dataobject, utilització 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
Slide 31: PEAR, Dataobject, utilització setFrom assigna de forma automàtica valors del REQUEST a camps de l'objecte Dataobject if ($_REQUEST[“submit”] == “”) { ?> NOM USUARI: <input type=”text” name=”NOM”> COGNOM USUARI: <input type=”text” name=”COGNOM”> <? } else { $usuari = DB_DataObject::factory(\"tusuaris\") $usuari->setFrom ($_REQUEST); $usuari->insert (); --> INSERT INTO tusuaris (NOM, COGNOM) VALUES (NOM_INTRODUIT, COGNOM_INTRODUIT) }
Slide 32: PEAR, Dataobject, utilització getLink retorna el registre relacionat d'una altra taula, per exemple USUARI --> COTXE USUARI COTXE ID CODI_USUARI nom ID CODI_USUARI_FK MARCA 1 2 pepet 1 2 RENAULT Un usuari té associat 1 cotxes $usuari->get (1); -> SELECT * FROM USUARIS WHERE ID = 1; -> retorna el registre del usuari $cotxe = $usuari->getLink (“CODI_USUARI”, “COTXE”, “CODI_USUARI_FK”); -> SELECT * FROM COTXE WHERE CODI_USUARI_FK = 2;
Slide 33: PEAR, Dataobject, utilització getLinks retorna els registres relacionats d'una forma automàtica a partir del fitxer databasename.links.ini [COTXE] CODI_USUARI_FK = USUARI:CODI_USUARI USUARI --> COTXE USUARI COTXE ID CODI_USUARI NOM ID CODI_USUARI_FK MARCA 1 2 pepet 1 2 RENAULT $cotxe = DB_DataObject::factory(\"COTXE\") $cotxe->get (1); -> SELECT * FROM COTXE WHERE ID = 1; $cotxe->getLinks (); echo $cotxe->_USUARI->_NOM; -> Mostra el nom del usuari Associat al registre cotxe
Slide 34: PEAR, Dataobject, utilització whereAdd, Count $person->name = \"test\"; $person->whereAdd(\"name like '%test%\"); $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%';
Slide 35: PEAR, Dataobject, utilització Altres métodes Limit GroupBy escape selectASs joinAdd toArray validate DB_DataObject::debugLevel(5); -> IMPORTANTISIM Per Debugar Dataobject !!!
Slide 36: PEAR, altres HTML_QuickForm -> Sistema per generar formularis HTML via PHP DataObject_FormBuilder -> sistema per generar formularis a partir d'objectes Dataobject, es genera automaticament Altes/Baixes/Modificacions de registres...
Slide 37: Programació en PHP Jordi Catà Gracies per la vostra atenció Programació Avançada en PHP Jordi Catà Castillo - jordi.cata@dunlock.com Dunlock – Enginyeria Informàtica Anoia PHP Conference



Add a comment on Slide 1
If you have a SlideShare account, login to comment; else you can comment as a guest- Favorites & Groups
Showing 1-50 of 0 (more)