May 21, 2012

flashpunk pixel collision

Enemy.as

package
{
import net.flashpunk.Entity;
import net.flashpunk.graphics.Image;
import net.flashpunk.utils.Input;
import net.flashpunk.utils.Key;
import net.flashpunk.FP;
import net.flashpunk.masks.*;

public class Enemy extends Entity
{
[Embed(source = '../data/enemy.png')] private var ImgEnemy:Class;

public function Enemy()
{
graphic = new Image(ImgEnemy);
mask = new Pixelmask(ImgEnemy);
//setHitbox(50, 50);
width = 50;
height = 50;
x =
y = 250;
type = "Enemy";

}

override public function update():void
{
if (collide("Player", x, y) != null)
{
FP.world.remove(this);
FP.log("Collisione!");
}
}
}
}

Player.as

package
{
import net.flashpunk.Entity;
import net.flashpunk.graphics.Image;
import net.flashpunk.utils.Input;
import net.flashpunk.utils.Key;
import net.flashpunk.FP;
import net.flashpunk.masks.*;

public class Player extends Entity
{
[Embed(source = '../data/player.png')] private const ImgPlayer:Class;

public function Player()
{
graphic = new Image(ImgPlayer);
mask = new Pixelmask(ImgPlayer);
//setHitbox(50, 50);
width = 50;
height = 50;
x = 100;
y = 100;
type = "Player";
}

override public function update():void
{
if (Input.check(Key.LEFT)) { x -= 5; }
if (Input.check(Key.RIGHT)) { x += 5; }
if (Input.check(Key.UP)) { y -= 5; }
if (Input.check(Key.DOWN)) { y += 5; }
}

}
}

Space.as

package
{
import net.flashpunk.World;

public class Space extends World
{
public function Space()
{
add(new Player());
add(new Enemy());
}

}
}

Main.as

package
{
import net.flashpunk.Engine;
import net.flashpunk.FP;

public class Main extends Engine
{
public function Main()
{
super(800, 600, 60, false);
FP.console.enable();
}

override public function init():void
{
trace("FlashPunk has started successfully!");
FP.log("FlashPunk has started successfully!");
FP.world = new Space();
super.init();
}

}
}

 







Login Required







maskera da spritemap per collision in flashpunk

http://flashpunk.net/forums/index.php?action=printpage;topic=395.0

Lista WebServer win32

http://www.appservnetwork.com/index.php

  • Apache 2.2.8
  • PHP 5.2.6
  • MySQL 5.0.51b
  • phpMyAdmin-2.10.3
  • ultimo agg.   2008-06-10 00:33:27
download: http://prdownloads.sourceforge.net/appserv/appserv-win32-2.5.10.exe?download

aaa

http://www.easyphp.org

EasyPHP 5.3.6.1 : PHP 5.3.6 VC9 + Apache 2.2.19 VC9 + MySQL 5.5.13
EasyPHP 5.3.7 RC3 : PHP 5.3.7 RC3 VC9 + Apache 2.2.19 VC9 + MySQL 5.5.13

aaa

http://www.wmcreation.it
aaa


 

http://www.apachefriends.org/en/xampp.html

  • Apache 2.2.17
  • MySQL 5.5.8
  • PHP 5.3.5
  • phpMyAdmin 3.3.9
  • FileZilla FTP Server 0.9.37
  • Tomcat 7.0.3 (with mod_proxy_ajp as connector)

http://www.wampserver.com/
- Apache 2.2.17
- Php 5.3.5 (version 32 bits)
- Php 5.3.4 (version 64 bits)
- Mysql 5.1.53 (version 64 bits)
- Mysql 5.5.8 (version 32 bits)
- XDebug 2.1.0-5.3-vc6 (32 bits)
- XDebug 2.1.0-5.3-vc9 (64 bits)
- XDC 1.5
- PhpMyadmin 3.3.9
- SQLBuddy 1.3.2
- webGrind 1.0


Foxserv

http://sourceforge.net/projects/foxserv/
aaa


 

http://en.wikipedia.org/wiki/Comparison_of_WAMPs

 

 

 

 

 

 

 

PEAR:: LiveUser

Introduzione

Una delle sfide chiave nella creazione di un’applicazione Web prevede la gestione dei diritti di accesso a tutte le varie funzioni che l’applicazione offre. In precedenza, era spesso sufficiente a distinguere tra gli ospiti, utenti e amministratori. Oggi, quando più persone all’interno di una società sono coinvolti in amministrare una applicazione web, si è reso necessario per controllare l’accesso alle diverse funzioni nel web app. Ciò è ancor più nel caso del mercato in rapida crescita di applicazioni intranet.
L’idea alla base di questo brusio applicazione web non è quello di creare versioni web-based di applicazioni legacy esistenti che sono altrettanto separati dal resto dell’infrastruttura IT come prima. La forza motrice è l’integrazione. I dati degli utenti la migrazione da un progetto all’altro è noioso e spesso non fattibile.Innovazione è in stallo. L’infrastruttura è riorganizzato, non per ragioni di efficienza, ma semplicemente a causa della necessità di alcune applicazioni. Il denaro viene sprecato, ed i progetti vengono ritardati. InserisciLiveUser.
LiveUser offre un sistema flessibile permesso e permette l’integrazione di fonti di autenticazione contemporaneamente. Tuttavia, invece di costringere tutte le sue funzionalità su ogni singolo utente, ne consegue un approccio flessibile contenitore per rendere le sue funzionalità veramente opzionale ed estensibile. LiveUser fornisce anche un ampio set di funzionalità out of the box – abbastanza per soddisfare la maggior parte dei requisiti più impegnativi che i clienti possono evocare. Può essere utilizzato per autenticare contro una vasta gamma di fonti di autenticazione, come XML, database, LDAP, RADIUS, IMAP e POP3. Il backend permesso sostiene i diritti degli utenti, gruppi di utenti, ruoli, proprietà, e molte altre caratteristiche che consentono di organizzare i vostri diritti.
LiveUser stessa è parte del repository PEAR, ed è mantenuto attivamente da più di una mezza dozzina di sviluppatori. Mentre la prima versione stabile è prevista per i prossimi mesi, è già in uso “in produzione” su molti siti web. Inoltre, LiveUser ha ormai raggiunto la fase di beta, il che significa che è il momento giusto per i potenziali utenti ad abbracciarla e assicurare che non si perde tempo su soluzioni personalizzate che semplicemente reinventare la ruota. In questo articolo vi introdurrà l’architettura di LiveUser, e la ‘out of the box’ LiveUser funzionalità che fornisce – sia per l’autenticazione e l’autorizzazione.

