Pear

selectAs(): selezionare i campi in DB_DataObject

Si può decidere di utilizzare solo alcuni campi di una tabella, specialmente quando viene effettuata una join tra più tabelle e di assegnare dei nomi specifci.

Il manuale è poco chiaro

Sul manuale ufficiale di DB_DataObject, alla pagina dedicata a selectAs() sono riportati degli esempi che a prima vista possono fuorviare il lettore (che magari spera di trivare un quick reference dei metodi).

Volendo selezionare solo alcuni campi di una tabella il manuale, nell’esempio recita :
// to generate a restricted list.. "person.age as age , person.name as name"
$person->selectAs(array('age','name'));

A questo punto prova e riprova, ma la query generata risulta avere sempre un bell’asterisco davanti la corretta richiesta dei campi specificati
SELECT *, person.age as age,person.name as name ....

Il fatto è che per avere nella SELECT solo i campi scelti, bisogna eseguire un selectAdd() senza alcun parametro per rimuovere l’asterisco di default.
// prima puliamo i campi
$person->selectAdd();

// e poi selezioniamo i campi che vogliammo
$person->selectAs(array('age','name'));

Usare HTML_QuickForm con Smarty

Se si vuole integrare la creazione di form con l’uso di smarty si può optare per due soluzioni:
la prima consiste nell’assegnare ad una variabile dell’oggetto Smarty l’intero HTML generato dall’oggetto HTML_QuickForm;
la seconda consiste nell’impiegare il renderer HTML_QuickForm_Renderer_ArraySmarty basato su HTML_QuickForm::toArray().

1) Il metodo più semplice e immediato

E’ sufficente assegnare ad una variabile di Smarty il valore restituito dal metodo toArray dell’oggetto HTML_QuickForm.

Questo fornisce il codice HTML relativo al form costruito che può essere scritto così com’è nella pagina.
A fronte dell’estrema semplicità si contrappone il totale controllo dell’aspetto da parte del codice.
In questo modo per cambiare aspetto al form bisogna intervenire sul codice e non è sufficente apportare modifiche al template.

Codice di esempio:

// creo l'oggetto QuickForm e Smarty
$obj_form = new HTML_QuickForm('frmReg');
$smarty = new Smarty();

// aggiunge gli elementi
$obj_form->addElement('textarea', 'txtAddress', 'Address:',
   array('rows' => 3, 'cols' => 30));
$obj_form->addElement('text', 'txtEmailAddress', 'Email Address:',
   array( 'size' => 40, 'maxlength' => 255));
$obj_form->addElement('submit', 'btnSubmit', 'Register');

// processo gli eventuali dati ricevuti dal form
if($obj_form->validate()) {
.....
}

// assegno alla variabile il codice HTML da mostrare nella pagina
$smarty->assign('mio_form',$obj_form->toHtml());

// visualizza il template
$smarty->display('mio_template.tpl');

 /*
 * Nel template ? sufficente inserire il seguente
 * comando per avere il form creato
 */

  
    ....cut....
    {$mio_form}
    ....cut....
  


2) Pieno controllo a Smarty

Con questo metodo, si pu? demandare praticamente tutto il controllo dell’aspetto del form al template engine, prevedendo la posizione per ogni singolo elemento del form, compresi i messaggi di errore e gli asterischi per i campi obbligatori.

//PEAR::HTML_QuickForm
require_once 'HTML/QuickForm.php';
require_once 'HTML/QuickForm/Renderer/ArraySmarty.php';

/* .... codice per l'inserimento degli elementi nel form .... */

// associo il renderer all'oggetto Smarty
$renderer =& new HTML_QuickForm_Renderer_ArraySmarty($smarty);

// processo i dati inviati da form
if($form->validate()) {
   $form->freeze();
}

// accetta le eventuali modifiche al renderer
$form->accept($renderer);

