Volcanica2007

  • 516 views
Uploaded on

programació PHP,

programació PHP,

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
516
On Slideshare
0
From Embeds
0
Number of Embeds
1

Actions

Shares
Downloads
0
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 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. 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. 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. Disseny 3 capes Físic Negoci HTML + Smarty Tags Presentació HTML + JavaScript
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. PEAR, Dataobject, utilització Altres métodes Limit GroupBy escape selectASs joinAdd toArray validate DB_DataObject::debugLevel(5); -> IMPORTANTISIM Per Debugar Dataobject !!!
  • 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. 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