Architettura
Uno dei nostri principali decisioni architettoniche, realizzato durante le prime fasi di sviluppo LiveUser, era quello di separare il backend di autenticazione e l’autorizzazione per consentire l’integrazione delle diverse fonti di autenticazione in collaborazione con LiveUser. Ciò significa che, utilizzando LiveUser, ogni utente all’interno di ciascuna delle fonti di autenticazione dei dati può essere associato a un ID univoco all’interno del backend permesso. Allo stesso tempo, qualsiasi tipo di backend può essere integrato in LiveUser grazie al suo approccio contenitore. Così LiveUser può essere facilmente esteso alla gestione di altre fonti di dati o di integrare le funzionalità molto specifiche, a condizione che il backend dato implementa l’interfaccia fornita.
Abbiamo anche fatto una serie di disposizioni per assicurare le migliori prestazioni di runtime. Per uno, il codice necessario per gestire il contenuto all’interno delle fonti di dati è stato separato dal codice necessario includere durante le operazioni di runtime comune. Inoltre, le diverse caratteristiche nei contenitori autorizzazioni fornite sono state suddivise in diversi livelli di complessità: semplice, medio, complesso. Inoltre, grande cura è stata presa per garantire che nessuno dei livelli di complessità influenzare negativamente il permesso degli altri, mentre allo stesso tempo mantenendo la capacità di muoversi tra di loro in qualsiasi fase del progetto.
Un’altra parte del LiveUser che ha ottenuto un sacco di attenzione è l’API. L’idea di base era quella di minimizzare lo sforzo di formazione alle spalle LiveUser integrazione nelle applicazioni esistenti. Tutto ciò che serve è una decisione su come strutturare i diritti e di assegnazione dei diritti, dopo di che gli sviluppatori semplicemente bisogno di implementare il controllo dei diritti umani. E ‘abbastanza facile da porta gli schemi di autenticazione esistenti per LiveUser: schemi di autenticazione esistenti possono essere semplicemente avvolta in un contenitore.Per esempio, LiveUser fornisce un contenitore di autenticazione che avvolge PEAR:: Auth in LiveUser, rendendo la migrazione così banale come possibile, ma anche di esporre tutti i backend supportato da PEAR:: Auth a LiveUser.

Listato 1 mostra l’API di base chiamate che è necessario, per aggiungere LiveUser al codice. Se la chiamata al metodo scorso ha lasciato Vi state chiedendo, quindi leggere ulteriormente in questo articolo per ulteriori dettagli.

Lista 1: LiveUser – API di base chiamate/ / Carico LiveUser
require_once `LiveUser.php ‘;
/ / Crea un oggetto
$ LU = LiveUser:: factory (..);
/ / Utente loggato?
$ LU-> isLoggedIn ();
/ / Cos’è successo?
$ LU-> getStatus ();
/ / Assegno un diritto
$ LU-> checkRight ($ a destra);
/ / Assegno un diritto basato sulla proprietà
$ LU-> checkRightLevel ($ a destra, $ user, $ gruppo);

Alcuni usi campione del Admin API sono mostrato nel Listato 2. Per esempi di usi più dettagliate, consultare i numerosi esempi forniti come parte del pacchetto LiveUser, che si possono trovare anche nel CVS.

Lista 2: Usi Esempio di Admin API/ / Carico LiveUser Admin API
require_once `LiveUser / admin.php ‘;
/ / Crea un oggetto
$ Admin = new LiveUser_Admin (..);
/ / Aggiunge un utente
$ User_id = $ admin-> addUser (..);
/ / Chiama un metodo nel contenitore di autenticazione
$ Admin-> auth-> getUsers (..);
/ / Chiama un metodo nel contenitore permesso
$ Admin-> perm-> GetGroups (..);

A questo punto si consiglia inoltre di richiedere un certo tempo per sfogliare il codice e familiarizzare con l’architettura. Si noti che tutti i file common.php sono in realtà definizioni di interfaccia per i contenitori dato.Autenticazione
LiveUser attualmente fornito con cinque contenitori diversi per l’autenticazione. Tre di loro si differenziano dallo strato di astrazione del database utilizzato: PEAR:: DB, PEAR:: MDB, e PEAR:: MDB2. Gli altri due sono un contenitore basato su XML e un contenitore wrapper PEAR:: Auth. Funzionalità mancanti possono essere aggiunti estendendo un contenitore esistente o scrivendo un nuovo contenitore (estendendo il relativo file di interfaccia).
Dal LiveUser può accettare un’istanza esistente di uno dei tre livelli di astrazione (detto in precedenza), tra cui tre diverse varianti del contenitore del database interno LiveUser in grado di migliorare notevolmente le prestazioni. Si consiglia di utilizzare i contenitori a base MDB, per la massima compatibilità con i più esotici RDBMS, dal momento che MDB offre un insieme più completo di funzioni astrazione. Un’altra caratteristica interessante del contenitore del database è che sia il nome della tabella e le colonne della tabella utilizzati sono configurabili – così, per la maggior parte delle applicazioni esistenti, i contenitori database può essere utilizzato senza dover modificare lo schema esistente.Permesso
La parte permesso di LiveUser richiede una spiegazione un po ‘di più rispetto alla sezione di autenticazione. Come accennato prima, LiveUser divide la funzionalità per la parte permesso in tre livelli: semplice , medio e complesso . Al momento della scrittura, LiveUser fornisce un’implementazione di tutti i livelli di complessità utilizzando un database backend, e l’attuazione del semplice contenitore usando un backend XML. Il backend database viene implementato utilizzando i tre livelli di astrazione; PEAR:: DB, PEAR:: MDB, e PEAR:: MDB2. Tutti i commenti relativi valgono anche per i contenitori permesso. Tuttavia, i contenitori permesso solo permettono di impostare un prefisso facoltativo tavolo, invece di consentire la configurazione di tutti i nomi di tabella e colonna.
La realizzazione dei tre diversi livelli di complessità servire come un buon esempio di come si possa va espandendo su un container esistente, sia in permesso e la parte di autenticazione LiveUser. Ogni livello di complessità eredita dal livello di sotto di essa – che è, il contenitore di media eredita la sua funzionalità dal semplice contenitore, mentre il contenitore complesso eredita la sua funzionalmente dal contenitore mezzo.
Successivamente, lavoreremo attraverso ciascuno dei contenitori a partire dal semplice al complesso del contenitore. Sarebbe bene fare riferimento allo schema del database, mentre leggete le sezioni prossima nell’articolo.
Si prega di notare che la tabella liveuser_right_scope non è attualmente in uso in LiveUser. Uno dei suoi scopi originale era quello di consentire a un altro livello di organizzazione dei diritti. Per esempio, se il perm_type nella tabella liveuser_perm_users era sotto di due, sarebbe stato possibile mostrare solo i diritti per gli utenti in una GUI di amministrazione. Tuttavia, questa funzione non ha trovato la sua strada nel codice ma, né vi è alcun piano attuale per aggiungerlo nel pacchetto.Permessi semplice
Come suggerisce il nome questo contenitore fornisce solo la semplice autorizzazione: l’assegnazione di diritti agli utenti. Tuttavia, poiché è nel punto più basso della struttura di ereditarietà, è importante avere familiarità con alcuni dei bisogni fondamentali LiveUser tabelle:

  • La tabella più importante è la tabella liveuser_perm_users. Agli utenti di tutti i contenitori di autenticazione sono associati a un perm_user_id singolo, in questa tabella. Poiché questo ID agisce come un identificatore univoco per un determinato utente, dovrebbe essere utilizzato come punto di riferimento per ogni utente al di fuori di LiveUser. Il campo perm_type definisce il tipo di utente. Per la semplice contenitore impostare il valore su quattro (o superiore) se si desidera che l’utente sia un super amministratore che ha automaticamente tutti i diritti. I diversi livelli sono definiti come costanti all’interno del file di classe permesso di interfaccia.
  • Tutti i diritti sono definiti nella tabella liveuser_rights e sono raggruppati in aree cosiddette utilizzando la tabella liveuser_areas, mentre le aree sono a loro volta organizzati in applicazioni utilizzando la tabella liveuser_applications. Diritti di organizzare in questo modo ha diversi vantaggi. In primo luogo, questo rende possibile la scrittura di uno script che esporta un array o di una serie di costanti – questo significa che è possibile utilizzare nomi per i diritti all’interno dell’applicazione invece di interi che rappresenta l’ID giusto. In secondo luogo, queste informazioni possono anche essere usato per migliorare la struttura dei diritti all’interno di una GUI di amministrazione. Infine, si rende possibile un ulteriore elemento – un esempio dell’uso di questo è fatto nel contenitore di media. Gli utenti vengono assegnati i loro diritti nella tabella liveuser_userrights.
  • Le tabelle liveuser_language e liveuser_translations vengono utilizzati per aggiungere un nome e una descrizione di applicazioni, le aree, i gruppi (che sarà introdotto nel contenitore di media), lingue e diritti. Il section_id nella tabella liveuser_translations corrisponde all’ID del soggetto (ad esempio, il area_id) che viene descritto. section_type è un intero che viene assegnato per tutti i tipi di entità che può essere descritto nella tabella.