//assegna l'array generato a una variabile
$smarty->assign('obj_form', $renderer->toArray());

// mostra il template
$smarty->display('test.tpl');

Il codice da inserire nel template invocato nello script ? il seguente:
{$obj_form.javascript}
{$obj_form.hidden} {include file="common/footer.tpl"}
{$obj_form.header.titolo}
{$obj_form.requirednote}
{$obj_form.txtAddress.label} {$obj_form.txtAddress.html}
{$obj_form.ddlCountry.label} {$obj_form.ddlCountry.html}
{if $obj_form.txtEmailAddress.required} (*) {/if} {$obj_form.txtEmailAddress.label} {$obj_form.txtEmailAddress.html} {$obj_form.errors.txtEmailAddress}
{if $obj_form.btn.required} (*) {/if} {$obj_form.txtEmailAddress.label} {$obj_form.btn.html}

In sostanza, il metodo toArray permette di ottenere un array con una particolare struttura che poi viene assegnato ad una variabile di Smarty.
Nel manuale questa struttura è ben documentata.

Certo è che con questo sistema aumenta molto la complessità del template Smarty (si pensi se non si conoscono a priori gli elementi presenti nel form), ma di sicuro si può operare un completo controllo sull’aspetto del form intervenendo solo sul template.

3) Un’ulteriore soluzione

Mi è venuto in mente che una soluzione ulteriore è quella di creare un file di configurazione che può essere letto per impostare in modo appropriato il sistema template del renderer di HTML_QuickForm per poi utilizzare la soluzione 1.

Iniziare subito con Liveuser

Per installare subito il sistema e avere un DB con il quale fare subito delle prove basta leggere la documentazione allegata

Installazione

Per installare LiveUser e LiveAdmin ? sufficente utilizzare le procedure solite per i packages di PEAR.
In particolare (da [URL http://oss.backendmedia.com/LiveUser/HomePage] Live User Wiki [/URL]

Latest version client: 0.16.11
Download it or run “pear install http://pear.php.net/get/LiveUser-0.16.11.tgz”

Latest version admin: 0.3.8
Download it or run “pear install http://pear.php.net/get/LiveUser_Admin-0.3.8.tgz”

Un DB per gli esempi

LiveUser consente l’impiego di svariate fonti contemporaneamente per l’autenticazione degli utenti tra cui i database e i file in formato XML.
Negli esempi allegati viene impiegato esclusivamente un file XML per l’elenco degli utenti con le loro userid e password.
Per poter disporre velocemente di un DB si deve impiegare lo script demodata.php che viene installato nella directory PHP_DIR/PEAR/docs/LiveUser/docs e che richiede il package MDB per l’accesso al database. Con questo script si deve processare il file demodat.xml presente nelle subdirectory example3 o 4.

E’ possibile usare lo script in questione da riga di comando oppure eseguendolo su un Web server che supporta PHP.
Per la sintassi ? sufficente invocare lo script senza fornire alcun parametro in modo da visualizzare la schermata di help dove sono riportate tutte le info utuili.

Le tabelle di liveuser

Elenco delle tabelle utilizzate e significato dei singoli campi

Elenco delle tabelle

* liveuser_applications
* liveuser_areas
* liveuser_area_admin_areas
* liveuser_rights
* liveuser_grouprights
* liveuser_right_implied
* liveuser_group_subgroups
* liveuser_groups
* liveuser_groupusers
* liveuser_userrights
* liveuser_perm_users
* liveuser_users
* liveuser_translations

liveuser_users
Il primo passo per il processo di autenticazione
Questa tabella contiene i seguenti campi di base che possono essere estesi con altri campi necessari all’applicazione.
auth_user_id identificativo dell’utente. E’ usato per creare una collegamento tra l’utente e un permesso con la relazione alla tabella «liveuser_perm_user» .
handle user name usato dall’utente per eseguire il login
passwd la password per il login. Se definito nel file di configurazione questa password può essere cryptata (consigliato)
lastlogin data e ora dell’ultima connessione dell’utente
owner_user_id ?
owner_group_id ?
is_active valore booleano che definisce se l’utente è attivo o meno. Nel secondo caso gli viene impedito l’accesso

Tipi di utente in LiveUser

I tre diversi livelli di gestione differiscono tra loro anche per il modo in cui trattano i diversi titpi di utente che vengono definiti.

Definizione

I tipi di utente sono definiti nella tabella “liveuser_perm_user”

1) anonymus
2) user
3) admin
4) area admin
5) super admin
6) master admin

