JAMP DAY 2010 - ROMA (3)
-
Upload
jampslide -
Category
Technology
-
view
474 -
download
6
Transcript of JAMP DAY 2010 - ROMA (3)
JAMP DAY
22 Maggio 2010
Relatori:
Ruben Patanè
Giampiero Ancilletta
Università degli Studi di Roma "Tor Vergata"
SCHEMA DI PROGETTAZIONE MVC
controller
View Model
JAMP implementa il pattern architetturale Model-View-Controller
L'architettura del Framework
PLUGINApplicazioni
Esterne
DATA SOURCEClassi PHP
OGGETTIClassi PHPClassi JS
TEMPLATEFile CSSImmagini
ApplicazioniCodice PHPLayout XML
COREClassi PHPClassi JS
Schema a blocchi del CORE
Gestione sorgenti XML
Gestione Oggetti
Gestione degli errori/eventi
Gestione della Lingua
Gestione Dati
Upload / Download
DatasourceFormattazione
dati
Gestione
Sistema
Gestione
Output
JSON
XML
HTML
Compressione
Decompressione dati
Gli Oggetti
OGGETTO
PHP JS CSS
HTML PDF
I Form
FORM
CODICE(PHP)
LAYOUT(XML)
I Form
<?php require_once("./../../class/system.class.php"); $system = new ClsSystem(true); $xml = new ClsXML("form1.xml"); $event = new ClsEvent($xml); $event->managerRequest(); ?>
<?xml version="1.0" encoding="utf-8"><jamp>
<page typeobj="page" loaddata="true">........</page>
</jamp>
FORM
form1.php
form1.xml
GLI EVENTI
Introduzione agli eventi
JAMP utilizza il paradigma della programmazione ad eventi.
Il flusso del programma è quindi largamente determinato dal verificarsi di eventi esterni.
Gli eventi si possono classificare in:- Eventi server-side: eventi PHP normalmente
generati dal framework- Eventi client-side: eventi javascript normalmente
generati dall'azione dell'utente.
Introduzione agli eventi
EVENTI DEL FRAMEWORK
PHP JAVASCRIPT DOM
Gli eventi PHPGli eventi PHP entrano in gioco durante il caricamento della pagina. Sono eventi definiti dal framework e vengono generati in un determinato ordine a seconda della richiesta effettuata.
Per intercettare un evento PHP basta scrivere nel file PHP la funzione con il nome dell'evento desiderato es:
function html_before_load(){...}
PROCESSO DI CREAZIONE DI UNA PAGINAFASE 1: creazione dell pagina
LETTURA E CARICAMENTO DEL LAYOUT XML
GENERAZIONE OUTPUT
INIZIALIZZAZIONE DEL FRAMEWORK
LETTURA DATI LATO CLIENT
POPOLAZIONE OGGETTI
RICHIESTA AJAX DEL FRAMEWORK PER
IL RECUPERO DEI DATI
FASE 2: caricamento dati
LETTURA E CARICAMENTO DEL LAYOUT XML
GENERAZIONE OUTPUT
html_before_load
html_load
html_after_load
INIZIALIZZAZIONE DEL FRAMEWORK
Gli eventi PHP: Caricamento della pagina
Gli eventi PHP: esempio
<?phprequire_once("./../../class/system.class.php");$system = new ClsSystem(true);$xml = new ClsXML("result.xml");$event = new ClsEvent($xml);$event->managerRequest();
function data_select_after($ds) { global $xml; $i=0; $result = array(); while($ds->ds->dsGetRow()) { $result[$i]['DENOMINAZIONE_COMUNE'] = "+++".$ds->ds->property["row"]->DENOMINAZIONE_COMUNE."+++"; $result[$i++]['CAB'] = "---".$ds->ds->property["row"]->CAB."---"; } $out = $xml->dataXML($result); $ds->setProperty("xml", $out);}?>
Gli eventi PHP: esempioRichiesta WEB
Caricamento classeSystem
Lettura del sorgenteXML
Eventohtml_before_load
Caricamento di tutti gli oggetti dal file xml
Eventohtml_load
Gli eventi PHP: esempioPrint del codice HTML
Eventohtml_after_load
Gli eventi PHP: esempio, richiesta dati
Carica gli oggetti ds
data_after_loadall()
data_before_loadall()
data_loadall()
data_after()
GET:form1.php?data=loadall
data_before()
data()
PRINT XML/JSON
return = null o true
return = null o true
Gli eventi PHP: esempio,
restituzione dati
PrintXML
Eventodata_select_before
return?false
true
Query di Selezione
Eventodata_select_after
FINEDS
seguente
true
false
return?false
true
GenerazioneXML/JSON
Out XML/JSON
Gli eventi PHP: esempio, i dati vengono elaborati dal browser e caricati dagli oggetti
Gli eventi PHP disponibiliEVENTI PHP
HTML DATA CUSTOM
Gli eventi si differenziano dal tipo di richiesta effettuata.
- Gli eventi HTML sono quelle funzioni che restituiscono codice HTML o PDF. - Gli eventi DATA sono quelle funzioni che manipolano i dati e restituiscono codice XML/XML+JSON. - Gli eventi CUSTOM sono quelle funzioni dichiarate dall'utente.
Gli eventi PHP disponibili: HTML
GET:form.php
html_before_load()
Creazione oggetti
html_load()
Print codice HTML
html_after_load()
GET:form.php?objname=xxx
html_before_rewrite()
Creazione oggetto xxx
html_rewrite(obj)
Print codice HTML
END
html_after_rewrite()
Gli eventi PHP disponibili: DATA
Carica gli oggetti ds
data_after_loadall()
data_before_loadall()
data_loadall()
data_after()
GET:form.php?data=loadall
data_before()
data()
END
return = null o true
return = null o true
Gli eventi PHP disponibili: DATA
Carica gli oggetti ds
data_after_load()
data_before_load()
data_load()
data_after()
GET:form.php?data=load
data_before()
data()
END
return = null o true
return = null o true
Gli eventi PHP disponibili: DATA
Carica gli oggetti ds
data_after_new(obj)
data_before_new()
data_new(obj)
data_last_multirequest()
GET:form.php?data=new&...
data_before()
data()
END
data_after()
return = null o true
return = null o true
Gli eventi PHP disponibili: DATA data data_loadall data_load data_new data_update data_delete data_deleteall data_login data_changepasswd data_store data_keepalive data_last_multirequest data_select
Gli eventi PHP disponibili: CUSTOMGli eventi custom sono delle richieste data non definite dal framework. Il nome dell'evento viene indicato dall'utente nel POST es: data=myfunction l'evento si chiamerà myfunction.
<?php function myfunction() { ...} ?>
Uso degli eventi PHP
MODIFICARE OGGETTI
function html_load() { global $xml; $label1 = $xml->getObjById("label1"); $label1->setProperty("value", "Etichetta"); }
Uso degli eventi PHP
MODIFICARE DATASOURCE
function data_select_before($ds) { if ($ds->getPropertyName("id")=="ds1") $ds->setProperty("dswhere", "`id` = 5"); }
Uso degli eventi PHPAGGIUNGERE OGGETTI
function html_load() { global $xml; $text1 = $xml->pageObj->addChild("text1", "text"); }
function html_load() { global $xml; $parent = $xml->getObjById("div1"); $parent->addChild("text1", "text"); $parent->insertBefore("text2", "text", "text1"); $parent->insertAfter("text3", "text", "text2"); $parent->removeChild("text2"); }
Gli eventi JavascriptVengono identificato come eventi Javascripttutti i metodi delle classe Javascript usate nelframework.
addBeforeCustomFunctionEsegue la funzione dell'utente prima del metodo della classe JAMP. In questo caso è possibile impedire l'esecuzione del metodo della classe JAMP facendo restituire "return false" alla funzione dell'utente.
addAfterCustomFunctionEsegue la funzione dell'utente dopo il metodo della classe JAMP.
Gli eventi JavascriptSYSTEMEVENT.addBeforeCustomFunction('class', 'function', 'myfunction');.addAfterCustomFunction('class', 'function', 'myfunction');
Classe JAVASCRIPTaddBeforeCustomFunction
myFunction(param1,param2)
metodo2(parm1)
Classe JAVASCRIPT
metodo1(parm1,parm2)
metodo1(parm1,parm2)
Classe JAVASCRIPTaddAfterCustomFunction
metodo1(parm1,parm2)
myFunction(param1,param2)
Gli eventi Javascript: esempio<?xml version="1.0" encoding="utf-8"?><jamp> <page typeobj="page" title="JAMP - Esempio per la gestionedegli eventi della dsselect" icon="../../favicon.ico"> <dsselect1 typeobj="dsselect" label="\nSelect:"> <options> <opt optiontext="Samba" optionvalue="1"/> <opt optiontext="web" optionvalue="2"/> <opt optiontext="Contatti" optionvalue="3"optionselected="true"/> <opt optiontext="KPaint" optionvalue="4"/> <opt optiontext="KPilot" optionvalue="5"/> <opt optiontext="KWallet" optionvalue="6"/> <opt optiontext="KWrite" optionvalue="7"/> <opt optiontext="lassists" optionvalue="8"/> <opt optiontext="launch" optionvalue="9"/> <opt optiontext="mac" optionvalue="10"/> </options> </dsselect1> </page></jamp>
Gli eventi Javascript: esempio<?phprequire_once("./../../class/system.class.php");$system = new ClsSystem(true);$xml = new ClsXML("dsselect.xml");$event = new ClsEvent($xml);$event->managerRequest();
function html_load(){ global $event; $code = " function custom_fnz(obj) { alert('Valore: ' + obj.value); } SYSTEMEVENT.addAfterCustomFunction('DSSELECT', 'change', 'custom_fnz'); "; $event->setCodeJs($code);}?>
Gli eventi Javascript: esempio
Gli eventi DOMCon JAMP è possibile gestire gli eventi del Browser DOM2 tramite il PHP o Javascript indipendentemente dal Browser utilizzato. E' possibile creare degli eventi custom scaturiti da un evento DOM o da una chiamata diretta della funzione Javascript. Gli eventi custom vengono utilizzati da JAMP soprattutto per aggiornare gli oggetti legati al datasource.
EVENTI DOM
BASE CUSTOM
Gli eventi DOM: BASESono tutti gli eventi definiti dal DOM2: http://www.w3.org/TR/DOM-Level-2-Events/
abortblurchangeclickerrorfocusloadmousedownmousemove
mouseoutmouseovermouseupresetresizescrollselectsubmitunload
Intercettare gli eventi DOM2 da PHPIl metodo addEventListener è implementato in ogni oggetto del framework.
$obj->addEventListener($id, $event, $function, $run = false, $param = null
);
Intercettare gli eventi DOM2 da PHP
$gridds->addEventListener("gridds1_body", "keydown", "function(event) { gridds.keyDown('$id', event); }
");
$gridds->addEventListener("gridds1_body", "keyup", "function(event) { gridds.keyUp('$id', event); }
"); $gridds->addEventListener(
"gridds1_body", "click", "function() { gridds.setFocus('$id'); }
");
Intercettare gli eventi DOM2 da JavascriptLa gestione degli eventi JAVASCRIPT sono affidati alla classe SYSTEMEVENT.I metodi sono analoghi a quelli PHP. Per inserire un evento in ascolto la sintassi è:
SYSTEMEVENT->addEventListener(obj, eventname, fnz);
Intercettare gli eventi DOM2 da Javascript
function myfunction(){ alert('hai fatto click!');}
SYSTEMEVENT->addEventListener($('text1'), “click”, “myfunction”);
Gli eventi DOM: CUSTOM (solo PHP)Oltre ad intercettare gli eventi da PHP è possibile creare dei veri e propri eventi personalizzati da richiamare allo scaturire di un determinato evento o chiamando semplicemente la funzione javascript.
addEventBefore($id, $function, $call)addEvent($id, $function, $call)addEventAfter($id, $function, $call)
Function
Listener
Event Before
Event
Event After
Gli eventi DOM: CUSTOM
Gli eventi DOM: CUSTOMfunction html_load() { global $xml; $code = ' function () { alert('OK'); } '; $xml->pageObj->addEventListener("text1", "change", $code); }
function html_load() { global $xml; $xml->pageObj->addEventListener("window", "unload", "pageUnload"); $xml->pageObj->addEvent("page", "pageUnload", "alert("ok");");}
I DATASOURCE
I Datasource
Text1
Text2
Combo1
ds1(oggetto DS)
MySQLMSSQL
PostGreSQLLdapODBCCSV
FilesystemFtp
IMAPRecord
SSHXml
I Datasource
ds1(oggetto DS)
Richiesta
<?xml version="1.0" encoding="utf-8"?><data><script><![CDATA[$('ds1').DSresult = [{field1:"value1",field2:"value2"},{field1:"value3",field2:"value4"}];AJAX.setDsJSON('ds1',0,0,2,0);]]></script></data>
datasource
I Datasource: Uso dei DSPer utilizzare i datasource all'interno della propia pagina bisogna utilizzare l'oggetto DS:
<idtag typeobj="ds" conn="conn6" dsdefault="jamp" dstable="partite" dskey="id" />
Modalità di salvataggio:table: salva tutti i dati della tabella.row: salva solo il record corrente.live: salva automaticamente i dati ad ogni cambiamento del record.
I Datasource: Uso dei DSLegare un oggetto ad un datasource:
<idtag typeobj="label" label="\nLabel:" dsobj="dsname" dsitem="fieldname" />
idtag dsname
I Datasource: Accesso al DS lato serverfunction data_select_before($ds) { global $xml; if ($ds->getPropertyName("id") == "ds1") { $result = array(); $result[0]["field1"] = "value1"; $result[0]["field2"] = "value2"; $result[1]["field1"] = "value3"; $result[1]["field2"] = "value4"; $ds->setProperty("xml", $xml->dataJSON($result)); //$ds->setProperty("xml", $xml->dataXML($result)); return false; // interrompe l'esecuzione del codice } }
I Datasource: Accesso al DS lato serverfunction data_select_after($ds) { global $xml; $i=0; $result = array(); while($ds->ds->dsGetRow()) { $result[$i]['field1'] = $ds->ds->property["row"]->field1; $result[$i]['field2'] = $ds->ds->property["row"]->field2; if ($result[$i++]['field1']=="value1") $result[$i]['field3'] = "YES"; else $result[$i++]['field3'] = "NO"; } $out = $xml->dataXML($result); $ds->setProperty("xml", $out); }
I Datasource: RelazionaliPer datasource relazionale si intende la famiglia dei ds progettata per interfacciarsi a strutture dati di tipo relazionale, principalmente database relazionali.
L'esigenze che si possono avere nell'effettuare delle richieste verso un database sono divese, per tale motivo il tag ds contiene più attributi dedicati alla loro gestione
I Datasource: Relazionali
Connessione a una tabella del database:<ds1 typeobj="ds" conn="nomeconnessione" dsdefault="nomedatabase" dstable="nometabella" dskey="chiavetabella" />
Selezionare i campi di una tabella:<ds1 typeobj="ds" conn="nomeconnessione" dsdefault="nomedatabase" dstable="nometabella" dskey="chiavetabella" selecteditems="campo1,campo2" dswhere="campo1=5" dsorder="campo2" dslimit="50" />
I Datasource: Relazionali, JOIN
Tabella1key1item1
key1, item1,key2, id1,
item2
<ds1 typeobj="ds" conn="nomeconnessione" dsdefault="nomedatabase" dstable="tabella1" join="tabella2" jointype="left" dskey="key" joinrule="(tabella1.key=tabella2.id1)/>
Equivalente:
<ds1 typeobj="ds" conn="nomeconnessione" dsdefault="nomedatabase" dstable="tabella1,tabella2" dskey="key" dswhere="(tabella1.key=tabella2.id1)/>
Tabella2key2id1
item2
SELECT * FROM `tabella1` LEFT JOIN `tabella2`ON (`tabella1`.`key` = `tabella2`.`id1`)
SELECT * FROM `tabella1`,`tabella2`WHERE `tabella1`.`key` = `tabella2`.`id1`
I Datasource: Relazionali, chiavi esterne
Tabella1key1item1
Tabella2id1
item2
Tabella3id1
item3
<ds1 typeobj="ds" conn="connessione" dsdefault="database" dstable="tabella1" dskey="key1" dsrefresh="ds2,ds3" dslimit="10"/><ds2 typeobj="ds" conn="connesione" dsdefault="database" dstable="tabella2" dskey="key2" dsreferences="ds1" referenceskey="key1" foreignkey="id1"/><ds3 typeobj="ds" conn="connesione" dsdefault="database" dstable="tabella3" dskey="key3" dsreferences="ds1" referenceskey="key1" foreignkey="id1"/>
SELECT * FROM `tabella1`;SELECT * FROM `tabella2` WHERE `id1`= “key1”;SELECT * FROM `tabella3` WHERE `id1`= “key1”;
I Datasource: Relazionali, chiavi esterne
Tabella1key1item1
Tabella2key2id1
item2
Tabella3id2
item3
<ds1 typeobj="ds" conn="connessione" dsdefault="database" dstable="tabella1" dskey="key1" dsrefresh="ds2" dslimit="10"/>
<ds2 typeobj="ds" conn="connesione" dsdefault="database" dstable="tabella2" dskey="key2" dsreferences="ds1" referenceskey="key1" foreignkey="id1" dsrefresh="ds3"/>
<ds3 typeobj="ds" conn="connesione" dsdefault="database" dstable="tabella3" dskey="key3" dsreferences="ds2" referenceskey="key2" foreignkey="id2"/>
SELECT * FROM `tabella1`;
SELECT * FROM `tabella2` WHERE `id1`= “key1”;
SELECT * FROM `tabella3` WHERE `id2`= “key2”;
I Datasource: Relazionali, chiavi esterne
Tabella1key1item1 Tabella2
key2id1
item2
Tabella3id1id2
item3
<ds1 typeobj="ds" conn="connessione" dsdefault="database" dstable="tabella1" dskey="key1" dsrefresh="ds2,ds3" dslimit="10"/><ds2 typeobj="ds" conn="connesione" dsdefault="database" dstable="tabella2" dskey="key2" dsreferences="ds1" referenceskey="key1" foreignkey="id1" dsrefresh="ds3"/><ds3 typeobj="ds" conn="connesione" dsdefault="database" dstable="tabella3" dskey="key3" dsreferences="ds1,ds2" referenceskey="key1,key2" foreignkey="id1,id2"/>
SELECT * FROM `tabella1`;
SELECT * FROM `tabella2` WHERE `id1`= “key1”;
SELECT * FROM `tabella3` WHERE `id1`= “key1” and `id2`= “key2” ;
I Datasource: Relazionali, alias
/** ************************************************ **/ /** ALIAS DS **/ /** ************************************************ **/ $DS_ALIAS_ITEM["sezioni"]["uno_tot"] = "(uno_m + uno_f)"; $DS_ALIAS_ITEM["sezioni"]["uno_per"] = "CONCAT(ROUND((uno_m + uno_f) * 100 / (maschi + femmine),2), '%')"; $DS_ALIAS_ITEM["sezioni"]["due_tot"] = "(due_m + due_f)"; $DS_ALIAS_ITEM["sezioni"]["due_per"] = "CONCAT(ROUND((due_m + due_f) * 100 / (maschi + femmine),2), '%')"; $DS_ALIAS_ITEM["sezioni"]["tre_tot"] = "(tre_m + tre_f)"; $DS_ALIAS_ITEM["abitanti"]["*"] = "`nome`,`cognome`"; /** ************************************************ **/ $event->managerRequest();
I Datasource: GerarchiciPer datasource gerarchici si intende la famiglia dei ds progettata per interfacciarsi a strutture dati nidificate come filesystem, file xml, ldap.
base: percorso da cui iniziare la ricerca scope: profondità di ricerca a partire dal valore specificato nell'attributo base filter: filtro per ottenere un sottoinsieme dei risultati. justthese: restituisce solo i campi specificati. alias: il nome da dare al nodo root, se non specificato gli verrà assegnato quando definito nell'attributo base
I Datasource: GerarchiciSintassi:
<idtag typeobj="ds" conn="conn4" scope="onelevel" dskey="key" base="/jamp/data" dslimit="10"/>
Accesso a più rami:
<idtag typeobj="ds" conn="conn4" dsname="filename"><hierarchy> <root1 base="/jamp/data/class" alias="Classi" scope="base"/> <root2 base="/jamp/data/obj" alias="Oggetti" scope="base"/> </hierarchy> </idtag>
I Datasource: Gerarchici, base Filesystem: come un normale path di un filesystem(es. /var/www in ambiente UNIX o c:\php in ambiente Windows)
File XML: si gestisce come se si trattasse del path di un filesystem UNIX, se ad esempio avessimo un file del tipo:<?xml version="1.0" encoding="utf-8"?><jamp> <azienda> <reparto attributo1="....." attributo2="....."> <commerciale attributo1="....." attributo2="......." /> <vendite attributo1="........" attributo2="......" /> <tecnico attributo1="........." attributo2="" /> </reparto> </azienda></jamp>per iniziare la ricerca dal nodo reparto bisognerebbe scrivere base="/azienda/reparto".
LDAP: Specificare il dn(esempio dn="ou=Groups,dc=jamp,dc=it")
I Datasource: Gerarchici, scope
Con tale attributo si stabilisce il livello di profondità dell'interrogazione:
base: la ricerca restituirà solo il nodo selezionato onelevel: la ricerca restituirà tutti i nodi relativi al nodo selezionato tree: la ricerca restituirà il nodo con tutti i suoi nodi e sottonodi.
I Datasource: Gerarchici, filter
Utilizzato per filtrare i risultati in base alla tipologia di ds gerarchico l'attributo filter accetta:
Filesystem: "nofiles"(esclude i files), "nodirectory"(esclude le directory) o un espressione regolare File XML: espessione regolare LDAP: sintassi completa clicca qui
I Datasource: Gerarchici, justtheseE' possibile specificare nell'attributo justthese i soli campi che l'interrogazione dovrà restituire. In base alla tipologia di ds gerarchico l'attributo justthese accetta i seguenti valori(usare la , come separatore):
Filesystem dev, ino, mode,nlink, uid, gid, rdev, size, atime, mtime, ctime time of , blksize, blocks, md5
ftp perms, number, owner, group, size, datetime,md5
ssh perms, number, owner, group, size, datetime,md5
File XML: nome degli attributi da restituire LDAP: il nome degli attributi della entry(es. dn, uid, cn)
I Datasource: Record
Il datasource di tipo record è in grado di interfacciarsi a file con campi a lunghezza fissa.
<idtag typeobj="ds" conn="dsname" dsname="filename"><record>
<field1 recname="campo1" reclength="lunghezza1" /><field2 recname="campo2" reclength="lunghezza2" />.........................................<fieldn recname="campon" reclength="lunghezzan" />
</record> </idtag>
recname: Nome del campo reclength: numero di caratteri format(opzionale): formattazione del valore.
I Datasource: CSVIl datasource di tipo csv è in grado di interfacciarsi a file di tipo csv(comma-separated-value).
<idtag typeobj="ds" conn="dsname" dsname="filename"><record>
<field1 fieldname="campo1" fieldseparator="," /><field1 fieldname="campo1" fieldseparator="," />.........................................<fieldn fieldname="campo1" fieldseparator="," />
</record> </idtag>
fieldname: Nome del campo fieldseparator: separatore di campi fieldenclose: valore racchiuso da(opzionale esempio "valore") format(opzionale): formattazione del valore.
CUSTOMIZZAZIONI
GliOggetti Le Lingue
Gli Oggetti
OGGETTO
PHP JS CSS
HTML PDF