Upload
cata-castillo
View
545
Download
3
Embed Size (px)
DESCRIPTION
programació PHP,
Citation preview
Programació en PHPJordi Catà
Programació Avançada en PHP
Jordi Catà Castillo - [email protected]
Dunlock – Enginyeria Informàtica
Volcànica 2007
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
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.
HTML + Smarty Tags
HTML + JavaScript
Físic
Negoci
Presentació
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.
Disseny 3 capes
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
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
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
COMPILE_DIR/projecte/templates_c
CONFIG_DIR/projecte/config
CACHE_DIR/projecte/cache
/projecte/->prova.php
TEMPLATE_DIR/projecte/templates->plantilla.tpl
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;
}}
Smarty, configuració
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
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>
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
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>
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}
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
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}
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>
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>
<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
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:
MysqlPostgresOracleSqlite ...
pear.php.net
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);
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
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ó
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ó
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ó
<?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ó
$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ó
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ó
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ó
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ó
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;
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
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ó
Altres métodes
Limit
GroupBy
escape
selectASs
joinAdd
toArray
validate
DB_DataObject::debugLevel(5); -> IMPORTANTISIM Per Debugar Dataobject !!!
PEAR, Dataobject, utilització
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
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