Un insieme di costanti che rappresentano i diversi tipi si possono trovare all’interno della classe interfaccia per le autorizzazioni della API di amministrazione.Permessi di media
Mentre la funzionalità del semplice contenitore può essere sufficiente per la maggior parte dei siti web, diventa molto limitante per le applicazioni Web reali. Per questo motivo, il contenitore di media introduce due concetti chiave: i gruppi e gli amministratori dell’area .
In LiveUser, gruppi di utenti e ruoli sono in realtà memorizzati e manipolati allo stesso modo. Si noti che la prossima major release di LiveUser permetterà ai due di essere separati, pur mantenendo la possibilità di miscelare i due concetti come e quando necessario. Per questa ragione, la corrente liveuser_groups tavolo sarà esteso a definire facoltativamente una group_type . Gli utenti vengono assegnati a un gruppo utilizzando la liveuser_groupusers tavolo, e la liveuser_grouprights tabella viene utilizzata per assegnare i diritti a un gruppo.
La “zona amministratori” sfrutta la caratteristica organizzazione per i diritti che abbiamo acquisito attraverso la tabella liveuser_area . Se un utente è stato impostato il perm_type admin zona (all’interno del liveuser_perm_users tabella) utilizzando il numero intero ‘tre’, uno sguardo al liveuser_area_admin_areas tabella è fatto durante il processo di lettura i diritti. Un utente che è stato assegnato aree nella tabella viene automaticamente concesso tutti i diritti della data area, rendendo così molto facile da concedere a un utente la gestione dei diritti ad una certa sezione del proprio sito, senza dover assegnare manualmente alcun diritto di recente introduzione.Permessi complesso
La maggior parte delle applicazioni Web dovrebbero essere ben coperti con le funzionalità fornite dal contenitore mezzo. Alcuni hanno bisogno di andare un passo avanti, comunque. Il contenitore complesso introduce i seguenti concetti nuovi:sottogruppi , eredità a destra , e giusti livelli .
La liveuser_subgroup tabella può essere utilizzata per organizzare gruppi in strutture infinitamente profonda. Si noti ancora che il concetto di “gruppo” in LiveUser copre sia “gruppi di utenti” e “ruoli”. Una funzionalità simile è disponibile anche per i diritti con il has_implied campo nella liveuser_rights tabella, in combinazione con il liveuser_right_implied tavolo. Se i campi has_implied contengono Y, LiveUser farà una ricerca nel liveuser_right_implied tabella per determinare quali ‘diritti’ il diritto dato implica. Questo può essere utile per garantire che tutti gli utenti che hanno il diritto di ‘cancellare’ un dato oggetto anche il diritto di ‘leggere’ sullo stesso oggetto. Il “diritto eredità” concetto assicura che non è necessario assegnare esplicitamente il diritto ‘leggere’ per l’utente, se l’eredità è impostato come descritto. (Questo significa anche che l’utente perde il diritto di leggere immediatamente quando non ha più il diritto di cancellare.)
Il concetto di “livelli di destra” è un’altra caratteristica LiveUser potente. Questo concetto permette di limitare l’applicazione di un diritto al concetto di proprietà. Per esempio, è possibile limitare gli utenti a ‘modificare’ solo ciò che in origine ‘aggiunto’ al sistema. Si noti che la memorizzazione della proprietà deve essere affidati a terzi di LiveUser. Il “diritto livelli” concetto permette anche di passare proprietari LiveUser contemporaneamente e gestire sia gli utenti e / o gruppi come proprietari. Un esempio di API chiamata utilizzando il concetto di proprietà è indicato nella riga del listato 1.
LiveUser definisce tre livelli, da uno a tre, l’ultimo che è il più alto livello. Tutti i livelli più elevati sono il livello più basso. Un diritto concesso a significa ‘un livello’ che il diritto può essere applicato solo se la perm_user_id dell’utente autenticato corrisponde a uno degli ID passato come i proprietari degli utenti. Che attribuisce il diritto a ‘livello due’ permette anche di applicare il diritto, se uno dei gruppi, l’utente autenticato è un membro, è elencato nel gruppo di proprietari. Con ‘terzo livello’ il diritto può essere applicato senza limitazioni. Il livello a cui viene concesso un diritto dato è determinato dalla right_level campo nella liveuser_userrights eliveuser_grourights tabelle. Speciali tipi di amministratore come admin area o super amministratore sono sempre concesso un ‘livello tre’ a destra.
Si noti che LiveUser cerca di determinare il livello più alto in cui un utente ha effettuato il diritto indipendentemente dal fatto che questo è stato ottenuto tramite assegnazione diretta per l’utente, o attraverso un gruppo. L’unica eccezione a questa regola è che il livello della liveuser_userrights tabella può opzionalmente essere un valore negativo. Nel caso un ‘livello negativo’ è assegnato, il livello viene sottratto dal livello utente potrebbe avere acquisito tramite l’appartenenza a un gruppo. Solo se il livello risultante è sopra lo zero sarà l’utente ha diritto a livello determinato dalla sottrazione. Pertanto, se un utente ha diritto a ‘livello meno due’, e lei è un membro di un gruppo che ha lo stesso diritto al ‘livello tre’, avrebbe in realtà finiscono per avere il diritto di ‘primo livello’. Questa caratteristica non è probabilmente qualcosa che viene utilizzata spesso, ma può evitare di dover creare un nuovo ruolo proprio per disabilitare un diritto specifico che un utente ottiene attraverso un ruolo.Nomi diversi, lo stesso concetto
Una delle sfide di integrare un sistema come LiveUser, in base alle esigenze del cliente, sia effettivamente in grado di mappare i termini utilizzati dal cliente per i concetti e termini utilizzati nella LiveUser. Per esempio, in LiveUser, il “permesso” è usato al posto di “autorizzazione” – questo è stato fatto in quanto l’autorizzazione è spesso confusa con l’autenticazione, due cose nettamente diverse. Si noti inoltre che il ruolo parola non compare nelle versioni correnti, perché i ruoli sono effettivamente implementate utilizzando i gruppi (in LiveUser). Con le spiegazioni in questo articolo, si sarà in grado di mappare i concetti in modo corretto.
Un concetto che si può spesso essere di fronte è RBAC. Essenzialmente, RBAC fornisce i seguenti concetti al fine di gestire la gestione dei diritti: utenti , ruoli ,permessi , oggetti e operazioni . Per esempio, una domanda che si potrebbe desiderare di chiedere in un sistema RBAC potrebbe andare così: Esiste un dato utente ha un determinato ruolo che gli concede un permesso di eseguire una determinata operazione su un dato oggetto. Al primo sguardo non sembra LiveUser può effettivamente essere visto come una implementazione RBAC. Tuttavia, se si passa attraverso di loro, passo dopo passo, è possibile vedere i concetti corrispondenti in LiveUser.
LiveUser ha un concetto di utenti e ruoli. Un diritto che è stato concesso ad un utente è semplicemente un permesso. I prossimi due concetti non potrebbe essere così ovvia – essenzialmente, in RBAC, trovando il diritto di controllare, si compone di due pezzi di informazione – l’oggetto e l’operazione. Un oggetto è solo una risorsa di sistema che è soggetto a qualche forma di controllo degli accessi. Quindi abbiamo solo bisogno di un modo per determinare il controllo degli accessi, che sarà controllato prima di un’operazione è permesso di essere eseguiti. Per questo stesso motivo, l’operazione è solo un diritto. Essere in grado di determinare il diritto di controllare, quando si accede a un oggetto, può essere fatta sia da avere una mappatura chiara tra i diversi tipi a disposizione di oggetti e di una data area, oppure memorizzando destra lungo con l’oggetto reale.
C’è un filo su SitePoint che funge da punto di ingresso del bene a coloro che non sono a conoscenza di RBAC.Il cammino da seguire
Come indicato in premessa, una prima versione stabile è prevista in un futuro vicino. Il numero di bug riscontrati in questi ultimi mesi sono stati molto modesti.Tuttavia, ci sono una serie di caratteristiche che devono essere lavorato fino ad allora. La maggior parte del lavoro è stato fatto sulle API per rendere più facile da usare e più flessibile e intuitivo.
Alcune delle caratteristiche prese in considerazione sono la possibilità di scelta dei gruppi separati in gruppi di utenti e ruoli, eliminando la dipendenza da sessioni di PHP, e la possibilità di autenticarsi nei confronti delle altre fonti di dati come NTLM e Kerberos. Un’altra caratteristica attualmente in discussione è la capacità di impostare e richiedono una certa qualità di autenticazione. Mentre l’autenticazione debole può essere sufficiente per alcune parti di un’applicazione, altri possono richiedere l’autenticazione particolarmente forte. Dovrebbe essere possibile per l’autenticazione di richiedere una certa qualità di autenticazione. Se l’utente è già autenticati con una qualità inferiore, LiveUser dovrebbe costringere gli utenti ad autenticarsi contro una fonte di qualità superiore di autenticazione prima di poter continuare. Il livello di qualità rilevanti possono essere configurate per ogni fonte di dati di autenticazione. Per esempio, l’autenticazione contro una base di dati può portare a ‘livello due’ di qualità e contro un altro sarebbe risultato in un ‘livello di quattro’.
Un altro importante miglioramento è stato progettato nel settore dei diritti di caching. LiveUser cerca di ottimizzare le prestazioni di runtime mettendo in cache i diritti di un utente ha dato. Sia il contenitore e il contenitore complesso medio (in una certa misura) esigono che una serie di operazioni da fare per determinare i diritti di un determinato utente. Al momento, però, LiveUser fornisce solo la possibilità di memorizzare nella cache i diritti all’interno della sessione utente. I limiti strutturali all’interno di LiveUser, che in precedenza reso questo un requisito, sono stati già rimossi. Quindi è probabile che LiveUser presto acquisire la capacità di cache di fuori della sessione. Ciò significa anche che i cambiamenti dell’utente nel autorizzazioni utente influenzerà le sessioni utente attivo, che attualmente non è il caso.
Un’altra area che verrà esplorato in modo più approfondito nei prossimi mesi è il concetto di Single Sign-On (SSO). In realtà tutto ciò che probabilmente ha bisogno di essere fatto è quello di fornire un campione di alcuni contenitori di attuazione diverse varianti di Single Sign-on – l’infrastruttura fornita da LiveUser sembra essere più che sufficiente.Conclusione
LiveUser è un framework molto flessibile che può essere utilizzato per gestire l’autenticazione e le autorizzazioni. Esso è destinato in scala con le esigenze dell’applicazione. Una facile integrazione nei infrastruttura IT esistente, che è spesso pieno di applicazioni legacy, è anche uno dei momenti salienti del LiveUser.A causa della netta separazione delle parti di autenticazione e l’autorizzazione e l’approccio contenitore di LiveUser, potrebbe non essere l’attuazione più rapida possibile del set di funzionalità fornite. Tuttavia, molto lavoro è già stato fatto per renderlo sufficientemente veloce per la maggior parte delle applicazioni.
Una delle aree in cui LiveUser manca attualmente è la documentazione. Questo articolo è in realtà l’introduzione più completa a LiveUser disponibile ovunque in questo momento. Il team di sviluppo LiveUser è comunque lavorando per porre rimedio a questa situazione con l’aiuto di un bacino d’utenza sempre più grande, e un Wiki è stata creata per facilitare la collaborazione. Una volta che la prima versione stabile rotola fuori, LiveUser sarà (si spera) essere pienamente documentato e pronto per essere utilizzato in una grande varietà di applicazioni.< i > Chi l’Autore < / i >
Lukas Smith è un membro del Gruppo PEAR e principale sviluppatore di MDB, MDB2 e LiveUser. Egli è anche uno dei co-fondatori di BackendMedia, specializzata nello sviluppo di applicazioni Web e servizi connessi a Internet.Link e Letteratura

