JAMP DAY 2010 - ROMA (3)

Post on 17-Jun-2015

475 views 6 download

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

PDF

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