Venerdi ho dovuto installare il client Oracle in locale sulla mia Ubuntu Jaunty.
Premetto che uso il pacchetto Lampp (1.7.2) fornito da ApacheFriends.
Ho tribolato parecchio facendo varie prove e seguendo vari tutorial. Il problema principale, poi ho capito, è che lo script di installazione di oci8 (il driver php per accedere a oracle) presente su lampp cerca un client oracle della serie 10.2.
Inizialmente scaricando rpm e zip della serie 11.2 (l’ultima disponibile) ho avuto tutta una serie di problemi.
Ecco quindi i passaggi che mi hanno portato finalmente ad avere oci_connect funzionante nel mio php.
Dopo aver scaricato il client oracle da qui (occorre registrarsi), ho eseguito questi passi:
Pubblico le mie 3 implementazioni del plugin jQuery Autocomplete di Jörn Zaefferer.
Queste implementazioni servono ad attivare campi form con suggest automatico senza scrivere una sola riga di javascript.
La prima implementazione autoattiva il plugin originale (con supporto ai metadata):
La seconda implementazione aggiunge “magicamente” un campo “hidden” e in fase di invio del “form” spedisce al server anche la chiave associata al valore selezionato nel suggest.
La terza invece crea un suggest “tabellare”. E’ stato necessario modificare lo script.
Grazie all’uso di jQuery metadata le opzioni dell’autocomplete possono essere settate direttamente nell’html (quindi senza scrivere codice javascript).
L’elenco delle opzioni che modificano il comportamento del plugin si trova qui.
La seconda implementazione di jQuery Autocomplete crea un campo hidden per la chiave legata al valore visualizzato in suggest in modo da poter inviare al server sia la chiave sia il valore in fase di submit.
Per attivare un suggest chiave/valore è sufficiente
assegnare al campo input la classe suggest_keys.
valorizzare l’attributo alt del campo input inserendo un url relativo es: “php/keys.php”
Lo script php d’esempio che restituisce alle chiamate ajax l’elenco di chiavi|valori:
personalizzare le intestazioni di colonna nell’attributo class (vedi sotto l’esempio)
valorizzare l’attributo alt del campo input inserendo un url relativo es: “php/table.php”
Includere le seguenti istruzioni css personalizzando “le larghezze” che nell’esempio settano le 3 colonne della tabella
.ac_results ul li div.tbl{clear:both;}
.ac_results ul li div.tbl div{float:left;width:30%;overflow-x:hidden;}
.ac_intestazione{position:absolute;left:0px;top:-0px;z-index:1000;background:#000;color:#fff;}
/*PERSONALIZZA*/
.ac_results ul li div.tbl div.fld_1, #int_1{width:150px;}
.ac_results ul li div.tbl div.fld_2, #int_2{width:70px;}
.ac_results ul li div.tbl div.fld_3, #int_3{width:70px;}
Lo script php d’esempio che restituisce alle chiamate ajax l’elenco dei valori della tabella.
Javascript non intrusivo ha un problema di fondo.
Lavorando sull’evento window.onload, i componenti javascript non intrusivi, NON si attivano nel momento in cui viene fatta un’ iniezione html nel DOM (AHAH).
Questi elementi arrivando da un iniezione HTML non vengono “arricchiti” dal plugin (non sono quindi ridimensionabili ne trascinabili) perchè non sono presenti al window.onload (al document.ready per chi usa jquery).
Questo problema non si avvertirebbe se il componente fosse intrusivo (js cablato nell’html):
Se io iniettassi il codice qui sopra il box si attiverebbe perchè verrebbe valutato il js (almeno se iniettato via jquery) immediatamente senza eventi onload di mezzo.
Spesso i framework server-side sono intrusivi proprio per essere più flessibili.
Il codice html generato sarà sporco (richfaces ad esempio) ma i componenti saranno sempre “funzionanti” sia al primo caricamento sia a seguito di iniezioni html.
La soluzione “manuale” (a carico dello sviluppatore che implementa il comportamento e USA il plugin) è attivare le funzionalità js prima di appendere il nuovo pezzo di html. DEMO
L’idea è : quello che attivo al document.ready lo attivo anche all’evento ajaxStop (quindi inizializzo il plugin sia al window.onload sia alla chiusura di ogni chiamata ajax).
Il problema di questa soluzione è che applicando 2 volte ad un elemento lo stesso plugin si “rischia” spesso di ottenere degli effetti indesiderati (doppi eventi al click, interfaccia che si moltiplica a mo’ di matrioska, ecc…).
La soluzione quindi è realizzare un qualche sistema di singleton all’elemento che si arrichisce.
Nel plugin finale ho scritto un banale if che aggiunge una certa classe (flag) all’elemento arricchito.
Se un evento (ajaxStop) invoca il costruttore del plugin più volte il codice non verrà eseguito.