pear quickform jquery calendar v0.2

leggi pear quickform jquery calendar v0.1

demo:

http://tecnoxtutti.com/xot/extPear/sample/example_jquery_datetime.php

 

file: jquery_datetime.php

<?php
/*
$pathz = array($_SERVER['DOCUMENT_ROOT'].'/PEAR/PEAR/');
set_include_path(implode(PATH_SEPARATOR,$pathz));
*/
// Load the main class
/*
require_once 'HTML/QuickForm.php';
require_once 'HTML/QuickForm/element.php';
require_once 'HTML/QuickForm/date.php';
*/
//require_once("HTML/QuickForm/text.php");
require_once ('HTML/QuickForm/date.php');

HTML_QuickForm::registerElementType('jquery_datetime', __FILE__, 'HTML_QuickForm_jquery_datetime');

class HTML_QuickForm_jquery_datetime extends HTML_QuickForm_date{
    var $_name = '';
    var $_options = array(
        'language'         => 'it',
        'format'           => 'd/m/Y H:i',
        'minYear'          => 2001,
        'maxYear'          => 2010,
        'addEmptyOption'   => false,
        'emptyOptionValue' => '',
        'emptyOptionText'  => ' ',
        'optionIncrement'  => array('i' => 1, 's' => 1)
    );

////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
	 function setValue($v) {
	    //echo  '<h3>setValue(</h3><pre>';print_r($v);echo ')</pre>';
		if (is_null($v))		{
			return null;
		}
		if (!is_array($v)) {
			$dateTime =  strtotime($v);
			//echo '<br/>[1['.$dateTime.']]'.date('d/m/Y H:i',$dateTime);
			return parent::setValue($v);
			//return parent::setValue($dateTime_arr);
		}
		if (isset($v['dmy'])) {
		    //echo '<br/>[dmy]['.$v['dmy'].']]';
			if($v['dmy']=='') $v['dmy']=date('d/m/Y');
			list($v['d'], $v['m'], $v['Y']) = explode('/', $v['dmy']);
		}
		if(!isset($v['H'])) $v['H']=0;
		if(!isset($v['i'])) $v['i']=0;

		if (is_array($v['H'])) {
			$v['H'] = $v['H'][0];
			$v['i'] = $v['i'][0];
			$v['m'] = $v['m'][0];
			$v['d'] = $v['d'][0];
			$v['Y'] = $v['Y'][0];
		}
		if (isset($v['m']) && isset($v['d']) && isset($v['Y'])) {
		    //echo '<br/>mktime('.$v['H'].' , '.$v['i'].' , 0, $v['m'], $v['d'], $v['Y']);
			$dateTime = mktime($v['H'] *1, $v['i']*1, 0, $v['m']*1, $v['d']*1, $v['Y']*1);
		}else {
			$dateTime = mktime($v['H'] , $v['i'], 0);
		}
		//echo '[2['.$dateTime.']]'.date('d/m/Y H:i',$dateTime);
		return parent::setValue($dateTime);

    }
///////////////////////////////////////////////////////////////////////////////////////////////	

