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