Volcanica2007

723 views

Published on

programació PHP,

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

  • Be the first to like this

No Downloads
Views
Total views
723
On SlideShare
0
From Embeds
0
Number of Embeds
8
Actions
Shares
0
Downloads
1
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Volcanica2007

  1. 1. Programació en PHP Jordi Catà Programació Avançada en PHP Jordi Catà Castillo - jordi.cata@dunlock.com Dunlock – Enginyeria Informàtica Volcànica 2007
  2. 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.
  3. 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.
  4. 4. Disseny 3 capes Físic Negoci HTML + Smarty Tags Presentació HTML + JavaScript
  5. 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.
  6. 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
  7. 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>
  8. 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
  9. 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
  10. 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; } }
  11. 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>
  12. 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> Sortida Nom: Josep<br> Cognom: Cognom </body> </html>
  13. 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
  14. 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> Sortida Ets un admin Nom: Josep<br> Cognom: Cognom </body> </html>
  15. 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}
  16. 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
  17. 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}
  18. 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>
  19. 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>
  20. 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>
  21. 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
  22. 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);
  23. 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();
  24. 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.
  25. 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
  26. 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 }
  27. 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"; }
  28. 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; }
  29. 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';
  30. 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
  31. 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) }
  32. 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;
  33. 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
  34. 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%';
  35. 35. PEAR, Dataobject, utilització Altres métodes Limit GroupBy escape selectASs joinAdd toArray validate DB_DataObject::debugLevel(5); -> IMPORTANTISIM Per Debugar Dataobject !!!
  36. 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...
  37. 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 Volcànica 2007

×