1. www.dunlock.com
Framework Web
desenvolupat amb llibreries lliures
Jordi Catà Castillo - jordi.cata@dunlock.com
ASSL Party 2009 – 10 de Febrer
Escola Universitària Politècnica de Mataró
2. Taula de continguts
Objectius de la xerrada
Antecedents
Què és un Framework ? Objectius
Introducció Arquitectura Model-Vista-Controlador (disseny 3 capes)
Llibreries abstracció de la base de dades (Pear::DataObject) ->
Model
Llibreries separació lògica de negoci de HTML (Smarty) -> Vista
Funcionamnet del Controlador
Framework: Com ajuntemt Model, Vista, Controllador ?
Exemple
Altres Frameworks MVC lliures
ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
3. Objectius de la Xerrada
Veure algunes llibreries estandars que ens permeten organitzar
el codi de maneres més “interessants” per arribar a tenir un codi
escalable, mantenible, robust, etc.
Exemple “adaptat” d'arquitectura Model – Vista – Controlador
Entendre el que és un framework i que ens pot aportar.
Algunes 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.
Exemples de funcionament del Framework desenvolupat a Dunlock
ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
4. Antecedents
Que és/pot ser desenvolupar en PHP ?
- Programació sense ordre, sense cap tipus “d'enginyeria”
- 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.
ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures
ASSL Party, EUPMT'09,
5. Framework, què és ?
Un framework pot ser considerat com el conjunt de processos i
tecnologies utilitzats per a resoldre problemes complexes.
Un framework és un espai de treball on s'intenta automatitzar
tasques repetitives i s'assumeixen uns convenis de
desenvolupament.
Son dissenyats amb l'intent de facilitar el desenvolupament de
Software, encapsulant detalls de baix nivell i permetent enfocar-
nos en les funcionalitats importants.
ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures
ASSL Party, EUPMT'09,
6. Framework, què és ?
Ara bé, hi ha un debat obert amb que el us de frameworks
afegeix codi innecessari en el projecte, son pesats d'execució, no
son escalables, etc.
-> Que és més important centrar-se en detalls de baix nivell o
centrar-se en funcionalitats d'alt nivell ?
Opinió personal: Per la meva part prefereixo treballar a alt
nivell i aprofitar llibreries existents, framework que m'encapsulin
el baix nivell, i centrar-me amb funcionalitats
desenvolupament ràpid -> - cost -> + benefici + robustesa
ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures
ASSL Party, EUPMT'09,
7. Framework, objectius
Enfocat per facilitar i automatitzar les tasques que son
repetitives:
Alta
●
●Baixa
●Modificació
●Llistat
●Saber on hem de “tocar” per afegir funcionalitats a l'aplicació
Per exemple si hem de crear una nova Gestió de Factures:
●
hem de crear un nou Model, Acció i template (sinó és generic)
ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures
ASSL Party, EUPMT'09,
8. Disseny 3 capes
Físic
Negoci
HTML + Smarty Tags
Presentació
HTML + JavaScript
ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures
ASSL Party, EUPMT'09,
9. 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.
ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures
ASSL Party, EUPMT'09,
10. Arquitectura Model – Vista - Controlador
MODEL
Petició
CONTROLLER
VISTA
Resposta
Controlador: Respón als events d'un usuari i executa els models
necesaris i mostra les vistes que han de presentar les dades.
Model: Es la representació específica de la informació. Un model es pot
encarregar de calcular el preu d'una compra, afegir un nou usuari, etc
Vista: Presenta el model en un format adecuat, habitualment es la
interficie d'usuari, en el cas web per exemple HTML, XML, etc.
ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures
ASSL Party, EUPMT'09,
11. Arquitectura Model – Vista - Controlador
Petició
VISTA
CONTROLLER
Resposta
Smarty
ACCIO MODEL
HTML
Base dades
Pear::DataObject
ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures
ASSL Party, EUPMT'09,
12. Llibreries Bàsiques del Framework
Per tal d'explicar el funcionament del framework, explicarem les capes
d'accés a dades (Física) i la capa de presentació.
Presentació/Vista: Smarty
-separació de PHP del HTML
Física/Model: PEAR::DataObject
-generació de classes de mapping base de dades
-us d'aquests models
VISTA
CONTROLLER
Anem a veure com funcionen per
Smarty
Separat
MODEL
HTML
Base dades
Pear::DataObject
ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures
ASSL Party, EUPMT'09,
13. Presentació/Vista: Smarty
Petició
VISTA
CONTROLLER
Resposta
Smarty
MODEL
HTML
Base dades
Pear::DataObject
ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
14. Presentació/Vista: 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
ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures
ASSL Party, EUPMT'09,
15. Presentació/Vista: Smarty, per què ?
Permet separar la informació (dades) de la forma en que es mostra.
Permet Separar les capes de negoci i Física de la presentació, Smarty
només s'encarrega de mostrar la informació
Permet gestionar funcionalitats a nivell de Smarty sense programar
en PHP.
Permet accedir a variables de Sessio, Post, Get, Constants de PHP:
$smarty.session.VARIABLE
●
●$smarty.post.VARIABLE
●$smarty.get.VARIABLE
●$smarty.const.CONSTANT
Altres ...
Sortida: HTML
smarty.php.net
ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures
ASSL Party, EUPMT'09,
16. Presentació/Vista: Smarty Instal·lació
Instal·lació Smarty, última versió 2.6.22
http://smarty.net/
Descomprimim el paquet dins de libs/
obtenim:
libs/internals
libs/plugins
libs/Smarty_Compiler.class.php
libs/Smarty.class.php
Sortida: HTML
smarty.php.net
ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures
ASSL Party, EUPMT'09,
17. Presentació/Vista: Smarty Configuració
Smarty requereix dels directoris per poder treballar:
projecte/templates
●
●projecte/templates_c
●projecte/config
-templates: directori on tenim els fitxers de “plantilles”.
-templates_c: directori on es “compila” les plantilles per poder-se
“executar” de forma ràpida
-config: directori on troba fitxers de configuració (constants smarty)
Es important tenir permisos 777 ( a+wrx) en templates_c
Sortida: HTML
smarty.php.net
ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures
ASSL Party, EUPMT'09,
21. Presentació/Vista: Smarty modificadors
Projecte/templates/main.tpl
<html>
<head><title>{$TITTLE|default:Intranet}</title></head>
<body>
Hola: {$NOM|truncate:10|upper}<br>
{$smarty.now|date_format:quot;%d-%m-%Yquot;}
</body>
</html>
Objectius dels modificadors -> aplicar conversions a les variables
d'smarty a nivell de plantilla (no a nivell de PHP)
Sortida: HTML
smarty.php.net
ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures
ASSL Party, EUPMT'09,
22. Presentació/Vista: Smarty, 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
ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures
ASSL Party, EUPMT'09,
23. Presentació/Vista: Smarty, Exemple 2 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>
Ets un admin
Sortida
Nom: Josep<br>
Cognom: Cognom
</body>
</html>
ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures
ASSL Party, EUPMT'09,
24. Presentació/Vista: Smarty, 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}
ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures
ASSL Party, EUPMT'09,
26. Presentació/Vista: Smarty, constants
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}
ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures
ASSL Party, EUPMT'09,
28. Presentació/Vista: Smarty, 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 peu_pagina.tpl
<body>
Nom {$NOM}, Cognom: {$COGNOM}
<div align=”center”> Peu de pàgina </div>
{include file=”peu_pagina.tpl”}
</body>
ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures
ASSL Party, EUPMT'09,
30. Presentació/Vista: Smarty, Session, Get, Post
Smarty permet gestionar la informació de
$_SESSION
●
●$_POST
●$_GET
●Constants de PHP
{if $smarty.const.ADMINISTRADOR == $smarty.session.GRUPUSUARI}
Es usuari administrador
{else if $smarty.constant.REGISTRAT == $smarty.session.GRUPUSUARI}
Es registrat
{/if}
{if $smarty.get.ACCIO == “Afegir”}
Estem Afegint -> Mostrem formular d'afegir
{else}
Estem llistant -> mostrem llistat
{/if}
aillar la presentació del negoci !!!
ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures
ASSL Party, EUPMT'09,
31. Presentació/Vista: Smarty
Que hem vist ?
-Com utilitzar Smarty per separar el PHP de l'HTML
-Exemples d'us
Dins el nostre Framework amb Smarty mostrem la informació que ens arriba
des del Model a través del Controller
Petició
VISTA
CONTROLLER
Resposta
Smarty
MODEL
HTML
Base dades
Pear::DataObject
ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
32. Física/Model: PEAR::DataObject
Petició
VISTA
CONTROLLER
Resposta
Smarty
MODEL
HTML
Base dades
Pear::DataObject
ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures
ASSL Party, EUPMT'09,
33. Física/Model: PEAR::DataObject
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
ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures
ASSL Party, EUPMT'09,
34. Física/Model: 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.
ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures
ASSL Party, EUPMT'09,
35. Física/Model: PEAR::DataObject: Instal·lació
http://pear.php.net
Descarregem el paquet DataObject i el descomprimim a:
libs/
en el nostre codi haurem de fer Includes a aquestes
llibreries
include_once quot;libs/DB/DataObject.phpquot;;
ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures
ASSL Party, EUPMT'09,
36. Física/Model: PEAR::DataObject: Instal·lació
Creem la base de dades: test_db
Creem la taula usuaris
CREATE TABLE IF NOT EXISTS `usuaris` (
`id` int(11) NOT NULL,
`nom` varchar(255) NOT NULL,
`cognom` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM;
Anem a generar les classes per “Mapeijar” les taules de la BD.
ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures
ASSL Party, EUPMT'09,
38. Física/Model: PEAR::DataObject: Generació
El generador ens genera classes dins de classes/dbmapping/
<?php
class DataObjects_Usuaris extends DB_DataObject
{
###START_AUTOCODE
public $__table = 'usuaris'; // table name
public $id; // int(11) not_null primary_key
public $nom; // string(255) not_null
public $cognom; // string(255) not_null
/* Static get */
function staticGet($k,$v=NULL) {
return DB_DataObject::staticGet('DataObjects_Usuaris',$k,$v); }
/* the code above is auto generated do not remove the tag below */
###END_AUTOCODE
}
ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures
ASSL Party, EUPMT'09,
39. Física/Model: PEAR::DataObject
Exemple 1: select
$usuari = DB_DataObject::factory(quot;tusuarisquot;)
$usuari->find();
->executa quot;SELECT * FROM tusuarisquot;;
$usuari = DB_DataObject::factory(quot;tusuarisquot;)
$usuari->USUARI = quot;nom_usuariquot;;
$usuari->CLAU = quot;contrasenyaquot;;
$usuari->find();
->executa quot;SELECT * FROM tusuaris where
USUARI = quot;nom_usuariquot; AND CLAU = quot;contrasenyaquot;;
$usuari = DB_DataObject::factory(quot;tusuarisquot;)
$usuari->find();
while ($usuari->fetch ())
{
echo quot;<br> nom usuari: quot; .$usuari->NOM_USUARI;
}
ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures
ASSL Party, EUPMT'09,
41. Física/Model: PEAR::DataObject
Exemple 3: update, setFrom
update
$usuari = DB_DataObject::factory(quot;tusuarisquot;)
$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';
setFrom
assigna de forma automàtica valors del REQUEST a camps de l'objecte Dataobject
$usuari = DB_DataObject::factory(quot;tusuarisquot;)
$usuari->setFrom ($_REQUEST);
$usuari->insert ();
--> INSERT INTO tusuaris (NOM, COGNOM)
VALUES (NOM_INTRODUIT, COGNOM_INTRODUIT)
}
ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures
ASSL Party, EUPMT'09,
42. Física/Model: PEAR::DataObject
Exemple 4: delete, order By
delete
$usuari = DB_DataObject::factory(quot;tusuarisquot;)
$usuari->USUARI = “pboch”;
$usuari->delete ();
->DELETE FROM tusuaris WHERE USUARI = 'pboch';
orderBy
$usuari = DB_DataObject::factory(quot;tusuarisquot;)
$usuari->orderBy (“NOM, COGNOM”);
$usuari->find ();
->SELECT * FROM tusuaris order by NOM, COGNOM
ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures
ASSL Party, EUPMT'09,
43. Física/Model: PEAR::DataObject Model
Exemple 5: getLink
retorna el registre relacionat d'una altra taula.
Creem una nova Taula:
CREATE TABLE IF NOT EXISTS `adreces` (
`id` int(11) NOT NULL auto_increment,
`adreca` varchar(255) NOT NULL,
`id_usuari` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM ;
Generem els Dbmapping
php libs/DB/DataObject/createTables.php config/generate_do.ini
ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures
ASSL Party, EUPMT'09,
44. Física/Model: PEAR::DataObject Model
Exemple 6: whereAdd
$person->name = quot;testquot;;
$person->whereAdd(quot;name like '%test%quot;);
$person->whereAdd(quot; edat > 24”);
$total = $person-
>count(DB_DATAOBJECT_WHEREADD_ONLY);
echo quot;There are {$total} names in the databasequot;;
SELECT count(person.id) AS DATAOBJECT_NUM
FROM person
WHERE name like '%test%' AND edat > 24;
ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures
ASSL Party, EUPMT'09,
45. Física/Model: PEAR::DataObject Model
Altres métodes
Altres métodes
Limit -> SELECT * FROM usuaris LIMIT 0,30
GroupBy
escape
Count
joinAdd -> per fer joins entre dos objectes dataobject
toArray -> converteix un objecte a array
validate -> comprova que els camps de l'objecte tingui valors vàlids
DB_DataObject::debugLevel(5); -> IMPORTANTISIM Per Debugar
Dataobject !!!
ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures
ASSL Party, EUPMT'09,
46. Física/Model: PEAR::DataObject Model
Que hem vist ?
-Com utilitzar Dataobject per encapsular accés a DB.
-Exemples d'us
Dins el nostre Framework amb DataOBject encapsulem les gestions amb la
base de dades, etc
Petició
VISTA
CONTROLLER
Resposta
Smarty
MODEL
HTML
Base dades
Pear::DataObject
ASSL Party, EUPMT'09, Framework Web: desenvolupat amb llibreries Lliures
47. MVC: El Controlador
Petició
VISTA
CONTROLLER
Resposta
Smarty
MODEL
HTML
Base dades
Pear::DataObject
ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures
ASSL Party, EUPMT'09,
48. MVC: El Controlador, funcionament
Respon als events d'un usuari i executa els models necessaris i mostra les vistes que
han de presentar les dades.
Donada una petició sap quina Acció hem d'executar, quina vista i quin template hem
de mostrar
ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures
ASSL Party, EUPMT'09,
49. MVC: El Controlador, funcionament
Respon als events d'un usuari i executa els models necessaris i mostra les vistes que
han de presentar les dades.
De forma simple el controller té una lògica com:
switch ($_REQUEST[‘action’])
{
case ‘llibre’: $action_class = ‘Llibre’; break;
case ‘user’: $action_class = ‘User’; break;
case ‘show’:
default: $action_class = ‘Inici’;
}
require_once ‘actions/’.$action_class.’.php’
$action = $ACTION_FACTORY->factory ($action_class);
$action->Perform();
$vista = $VIEW_FACTORY->factory (“VISTA_A_MOSTRAR”);
$vista->Show($action);
ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures
ASSL Party, EUPMT'09,
50. MVC: El Controlador: Funcionament
ListUsuarislAction
Petició
CONTROLLER APPLICATION
FRONTAL CONTROLLER
GenericaView
Resposta
tpl_llista.php
Es crida a partir de la URL:
http://servidor/controller.php?page=ListUsuariAction
$actions = array
(
array(“GestionHotelActionquot;, quot;LlistatGenericaViewquot; , quot;tpl_lista.phpquot;),
),
);
ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures
ASSL Party, EUPMT'09,
51. MVC: El Controlador: Application controller
Application Controller classes/utils/inc_controller.php
class Controller
{
public function Exec()
{
//Get the action to exec
$ACTION_FACTORY = &singleton::getInstance ('ActionFactory');
$action = $ACTION_FACTORY->factory ($this->actions[$key]);
$action->Perform();
//Get the view and show it
$VIEW_FACTORY = &singleton::getInstance ('ViewFactory');
$view = $VIEW_FACTORY->factory ($this->views[$key]);
$view->SetTemplate ($this->templates[$key]);
$view->Show($action);
}
}
ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures
ASSL Party, EUPMT'09,
52. DMVC: Convenis
Estructura de Directoris
Model: accés a la Base de dades, consultes, etc, sempre la informació es
retorna via toArray() o array d'objectes
Plantilla: mostrar la informació, conversions de la informació, etc
ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures
ASSL Party, EUPMT'09,
54. El “Framework”, Pasos
Configuració del Framework
-> configurar la base de dades
-> Generació de dbmappings -> PEAR::Dataobject
-> creació controller.php -> definició de models,vistes i templates
-> creació de model
-> creació de vista i template
ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures
ASSL Party, EUPMT'09,
55. El “Framework”, configuració base de dades
config/config.php
define('HOSTNAME_DB', “servidor_base_de_dades”);
define('DATABASE', “nom_base_de_dades”;
define('USERNAME_DB', “usuari_base_de_dades”);
define('PASSWORD_DB', “password_base_de_dades”);
Generació DBMAPPINGS
ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures
ASSL Party, EUPMT'09,
56. El “Framework”, configuració controller
Controller.php
include_once 'config/config.php';
include_once 'config/path.php';
include_once 'config/includes.php';
-> estem a punt per treballar amb el framework
$actions = array
(
array(“ListUsuariActionquot;, quot;GenericaViewquot; , quot;tpl_lista.phpquot;),
array(“UsuariActionquot;, quot;GenericaViewquot;, quot;tpl_form.phpquot; ),
);
$CONTROLLER = &singleton::getInstance ('Controller');
$CONTROLLER->SetActionMap ($actions);
$CONTROLLER->Exec ();
--> Executarà l'accio a realitzar i després passarà dades a la Vista corresponent
ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures
ASSL Party, EUPMT'09,
57. El “Framework”, convenis
Cada Capa s'encarrega de controlar que la informació que té es correcte, i
la informació que torna es correcte
classes/action/ListNomAccioAction.php -> Llistat de Dades
classes/action/NomAccioAction.php -> Acció de Alta/Baixa/Modificació
ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures
ASSL Party, EUPMT'09,
58. El “Framework”, Classes
S'encarrega de gestionar el que
Process hem de fer: insert, delete,
update, filtres, etc
S'encarregen de configurar
ListUsuarisAction UsuariAction quines taules gestionen
ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures
ASSL Party, EUPMT'09,
59. el “Framework”: Acció i Model
classes/action/ListUsuarisAction.php
class ListUsuarisAction extends Process
{
protected $dataobject = quot;NOM_CLASSE_MAPPEIG_TAULAquot;;
}
Es crida a partir de la URL:
http://servidor/controller.php?page=ListUsuarisAction
ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures
ASSL Party, EUPMT'09,
60. el “Framework”: Acció i Model
classes/dbampping/NOM_CLASSE_MAPPEIG_TAULA.php
Definició dels camps dels formularis, cercadors i llistats
public $generate_list_array;
public $generate_search_array;
public $generate_form_array;
$this->generate_list_array =
$this->generate_search_array =
$this->generate_form_array = array (
array(quot;idquot;,quot;Idquot;,quot;textquot;),
array(quot;nomquot;,quot;Nomquot;,quot;textquot;),
array(quot;cognomquot;,quot;Cognomquot;,quot;textquot;),
);
ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures
ASSL Party, EUPMT'09,
61. el “Framework”: Acció i Model
classes/dbampping/NOM_CLASSE_MAPPEIG_TAULA.php
public function gets ()
{
$this->orderBy (quot;cognom, nomquot;);
$this->find ();
$data = array();
while ($this->fetch ())
{
$data[] = clone ($this); // -> retornem la informació
//per Array d'objectes
}
return $data;
}
ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures
ASSL Party, EUPMT'09,
62. el “Framework”: Accions
classes/action/Process.php
class Process
{
function PrepareData () //prepara dades per a mostrar un formulari
//per afegir un nou registre
function getData ($id) //obte les dades del registre per mostrar
//un formulari per modificar registre
function Add () //s'encarrega de afegir un nou registre
function Update ($id_hotel) //s'encarrega d'actualizar el registre
function Delete ($id_hotel) //esborrar el registre
function Gets () //retorna la llista de registres
function Perform () //s'encarrega de gestionar el que hem de fer
function AplySearchParameters () //s'encarrega de filtrar
}
Els mètodes es criden de forma automàtica per la classe Process segons els
parametres de la URL, per exemple:
http://servidor/controller.php?page=UsuariAction&type=add
http://servidor/controller.php?page=UsuariAction&type=mod&id=9198
http://servidor/controller.php?page=UsuariAction&type=del&id=9198
ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures
ASSL Party, EUPMT'09,
63. el “Framework”: Accions
classes/action/Process.php
class Process
{
function Perform () //s'encarrega de gestionar el que hem de fer
{
switch ($action)
{
case ADD: //mostrem formulari i afegim
case MOD: //mostrem formulari i editem
case DEL: //esborrem
case VIEW:
default: //mostrem llistat amb el cercador
}
}
}
ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures
ASSL Party, EUPMT'09,
64. el “Framework”: Accions
<?php
class UsuariAction extends Process
{
public $title = quot;Userquot;;
protected $dataobject = quot;usuarisquot;;
protected $redirect;
public function __construct ()
{
$this->redirect = URL_PAGE_CONTROLLER .quot;ListUsuarisAction&type=quot; .VIEW;
}
function Add () // per afegir per defecte un grup d'usuari
{
$_REQUEST[“PERMISOS”] = 3;
return parent::Add ();
}
}
?>
ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures
ASSL Party, EUPMT'09,
65. el “Framework”: Accions
<?php
class UsuariAction extends Process
{
public function Add ()
{
$_REQUEST[quot;grupquot;] = CLIENT;
$_REQUEST[quot;passwordquot;] = md5($_REQUEST[quot;passwordquot;]);
return parent::Add ();
}
public function Update ($id)
{
$_REQUEST[quot;passwordquot;] = md5($_REQUEST[quot;passwordquot;]);
return parent::Update ($id);
}
}
?>
ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures
ASSL Party, EUPMT'09,
66. el “Framework”: templates
Template per defecte:
tpl_main.php
{include tpl_menu.php} Mostra el menu en funció de l'usuari
{include file=$TEMPLATE_CONTENT_FILE}
tpl_search.php
tpl_list.php
Genera un llistat amb el cercador integrat
tpl_form.php
Genera un formulari d'afegir/modificar donat els parametres dels camps del
DBMapping
ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures
ASSL Party, EUPMT'09,
67. el “Framework”: permisos
Container: Usuaris -< Grups -< Permisos
S'encarrega de donat el grup de l'usuari controlar si pot executar l'acció o no.
CONTAINER
CONTAINER
ListUsuarislAction
CONTROLLER APPLICATION
FRONTAL GenericaView
CONTROLLER
tpl_llista.php
ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures
ASSL Party, EUPMT'09,
68. el “Framework”: permisos, Container
Container: Usuaris -< Grups -< Permisos
S'encarrega de donat el grup de l'usuari controlar si pot executar l'acció o no.
id grup accio
1 1 ListArticleAction
2 1 ListClientAction
3 1 ListTipusIncidenciaAction
4 1 ListUsuariAction
5 1 ListOperariAction
8 1 ListIncidenciaExternaAction
$ACTION_FACTORY = &singleton::getInstance ('ActionFactory');
$container = $ACTION_FACTORY->factory (quot;ContainerActionquot;);
$container->Perform();
$usuari = new Usuaris;
$REQUEST = &singleton::getInstance ('Request');
$page = $REQUEST->Get(quot;pagequot;);
if (CHECK_PERMISION && !$usuari->TeAccesMenu ($page)) return false;
ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures
ASSL Party, EUPMT'09,
69. el “Framework”: Millores
Automatizació de relacions 1:N, N:M
Creació de Filtres en el Frontal Controller per exemple
HtmlCommentFilter
per poder filtar continguts, preprocessar/postprocessar dades.
Generació de codi de funcionalitats: Alta, Baixa, Modificació, llistat de
Registre, paginació de llistats, etc
Creació de sistema de “plugins” per poder extendre funcionalitats de
forma ràpida.
Integració fàcil d'AJAX a nivell de framework.
Publicar el Framework en Sourceforge
ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures
ASSL Party, EUPMT'09,
70. Frameworks MVC Lliures
Hi ha multitud de Frameworks lliures en diferents tecnologies com poden ser:
PHP:
-Symfony
-CakePHP
-Akelos
-...
Python:
-Django
-Pylons
-Zope
-...
Ruby on Rails
Java
-Seam
-LifeRay
ASSL Party, EUPMT'09 Framework Web: desenvolupat amb llibreries Lliures
ASSL Party, EUPMT'09,
71. Gràcies per la vostra assistencia
Framework Web
desenvolupat amb llibreries lliures
www.dunlock.com
Jordi Catà Castillo - jordi.cata@dunlock.com
ASSL Party 2009 – 10 de Febrer
Escola Universitària Politècnica de Mataró