    function toHtml()    {
        $html = '';
		$v = $this->getValue();
        if ($this->_flagFrozen) {
            setlocale(LC_TIME, 'ita');
			if (is_array($v['H'])) {
				$v['H'] = $v['H'][0];
				$v['i'] = $v['i'][0];
				$v['m'] = $v['m'][0];
				$v['d'] = $v['d'][0];
				$v['Y'] = $v['Y'][0];
			}
            $timestamp = mktime($v['H'], $v['i'], 0, $v['m'], $v['d'], $v['Y']);
            return utf8_encode(strftime("%A %d %B %Y - %H:%M",$timestamp));
        }
		//*/
        if (!defined('HTML_QUICKFORM_jquery_LOADED')) {
			$html.= '<link type="text/css" href="/css/ui-lightness/jquery-ui-1.8.1.custom.css" rel="stylesheet" />
			<script type="text/javascript" src="/js/jquery-1.4.2.min.js"></script>
			<script type = "text/javascript" src = "/js/jquery-ui-1.8.1.custom.min.js" > </script> ';
            define('HTML_QUICKFORM_jquery_LOADED', true);
        }
		 if (!defined('HTML_QUICKFORM_jquery_datetime_LOADED')) {
	//$(document).ready(function() {
		//$('#rows_15121_data').datepicker({ dateFormat: 'dd/mm/yy' });
			$html.= "<script type=\"text/javascript\">
				$(function() {
				//$('.datepick').each(function(){
				//	$(this).datepicker({ dateFormat: 'dd/mm/yy' });
				//});
				$('.datepick').datepicker({ dateFormat: 'dd/mm/yy' });
			});
			</script>";
		define('HTML_QUICKFORM_jquery_datetime_LOADED', true);
        }
		//$html .= parent::toHtml();

if(isset($v['H'])) if (is_array($v['H'])) {
			$v['H'] = $v['H'][0];
			$v['i'] = $v['i'][0];
}
if(isset($v['m'])) if (is_array($v['m'])) {
			$v['m'] = $v['m'][0];
			$v['d'] = $v['d'][0];
			$v['Y'] = $v['Y'][0];
		}
if(isset($v['d']) && isset($v['m']) && isset($v['Y'])){
	$v['dmy'] = $v['d'].'/'.$v['m'].'/'.$v['Y'];
}
 $html.= '';

if(strpos($this->_options['format'],'d')!==false && strpos($this->_options['format'],'m')!==false && strpos($this->_options['format'],'Y')!==false){
	$html.= '<span><input id="'.$this->_name.'" name="'.$this->_name.'[dmy]" type="text"  value="'.$v['dmy'].'" size="12" class="datepick" />';
	$html.= '<label for="data_end[dmy]">GG/MM/AAAA</label></span> ';
}
if(strpos($this->_options['format'],'H')!==false && strpos($this->_options['format'],'i')!==false){
	$html.='
<span><input id="'.$this->_name.'[H]"
name="'.$this->_name.'[H]"
class="field text"
size="2"
type="text"
maxlength="2"
value="'.$v['H'].'"  /> :
<label for="'.$this->_name.'[H]">Ore</label></span>

<span><input id="'.$this->_name.'[i]"
name="'.$this->_name.'[i]"
class="field text "
size="2"
type="text"
maxlength="2"
value="'.$v['i'].'"  />
<label for="'.$this->_name.'[i]">Min</label></span>';
}
    return $html;
    }
////////////////////////////////////////
    function setName($name)    {
        $this->_name = $name;
    }
////////////////////////////////////////
    function getName()    {
        return $this->_name;
    }    

/////////////////////////////////////////////////////
function extractVarX($var,$value) {

}

/////////////////////////////////////////////////////
//-----------------------------------
function onQuickFormEvent($event, $arg, &$caller){
    switch ($event) {
        case 'updateValue':
			$value = $this->_findValue($caller->_constantValues);
            if (null === $value) {
                $value = $this->_findValue($caller->_submitValues);
                if (null === $value) {
                    $value = $this->_findValue($caller->_defaultValues);
                }
            }

			$v=$value;
			if (isset($value['dmy'])) {
				$tmp = explode('/', $value['dmy']);
				if (count($tmp) == 3) {
					list($v['d'], $v['m'], $v['Y']) = $tmp;
				}
			}
			//echo '<pre>'; print_r($v); echo '</pre>';

            if (null !== $value) {
			    $txt="";
				if($v!=""){
					$caller->_submitValues[$this->getName()]=$v;
					$this->_value=$v;
					$this->setValue($v);
				}else{
					$this->setValue($value);
				}
            }else if($v!=""){
				$caller->_submitValues[$this->getName()]=$v;
				$this->_value=$v;
				$this->setValue($v);
			}
        break;
        default:
            parent::onQuickFormEvent($event, $arg, $caller);
    }

    return true;
} // end func onQuickFormEvent

//------------------------------------------------------------------------------------
}//end class

