37
Programació en PHP Jordi Catà Programació Avançada en PHP Jordi Catà Castillo - [email protected] Dunlock – Enginyeria Informàtica Volcànica 2007

Volcanica2007

Embed Size (px)

DESCRIPTION

programació PHP,

Citation preview

Page 1: Volcanica2007

Programació en PHPJordi Catà

Programació Avançada en PHP

Jordi Catà Castillo - [email protected]

Dunlock – Enginyeria Informàtica

Volcànica 2007

Page 2: Volcanica2007

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.

Objectius de la Xerrada

Page 3: Volcanica2007

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.

Page 4: Volcanica2007

HTML + Smarty Tags

HTML + JavaScript

Físic

Negoci

Presentació

Disseny 3 capes

Page 5: Volcanica2007

­  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

Page 6: Volcanica2007

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

Capa presentació: Smarty

smarty.php.net

Page 7: Volcanica2007

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>

Smarty, exemple

Page 8: Volcanica2007

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

Page 9: Volcanica2007

COMPILE_DIR/projecte/templates_c

CONFIG_DIR/projecte/config

CACHE_DIR/projecte/cache

/projecte/->prova.php

TEMPLATE_DIR/projecte/templates->plantilla.tpl

Smarty, configuració

Page 10: Volcanica2007

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;

}}

Smarty, configuració

Page 11: Volcanica2007

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>

Smarty, Utilització, Variables

Page 12: Volcanica2007

Smarty, Utilització, Exemple

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>

Page 13: Volcanica2007

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

Page 14: Volcanica2007

Smarty, Utilització, If

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>

Page 15: Volcanica2007

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}

Page 16: Volcanica2007

Smarty, Utilització, Section

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

Page 17: Volcanica2007

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.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}

Page 18: Volcanica2007

Smarty, Utilització, fitxers de configuració

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

Page 19: Volcanica2007

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>

Page 20: Volcanica2007

<body>Nom Pepet, Cognom: Pepe

<div align=”center”> Peu de pàgina </div></body>

plantilla.tpl

prova.php

Sortida

<body>Nom {$NOM}, Cognom: {$COGNOM}

{include file=”peu_pagina.tpl”}</body>

$smarty = new Smarty_template ;$smarty->display (“plantilla.tpl”);

Smarty, Utilització, includes

Page 21: Volcanica2007

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

Page 22: Volcanica2007

Capa física: PEAR, DataObjectExemple 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);

Page 23: Volcanica2007

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();

PEAR, Dataobject

Page 24: Volcanica2007

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.

PEAR, Dataobject, generació

Page 25: Volcanica2007

Fitxer de configuració:

/projecte/generate_do.ini

[DB_DataObject]

database = mysql://root:@localhost/basededadesschema_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

PEAR, Dataobject, generació

Page 26: Volcanica2007

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}

PEAR, Dataobject, generació

Page 27: Volcanica2007

<?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";

}

PEAR, Dataobject, utilització

Page 28: Volcanica2007

$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;}

PEAR, Dataobject, utilització

Page 29: Volcanica2007

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';

PEAR, Dataobject, utilització

Page 30: Volcanica2007

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

PEAR, Dataobject, utilització

Page 31: Volcanica2007

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)

}

PEAR, Dataobject, utilització

Page 32: Volcanica2007

PEAR, Dataobject, utilització

getLink

retorna el registre relacionat d'una altra taula, per exemple

USUARI --> COTXE

USUARI COTXEID CODI_USUARI nom ID CODI_USUARI_FK MARCA1 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;

Page 33: Volcanica2007

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 COTXEID CODI_USUARI NOM ID CODI_USUARI_FK MARCA1 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

Page 34: Volcanica2007

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%';

PEAR, Dataobject, utilització

Page 35: Volcanica2007

Altres métodes

Limit

GroupBy

escape

selectASs

joinAdd

toArray

validate

DB_DataObject::debugLevel(5); -> IMPORTANTISIM Per Debugar Dataobject !!!

PEAR, Dataobject, utilització

Page 36: Volcanica2007

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

PEAR, altres

Page 37: Volcanica2007

Programació en PHPJordi Catà

Gracies per la vostra atenció

Programació Avançada en PHP

Jordi Catà Castillo - [email protected]

Dunlock – Enginyeria Informàtica

Volcànica 2007