Programació en PHP
     Jordi Catà



  Programació Avançada en PHP
 Jordi Catà Castillo - jordi.cata@dunlock.com
      Dunlock – Enginyeria Informàtica
               Volcànica 2007
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.
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.
Disseny 3 capes



    Físic




   Negoci




                  HTML + Smarty Tags
 Presentació
                   HTML + JavaScript
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.
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
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>
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
Smarty, configuració

COMPILE_DIR             CACHE_DIR
/projecte/templates_c   /projecte/cache



 TEMPLATE_DIR
                        CONFIG_DIR
 /projecte/templates
                        /projecte/config
 ->plantilla.tpl




  /projecte/
  ->prova.php
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, 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>
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>
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

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

                   {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
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}
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>
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>
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>
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
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);
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();
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.
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
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, 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";

}
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;
}
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ó
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;
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
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%';
PEAR, Dataobject, utilització
Altres métodes

Limit

GroupBy

escape


selectASs

joinAdd

toArray

validate

DB_DataObject::debugLevel(5); -> IMPORTANTISIM Per Debugar Dataobject !!!
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...
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

Volcanica2007

  • 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 4directoris 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 IFd'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 SECTIONd'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 essimilar 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.
  • 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 queens 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 formaautomà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 registrerelacionat 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 registresrelacionats 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.
  • 36.
    PEAR, altres HTML_QuickForm -> Sistemaper 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