Gli utenti acquisiscono i permessi con modalit? diverse a seconda anche del livello di gestione adottato.

Simple e Medium level
Per gli utenti 1, 2, 3, 4 i permessi acquisiti sono quelli assegnati direttamente agli utenti o ai gruppi (definiti nelle tabelle liveuser_userrights e liveuser_grouprights).
Invece gli utenti 5 e 6 acquisisconno automaticamente tutti i permessi.

Complex level
In questo caso i livelli vengono definiti in tre diverse modalit?:
per gli utenti 1, 2, 3 i permessi sono quelli attribuiti all’utente o al gruppo di appartenenza.
Per l’utente 4 i permessi sono quelli di amministratore dell’intera area specificata nella tabella liveuser_area_admin_areas.
Gli utenti 5 e 6 acquisiscono tutti i permessi esistenti.

addJoin(): relazioni permanenti in DB_DataObject

Il metodo addJoin() permette di definire le relazioni tra due tabelle per poi lavorare agevolmente con esse.
Le relazioni devono essere impostate in un file di configurazione chiamato database.link.ini dove vengono specificati le tabelle e i campi coinvolti.
Quindi per definire la relazione tra le due tabelle ? sufficente utilizzare addJoin nel seguente modo:

$tab1->addJoin($tab2);

Un altro modo (non documentato nel manuale) è quello di creare una join “al volo”, senza usare alcun file di configurazione: La sintassi è la seguente

$tab1->addJoin(array('nome_campo','nome_tab_rel:nome_campo_rel'));

Ci? consentirà di eseguire una JOIN tra la tabella legata all’oggetto $tab1 e la tabella con nome ‘nome_tab_rel’ sui campi nome_campo di $tab1 e nome_rel_campo della seconda tabella.

Usare HTML_QuickForm in pratica

A parte andare a dare un’occhiata al manuale, ho cercato qualcosa di interessante in rete e ho trovato un utile tutorial che ho gia segnalato qui .
Quindi da questo tutorial traggo lo spunto per scrivere questi appunti sull’impiego pratico di QuickForm.

Creare una form e aggiungere gli elementi

Il procedimento per creare una form è quello di istanziare un oggetto QuickForm e aggiungerevi degli elementi.

// include la classe PEAR necessaria
require_once 'HTML/QuickForm.php';

// e definisco un oggetto HTML_QuickForm
$or_form = new HTML_QuickForm('formRegistrazione');

// aggiungo gli elementi 

$or_form->addElement('text', 'txtNome', 'Nome:', array('size' => 40,
'maxlength' => 50));
$or_form->addElement('textarea', 'txtIndirizzo', 'Indirizzo:',
  array('rows' => 3, 'cols' => 30));
$or_form->addElement('select', 'txtNazione', 'Nazione:',
  array ("" => "Seleziona una nazione", "it" => "Italia",
         "uk" => "United Kingdom", "de" => "Germania"));
$or_form->addElement('text', 'txtEmail', 'Indirizzo e-mail:',
  array( 'size' => 40, 'maxlength' => 255));

Quali sono i parametri da fornire per ogni elemento

addElement richiede come primo parametro il tipo di elemento che si vuole inserire
-) documentazione di addElement
-) tipi di elemento