?>

pear quickform jquery calendar

usiamo il calendario delle jquery come campo “datetime”

demo:

http://tecnoxtutti.com/xot/extPear/sample/example_jquery_datetime.php

download:

[download id="3"]

screen shot:

file jquery_datetime.php

<?php
/*
$pathz = array($_SERVER['DOCUMENT_ROOT'].'/PEAR/PEAR/');
set_include_path(implode(PATH_SEPARATOR,$pathz));
*/
// Load the main class
/*
require_once 'HTML/QuickForm.php';
require_once 'HTML/QuickForm/element.php';
require_once 'HTML/QuickForm/date.php';
*/
//require_once("HTML/QuickForm/text.php");
require_once ('HTML/QuickForm/date.php');

HTML_QuickForm::registerElementType('jquery_datetime', __FILE__, 'HTML_QuickForm_jquery_datetime');

class HTML_QuickForm_jquery_datetime extends HTML_QuickForm_date{
    var $_name = '';
    var $_options = array(
        'language'         => 'it',
        'format'           => 'd/m/Y H:i',
        'minYear'          => 2001,
        'maxYear'          => 2010,
        'addEmptyOption'   => false,
        'emptyOptionValue' => '',
        'emptyOptionText'  => ' ',
        'optionIncrement'  => array('i' => 1, 's' => 1)
    );

////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
	 function setValue($v) {
	    //echo  '<h3>setValue(</h3><pre>';print_r($v);echo ')</pre>';
		if (is_null($v))		{
			return null;
		}
		if (!is_array($v)) {
			$dateTime =  strtotime($v);
			//echo '<br/>[1['.$dateTime.']]'.date('d/m/Y H:i',$dateTime);
			return parent::setValue($v);
			//return parent::setValue($dateTime_arr);
		}
		if (isset($v['dmy'])) {
		    //echo '<br/>[dmy]['.$v['dmy'].']]';
			if($v['dmy']=='') $v['dmy']=date('d/m/Y');
			list($v['d'], $v['m'], $v['Y']) = explode('/', $v['dmy']);
		}
		if(!isset($v['H'])) $v['H']=0;
		if(!isset($v['i'])) $v['i']=0;

		if (is_array($v['H'])) {
			$v['H'] = $v['H'][0];
			$v['i'] = $v['i'][0];
			$v['m'] = $v['m'][0];
			$v['d'] = $v['d'][0];
			$v['Y'] = $v['Y'][0];
		}
		if (isset($v['m']) && isset($v['d']) && isset($v['Y'])) {
		    //echo '<br/>mktime('.$v['H'].' , '.$v['i'].' , 0, $v['m'], $v['d'], $v['Y']);
			$dateTime = mktime($v['H'] *1, $v['i']*1, 0, $v['m']*1, $v['d']*1, $v['Y']*1);
		}else {
			$dateTime = mktime($v['H'] , $v['i'], 0);
		}
		//echo '[2['.$dateTime.']]'.date('d/m/Y H:i',$dateTime);
		return parent::setValue($dateTime);

    }
///////////////////////////////////////////////////////////////////////////////////////////////	