gli altri parametri sono indicati nella documentazione dei singoli metodi.
Ad esempio se si vuole inserire un elemento tipo ‘button’, nella pagina dei tipi di elemento si fa click sul relativo link ‘HTML_QuickForm_button’ e si approda alla pagina di documentazione dell’elemento.

Facendo click sulla documentazione relativa al costruttore dell’elemento, si ottiene la lista di parametri da passare al metodo addElement (ma anche a createElement).

Il file di configurazione di LiveUser

Il file di configurazione imposta tutto il sistema, definendo anche le caratteristiche delle tabelle usate e le opzioni.

Il file di configurazione è principalmente un array di parametri definiti per il sistema di autenticazione e dei permessi.
Qui si possono configurare più contenitori per l’autenticazione.

$LUOptions = array(
    'login' => array(
        'force'    => true
     ),
    'logout' => array(
        'destroy'  => true,
     ),
    'authContainers' => array(
        array(
            'type'         => 'DB',
            'expireTime'   => 3600,
            'idleTime'     => 1800,
            'storage' => array(
                'dsn' => $dsnauth,
                'alias' => array(
                    'auth_user_id' => 'authUserId',
                    'lastlogin' => 'lastLogin',
                    'is_active' => 'isActive',
                    'owner_user_id' => 'owner_user_id',
                    'owner_group_id' => 'owner_group_id',
                    'users' => 'users',
                ),
                'fields' => array(
                    'lastlogin' => 'timestamp',
                    'is_active' => 'boolean',
                    'owner_user_id' => 'integer',
                    'owner_group_id' => 'integer',
                ),
                'tables' => array(
                    'users' => array(
                        'fields' => array(
                            'lastlogin' => false,
                            'is_active' => false,
                            'owner_user_id' => false,
                            'owner_group_id' => false,
                        ),
                    ),
                ),
            ),
        ),

    ),
    'permContainer' => array(
        'type' => 'Complex',
        'storage' => array(
            'DB' => array(
                'dsn' => $dsnauth,
                'prefix' => 'liveuser_',
                'alias' => array(
                    'perm_users' => 'perm_peoples',
                ),
            )
         ),
    ),
);

Pulsanti di conferma e annullamento con QuickForm

// pulsanti
$obj_submit[] = &HTML_QuickForm::createElement('submit', 'btnInserisci',  'Modifica' );
$obj_submit[] = &HTML_QuickForm::createElement('button', 'btnAnnulla', 'Annulla',
         array('onClick'=>"javascript:location='index.php'"));
$obj_submit[] = &HTML_QuickForm::createElement('button', 'btnElimina', 'Elimina utente',
         array('onClick'=>"confermaCancellaUser('deluser.php?uid=$id_user')"));
$form->addGroup($obj_submit, '', '', ' &nbsp');

Il primo pulsante invia il form
Il secondo annulla l’invio saltando ad un’altra pagina
Il terzo richiama uno script per la conferma della cancellazione dei dati

Quando usare DB_DataObject

Sempre.
Ad esempio: il modo più semplice di gestire i dati in una tabella sarebbe quello di avere un oggetto che rappresenta l’entità associata alla tabella e richiamarne semplicemente i metodi.
Riporto l’esempio dal manuale:

$persona = new MiaPersona;
$persona->nome = "Giovanni";
$persona->find();
while ($persona->fetch()) {
   echo "Il mio amico {$persona->nome} festeggia
   il suo compleanno il {$person->birthDate}
"; }

Molte funzionalità sono state aggiunte per gestire gli aspetti più particolari che si presentano nella gestione dei dati :

* un semplice sistema di configurazione per la connessione al DB;
* la descrizione del DB e l’identificazione gestione delle chiavi primarie;
* un debugger ;
* validazione dei dati inseriti;
* gestione delle join complesse e delle relazioni tra tabelle;
* autocostruzione della classe rispetto alle modifche apportate al database;

Successiva »