    function toHtml()    {
        $html = '';
		$v = $this->getValue();
        if ($this->_flagFrozen) {
            setlocale(LC_TIME, 'ita');
			if (is_array($v['H'])) {
				$v['H'] = $v['H'][0];
				$v['i'] = $v['i'][0];
				$v['m'] = $v['m'][0];
				$v['d'] = $v['d'][0];
				$v['Y'] = $v['Y'][0];
			}
            $timestamp = mktime($v['H'], $v['i'], 0, $v['m'], $v['d'], $v['Y']);
            return utf8_encode(strftime("%A %d %B %Y - %H:%M",$timestamp));
        }
		//*/
        if (!defined('HTML_QUICKFORM_jquery_LOADED')) {
			$html.= '<link type="text/css" href="/css/ui-lightness/jquery-ui-1.8.1.custom.css" rel="stylesheet" />
			<script type="text/javascript" src="/js/jquery-1.4.2.min.js"></script>
			<script type = "text/javascript" src = "/js/jquery-ui-1.8.1.custom.min.js" > </script> ';
            define('HTML_QUICKFORM_jquery_LOADED', true);
        }
		 if (!defined('HTML_QUICKFORM_jquery_datetime_LOADED')) {
	//$(document).ready(function() {
		//$('#rows_15121_data').datepicker({ dateFormat: 'dd/mm/yy' });
			$html.= "<script type=\"text/javascript\">
				$(function() {
				//$('.datepick').each(function(){
				//	$(this).datepicker({ dateFormat: 'dd/mm/yy' });
				//});
				$('.datepick').datepicker({ dateFormat: 'dd/mm/yy' });
			});
			</script>";
		define('HTML_QUICKFORM_jquery_datetime_LOADED', true);
        }
		//$html .= parent::toHtml();

if(isset($v['H'])) if (is_array($v['H'])) {
			$v['H'] = $v['H'][0];
			$v['i'] = $v['i'][0];
}
if(isset($v['m'])) if (is_array($v['m'])) {
			$v['m'] = $v['m'][0];
			$v['d'] = $v['d'][0];
			$v['Y'] = $v['Y'][0];
		}
if(isset($v['d']) && isset($v['m']) && isset($v['Y'])){
	$v['dmy'] = $v['d'].'/'.$v['m'].'/'.$v['Y'];
}
 $html.= '';

if(strpos($this->_options['format'],'d')!==false && strpos($this->_options['format'],'m')!==false && strpos($this->_options['format'],'Y')!==false){
	$html.= '<span><input id="'.$this->_name.'" name="'.$this->_name.'[dmy]" type="text"  value="'.$v['dmy'].'" size="12" class="datepick" />';
	$html.= '<label for="data_end[dmy]">GG/MM/AAAA</label></span> ';
}
if(strpos($this->_options['format'],'H')!==false && strpos($this->_options['format'],'i')!==false){
	$html.='
<span><input id="'.$this->_name.'[H]"
name="'.$this->_name.'[H]"
class="field text"
size="2"
type="text"
maxlength="2"
value="'.$v['H'].'"  /> :
<label for="'.$this->_name.'[H]">Ore</label></span>

<span><input id="'.$this->_name.'[i]"
name="'.$this->_name.'[i]"
class="field text "
size="2"
type="text"
maxlength="2"
value="'.$v['i'].'"  />
<label for="'.$this->_name.'[i]">Min</label></span>';
}
    return $html;
    }
////////////////////////////////////////
    function setName($name)    {
        $this->_name = $name;
    }
////////////////////////////////////////
    function getName()    {
        return $this->_name;
    }    

/////////////////////////////////////////////////////
//-----------------------------------
function onQuickFormEvent($event, $arg, &$caller){
    switch ($event) {
        case 'updateValue':
		    $dmy=$caller->_submitValues[$this->_name]['dmy'];
			list($d, $m, $Y) = explode('/',$dmy);
			$H = 0;
			$i = 0;
			if(isset($caller->_submitValues[$this->_name]['H'])) $H=$caller->_submitValues[$this->_name]['H'];
			if (isset($caller->_submitValues[$this->_name]['i'])) $i = $caller->_submitValues[$this->_name]['i'];
			$v = array('d' => $d,
						'm' => $m,
						'Y' => $Y,
						'H' => $H,
						'i' => $i,
						'dmy' => $dmy);
			$value = $this->_findValue($caller->_constantValues);
            if (null === $value) {
                $value = $this->_findValue($caller->_submitValues);
                if (null === $value) {
                    $value = $this->_findValue($caller->_defaultValues);
                }
            }
            if (null !== $value) {
			    $txt="";
				if($v!=""){
					$caller->_submitValues[$this->getName()]=$v;
					$this->_value=$v;
					$this->setValue($v);
				}else{
					$this->setValue($value);
				}
            }else if($v!=""){
				$caller->_submitValues[$this->getName()]=$v;
				//echo "cccccccc[".$v."]";
				$this->_value=$v;
				$this->setValue($v);
			}
        break;
        default:
            parent::onQuickFormEvent($event, $arg, $caller);
    }
	//*/
	//parent::onQuickFormEvent($event, $arg, $caller);
    return true;
} // end func onQuickFormEvent
//------------------------------------------------------------------------------------
}//end class

?>

file example_jquery_datetime.php

<html>
<head>
<?php
error_reporting(E_ALL);
$type="jquery_datetime";
?>
<title><?php echo $type; ?> examples</title>
</head>
<body>
<h1><?php echo $type; ?> examples</h1>
<?php
//http://www.netsols.de/pear/
$pearpath = $_SERVER['DOCUMENT_ROOT'].'/PEAR/PEAR/';
define('xotpath',$_SERVER['DOCUMENT_ROOT'].'/xot/');
$pearpath=str_replace('/htdocs//','',$pearpath); // correzione per hosting register
$pathz = array_unique(array($pearpath,get_include_path()));
set_include_path(implode(PATH_SEPARATOR,$pathz));
require_once 'HTML/QuickForm.php';
require_once xotpath.'/extPear/'.$type.'.php';
$form = new HTML_QuickForm;
$form->addElement('header', 'header1', $type.' examples');
$form->addElement($type, 'test', 'test');
$form->addElement('date', 'test1', 'test1',array('format'=>'dmY - Hi'));
$form->addElement('static', null, ' ');
$form->addElement('submit', '__submit__', 'Go!');
if ($form->validate()) {
    //$form->freeze();
	$form->process('show');
}
echo $form->toHtml();

function show($param) {
	echo '<pre>';
	print_r($param);
	echo '</pre>';
}

?>
</body>
</html>

Xin Calendar 2

Xin Calendar 2

yxScripts.com

Xin Calendario 2 è un pacchetto di In-Pagina e-finestra popup DHTML script calendario così come alcuni plug-in di script per caratteristiche extra.

Scarica da qui

[download id="2"]

Release:

  • Versione: 2.15
  • Data: 10 Aprile 2009

Supporto del browser:

  • IE5 + (In-Pagina: Windows e Mac / Popup-Window:. Solo per Windows)
  • I browser Gecko (NETSCAPE6 +, Mozilla, Mozilla Firebird e Firefox, Camino, ecc)
  • Opera7 +
  • Safari

Licenza:

  • Gratuito se si mantiene il credit link nel calendario intatto, o comprare una licenza tramite [ PayPal ] se un link di credito non è un’opzione per voi.
  • Mandami una nota a [ m_yangxin@hotmail.com ] se avete bisogno di una licenza illimitata.

Caratteristiche principali:

  • Supporta un numero illimitato di calendari in una pagina.
  • Fornisce In-Pagina versione e un pop-up versione.
  • In-Pagina versione supporta i calendari statica e calendari a comparsa.
  • Fornisce funzionalità di plug-in tramite script mod, tra cui:
    • Elenchi a discesa per scegliere mese e anno
    • Intervalli di date
    • Apre i collegamenti da date
    • Stili di date speciali
    • Visualizzare informazioni aggiornate
    • Data tooltip
    • Immagine di sfondo piastrelle
  • Stili calendario definito con i CSS.
  • Layout calendario flessibile.
  • Supporta il posizionamento relativo, mouse-click posizionamento.
  • Fornisce funzioni utente per la manipolazione data.

Download:

Step-by-step:

Esempi:

Mods:

pear quickform array xot

Salvare in un unico campo di tipo “TEXT” un array utilizzando serialize ed unserialize

demo: http://tecnoxtutti.com/xot/extPear/sample/example_arrayxot.php

[download id="1"]

screen shots:

file : example_arrayxot.php

<html>
<head>
<?php
$type="arrayxot";
?>
<title><?php echo $type; ?> examples</title>
</head>
<body>
<h1><?php echo $type; ?> examples</h1>
<?php
//http://www.netsols.de/pear/
$pearpath = $_SERVER['DOCUMENT_ROOT'].'/PEAR/PEAR/';
define('xotpath',$_SERVER['DOCUMENT_ROOT'].'/xot/');
$pearpath=str_replace('/htdocs//','',$pearpath); // correzione per hosting register
$pathz = array_unique(array($pearpath,get_include_path()));
set_include_path(implode(PATH_SEPARATOR,$pathz));
require_once 'HTML/QuickForm.php';
require_once xotpath.'/extPear/'.$type.'.php';
$form = new HTML_QuickForm;
$form->addElement('header', 'header1', $type.' examples');
$form->addElement($type, 'test', 'test');
$form->addElement('static', null, ' ');
$form->addElement('submit', '__submit__', 'Go!');
if ($form->validate()) {
    //$form->freeze();
	$form->process('show');
}
echo $form->toHtml();

function show($param) {
	echo '<pre>';
	print_r($param);
	echo '</pre>';
}

?>
</body>
</html>

file: arrayxot.php

<?php

require_once('HTML/QuickForm/textarea.php');
HTML_QuickForm::registerElementType('arrayxot', __FILE__, 'HTML_QuickForm_arrayxot');

class HTML_QuickForm_arrayxot extends HTML_QuickForm_textarea {
//-------------------
function HTML_QuickForm_arrayxot($elementName=null, $elementLabel=null, $options=array(), $attributes=null){
        HTML_QuickForm_element::HTML_QuickForm_element($elementName, $elementLabel, $attributes);
        $this->_persistantFreeze = true;
        $this->_type = 'arrayxot';

        if (is_array($options)) {
            foreach ($options as $k => $v) {
                if (isset($this->{"_$k"}) && method_exists($this, "set$k")) {
                    $this->{"set$k"}($v);
                }
            }
        }
}
//--------------------------------------------------------------------
function toHtml(){
	$nome=$this->getName();
    if ($this->_flagFrozen) {
        return $this->getFrozenHtml();
    } else {
		$html="";
		if(strlen( $this->getValue() )>5){
			$tmp_arr=unserialize( $this->getValue() );
			if(is_array($tmp_arr))
			while (list($key, $value) = each ($tmp_arr)) {
  				//echo "Chiave: $key; Valore: $value<br>\n";
				$html.= '<input type="text" name="'.$nome.'_name[]" value="'.urldecode($key).'" size="10">'."";
				//$html.='<input type="text" name="'.$nome.'_value[]" value="'.str_replace("\\","",urldecode($value)).'"><br>';
				$html.='<textarea name="'.$nome.'_value[]" cols="10" rows="1">'.str_replace("\\","",urldecode($value)).'</textarea><br>';
			}//end while
		}//end if
		for($iij=0;$iij<3;$iij++){
		   	$html.= '<input type="text" name="'.$nome.'_name[]" value="" size="10">'."";
			//$html.='<input type="text" name="'.$nome.'_value[]" value=""><br>';
			$html.='<textarea name="'.$nome.'_value[]" rows="1" cols="10" ></textarea><br>';
		}//end for
		//$html.=$nome.'<input type="text" name=\''.$nome.'\' value=\''.$this->getValue().'\'>';
	return $html;
	}
}//end toHtml
//---------------------------------------
function getFrozenHtml(){
    $nome=$this->getName();
	$arr_tmp=array();
	$txt="";
	$arr_tmp=array();
	if(isset($_REQUEST[$nome."_name"])){
   		$arr_tmp=$this->arraytmp($_REQUEST[$nome."_name"],$_REQUEST[$nome."_value"]);
   	}
	if($arr_tmp!=array()){
		$txt=serialize($arr_tmp);
		if(strlen($txt)<25){
			$txt="";
		}
		if($txt=='[a:1:{s:0:"";s:0:"";}]'){
			$txt="";
		}
	}

	return $txt;
}
//end getFrozenHtml
//---------------------------------------
function arraytmp($array_name,$array_value){
    $nome=$this->getName();
	$arr_tmp=array();
	$txt="";
	for($ij=0;$ij<count($array_name);$ij++){
	    $name_tmp=$array_name[$ij];
	    $value_tmp=$array_value[$ij];
		if($name_tmp!="" || $value_tmp!=""){
			$arr_tmp[$name_tmp]=urlencode($value_tmp);
		}
	}
	return $arr_tmp;
}//end arraytmp
//-----------------------------------
function onQuickFormEvent($event, $arg, &$caller){
	//echo "onQuickFormEvent";
	$v=$this->getFrozenHtml();
	if($v!=""){
		$this->_value=$v;
		$this->setValue($v);
	}//*
    switch ($event) {
        case 'updateValue':
            $value = $this->_findValue($caller->_constantValues);
            if (null === $value) {
                $value = $this->_findValue($caller->_submitValues);
                if (null === $value) {
                    $value = $this->_findValue($caller->_defaultValues);
                }
            }
            if (null !== $value) {
			    $txt="";
				if($v!=""){
					$caller->_submitValues[$this->getName()]=$v;
					$this->_value=$v;
					$this->setValue($v);
				}else{
					$this->setValue($value);
				}
            }else if($v!=""){
				$caller->_submitValues[$this->getName()]=$v;
				//echo "cccccccc[".$v."]";
				$this->_value=$v;
				$this->setValue($v);
			}
        break;
        default:
            parent::onQuickFormEvent($event, $arg, $caller);
    }
	//*/
	//parent::onQuickFormEvent($event, $arg, $caller);
    return true;
} // end func onQuickFormEvent
//-----------------------------------------------------------
}//end class HTML_QuickForm_arrayxot

prova syntax


<?php
  echo 'prova 2';
?>
<?php
echo 'prova 2';
?>

Hello world!

Welcome to WordPress. This is your first post. Edit or delete it, then start blogging!