lorenzo

Nov 142012
 

Proseguiamo il lavoro impostato nel precendete post e concretizziamo il drag&drop memorizzando le informazioni con opportune chiamate ajax.
Andremo ad aggiungere anche alcune funzionalità piuttosto comuni.

Ci portiamo nell’area droppable e aggiungiamo l’evento drop:

drop:function(event,ui){
var id=ui.draggable.attr(‘id’);

recuperiamo l’id dell’elemento trascinato, quindi lo mandiamo al server web per l’inserimento nel db:

$.ajax({
type:’GET’,
url:’dati/inserisci.php?id=’+id,
success:function(str){
if(str==’OK’){

se va tutto bene aggiungiamo l’elemento alla landing area, insieme a un campo quantità e a un link elimina:


if(str==’ok’){
$(‘<div id=”elemento_’+id+’”></div>’)
.append(ui.draggable.html())
.append(‘<input type=”text” id=”qt_’+id+’” value=”1″ /><br />’)
.append(‘<a href=”#’+id+’”>Elimina</a>’)
.appendTo(‘#landing_area’)
$(‘#’+id).fadeOut(2000);
}

infine nascondiamo l’elemento dalla lista dei draggable

Restano da gestire l’input della quantità e il link elimina.
Useremo il metodo live perché vengono creati runtime, anche se sarebbe preferibile usare on

Quindi procediamo con 3 operazioni relative all’elimina:
1. rimettiamo l’elemnto nella lista
2. lo rimuoviamo dalla landing area
3. lo cancelliamo dal database:

$(‘#landing_area a’).live(‘click’, function(){
var id=$(this).attr(‘href’);
$(id).fadeIn(2000);
$(this).parent().remove();
//rimuovere dal db
$.get(‘data/test.php?id=’+id,function(){/**/})
})

si noti la forimula this parente per rimuovere l’elemnto padre del link

Per quanto riguarda la quantità molto più semplicemente si tratta di fare un update:

$(‘#landing_area input’).live(‘blur’, function(){
var id=$(this).attr(‘id’);
var qt=$(this).val();
//aggiorna qt su db
$.get(‘data/test.php?id=’+id+’&qt=’+qt,function(){/**/})
})

quindi leggo i valori e li invio al server web.

L’esempio

Nov 112012
 

Vediamo come trascinare determinati elementi all’interno di un’area di atterraggio selezionata.
Nell’html andiamo ad impostare, all’interno di un contenitore, 5 div che trascineremo e un’area di atterraggio:

<div id="contenitore"><div id=”box1″><p>Prodotto 1</p></div>
<div id=”box2″><p>Prodotto 2</p></div>
<div id=”box3″><p>Prodotto 3</p></div>
<div id=”box4″><p>Prodotto 4</p></div>
<div id=”box5″><p>Prodotto 5</p></div>
<div id=”landing_area”></div></div>
<div>

Per comodità i div da trascinare hanno id e la medesima classe, questo velocizzerà anche la creazione del css:

.box{ width:100px; height:60px; border:1px solid #000; margin-bottom:10px; padding:5px; z-index:1;}
#box1{ background-color:#FC0;}
#box2{ background-color:#9CF;}
#box3{ background-color:#96F;}
#box4{ background-color:#6C9;}
#box5{ background-color:#9F3;}
#landing_area{ width:200px; height:300px; position:absolute; top:8px; left:200px; padding:5px; border:2px solid #900; z-index:0; }

Lo stile è spartano, serve solo per distinguere gli oggetti.
Si noti però che gli elementoi da trascinare hanno uno z-index superiore all’area di atterraggio.

Per la nostra attività necessitiamo di Jquery e jQuery UI:


<script src=”https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js”></script>
<script src=”http://code.jquery.com/ui/1.9.0/jquery-ui.js”></script>

che includiamo nell’head della pagina insieme al css di default:


<link rel=”stylesheet” type=”text/css” href=”http://code.jquery.com/ui/1.9.0/themes/base/jquery-ui.css” />

A questo punto rendiamo trascinabile tutti gli elementi di classe box:

$(document).ready(function(e) {
$(‘.box’).draggable();
})

Se vogliamo arricchire i comportamenti, possiamo aggiungere una classe che rende trasparente l’oggetto appena iniziamo a trascinarlo e facciamo in modo che una volta rilasciato torni al suo posto:

$(‘.box’).draggable({
revert:true,
start:function(event,ui){$(this).addClass(‘movimento’);},
stop:function(event,ui){
$(this).removeClass(‘movimento’);
}
});

La classe movimento aggiunge solo l’opacità:

.movimento{ opacity:0.5;}

al rilascio ovviamente la togliamo

Volete sapere dove avete rilasciato il vostro oggetto?
La pagina è un piano cartesiano, quindi:

var top=ui.position['top'];
var left=ui.position['left'];
alert(top+’ ‘+left);

Infine predisponiamo l’area di atterraggio:

$(‘#landing_area’).droppable({
accept:’.box’,
tolerance:’fit’
});

Dove stabiliamo gli elementi che accettiamo, tutta la classe box e quando li possiamo considerare all’interno dell’area
con il parametro tolerance, a volte potrebbe bastare toccare le pareti, altre volte bisognerà essere completamente all’interno

Esempio

Nov 082012
 

Fra le animazioni previste dal core di jQuery allo stato attuale non è possibile laovrare con il colore,

per esempio per modificare il colore di sfondo. Per raggiungere questo effetto è necessario fare ricorso a jQuery UI

Prepariamo una pagina con il collegamento al tema base a jQuery e a jQuery UI:


<link rel=”stylesheet” href=”http://code.jquery.com/ui/1.9.0/themes/base/jquery-ui.css” />
<script src=”http://code.jquery.com/jquery-1.8.2.js”></script>
<script src=”http://code.jquery.com/ui/1.9.0/jquery-ui.js”></script>

Inseriamo nell’html un link trasformato in pulsante e un div sul quale applicare l’effetto:


<a href=”#” id=”button” class=”ui-state-default ui-corner-all”>Cambia colore</a>
<div id=”effect”><p>Etiam libero neque, luctus a, eleifend nec, semper at, lorem. Sed pede. Nulla lorem metus, adipiscing ut, luctus sed, hendrerit vitae, mi.</p></div>

Lo stile ci servirà solo per determinare le dimensioni:


<style>
#button { padding: .5em 1em; text-decoration: none; }
#effect { width: 240px; height: 135px; padding: 0.4em; background: #fff; }
</style>

Al caricamento potremo associare il click sul nostro bottone che animerà il div modificando il colore di sfondo:


$( “#effect” ).animate({backgroundColor: “#aa0000″,color: “#fff”}, 1000 );

Se poi vogliamo ripristinare la situazione possiamo usare una variabile state e gestire tutto nello stesso click:


$(function() {
var state = true;
$( “#button” ).click(function() {
if ( state ) {$( “#effect” ).animate({backgroundColor: “#aa0000″,color: “#fff”}, 1000 );}
else {$( “#effect” ).animate({backgroundColor: “#fff”,color: “#000″}, 1000 );
}
state = !state;
});
});

L’esempio

Nov 062012
 

Proviamo alcuni effetti contenuti nella nota libreria jQuery UI.

Come prima cosa prepariamo nell’html della pagina un bottone e un elemento sul quale applicare il nostro effetto:


<a href=”#” id=”button”  class=”ui-state-default ui-corner-all”>Run Effect</a>
<div id=”effect”  class=”ui-widget-content ui-corner-all”>
<p>Etiam libero neque, luctus a, eleifend nec, semper at, lorem. Sed pede. Nulla lorem metus, adipiscing ut, luctus sed, hendrerit vitae, mi.</p>
</div>

Come si può notare  sia al link sia al div sono state applicate delle classi standard dei temi di jQuery UI per ottenere degli effetti un po’ più gradevoli dove questi sono supportati.

Lo stile è essenziale e nemmeno troppo significativo nel nostro esempio:


<style>
#button { padding: .5em 1em; text-decoration: none; }
#effect { width: 240px; height: 135px; padding: 0.4em; }
</style>

Mentre da non trascurare è l’inclusione del tema e delle librerie nell’head della nostra pagina:


<link rel=”stylesheet” href=”http://code.jquery.com/ui/1.9.0/themes/base/jquery-ui.css” />
<script src=”http://code.jquery.com/jquery-1.8.2.js”></script>
<script src=”http://code.jquery.com/ui/1.9.0/jquery-ui.js”></script>

Quindi al caricamento dell’html possiamo mappare l’evento click sul link e lanciare l’animazione:


$(document).ready(function(){
$(“#button”).click(function() {
$(“#effect”)
…
})
});

L’animazione userà il metodo animate() di jQuery esteso da effetti presenti in jQuery UI:


.animate({height: “hide”}, 1500, “easeOutBounce”)

easeOutBounce mi serve per dare l’effetto “rimbalzo”

A questo punto aspettimao un momento prima di srotolare nuovemnte il nostro div:


.delay( 800 )
.animate({height: “show”}, 1500, “easeOutBounce”)

L’esempio

Nov 042012
 

Un piccolo epserimento su trasformazioni e animazioni in css3, realizzato per essere testato su chrome (gli altri browser non sono stati presi i considerazione).

La prova riguarda la realizzazione di un piccolo acquario dove alcuni pesci possono nuotare…

La grafica è quella che é, photoshop è uno sconosciuto.

Partiamo dall’html:


<div id=”contenitore”>
<div id=”sx”></div>
<div id=”dx”></div>
<div id=”bottom”></div>
<div id=”top”></div>
<div id=”vasca”></div>
<div id=”corallo”><img src=”images/corallo.gif”></div>
<div id=”corallo2″><img src=”images/corallo2.gif”></div>
<div id=”pesce_01″><img src=”images/pesce-arciere.gif”></div>
<div id=”pesce_02″><img src=”images/pesce-arciere2.gif”></div>
<div id=”pesce_03″><img src=”images/pygoplites-diacanthus.gif”></div>
<div id=”pesce_04″><img src=”images/pygoplites-diacanthus2.gif”></div>
<div id=”pesce_05″><img src=”images/cardinale2.gif”></div>
<div id=”pesce_06″><img src=”images/cardinale.gif”></div>
<div id=”pesce_07″><img src=”images/pesci_tropicali_442.gif”></div>
<div id=”pesce_08″><img src=”images/pesci_tropicali_44.gif”></div>
</div>

Abbiamo la vasca dove nuoteranno i pesci, quattro cerotti ai lati per nascondere il fuori scenza, due coralli per farci nuotare i pesci in mezzo e appunto alcuni pesci,

più saranno più sarà difficile cogliere la ripetitività dei gesti.

La prima parte del css è molto tradizionale, sono praticamente tutti div posizionati in mdo assoluto per costruire lo scenario, lavorando quindi al massimo sullo z-index:


html, body{ margin:0; padding:0;}
#contenitore{ width:960px; height:600px; border:1px solid #000; position:absolute; left:50%; margin-left:-480px;}
#sx{ width:178px; height:600px; background-color:#D0F3FB; position:absolute; left:0; z-index:100;}
#dx{ width:178px; height:600px; background-color:#D0F3FB; position:absolute; right:0; z-index:100;}
#bottom{ width:960px; height:98px; background-color:#D0F3FB; position:absolute; bottom:0; z-index:100;}
#top{ width:960px; height:98px; background-color:#D0F3FB; position:absolute; top:0; z-index:100;}
#corallo{ width:300px; height:200px; position:absolute; bottom:100px; left:160px; z-index:100;}
#corallo2{ width:300px; height:200px; position:absolute; bottom:100px; left:400px; z-index:100;}
#vasca{ width:600px; height:400px; margin:100px auto; background-image:url(images/fondo.jpg); box-shadow:5px 5px 5px 5px #666666; border-radius:5px;}

La parte forse più interessante è costituita dai nostri pesci, ne prenderemo uno come esempio gli altri seguono la stessa linea di sviluppo con parametri diversi,

iniziamo a formattare e posizionare fuori dall vasca il nostro pesciolino:


#pesce_01{ width:60px; height:60px; position:absolute; top:270px; right:50px;}

poi impostiamo l’animazione in 5 step intermedi che sarà il risultato di traslazioni, per attraversare la vasca (e uscire dall’altra parte),

rotazioni e scale per far sembrare il movimento più naturale e non solo lineare:


@-webkit-keyframes ‘animazione_pesce_01′{
from{-webkit-transform:translate(0,0);}
20%{-webkit-transform:translate(-140px,-90px) rotate(10deg) scale(1,1.6);}
40%{-webkit-transform:translate(-280px,-70px) rotate(-1deg);}
60%{-webkit-transform:translate(-420px,-105px) rotate(-10deg) scale(1,1.6);}
80%{-webkit-transform:translate(-560px,-65px) scale(1,1.6);}
to{-webkit-transform:translate(-750px,50px);}
}

Ultimo passo usiamo la nostra animazione che abbiamo impostato:


#pesce_01{
-webkit-animation-name:animazione_pesce_01;
-webkit-animation-duration:20s;
-webkit-animation-delay:5s;
-webkit-animation-iteration-count:infinite;
-webkit-animation-timing-function:ease-in-out;
}

dove associamo l’animazione da usare tramite il nome assegnato, la durata in secondi, il “delay” dal caricamento della pagina

il numero di cicli o se la vogliamo infinita e l’effetto accellerazione

Ripetendo questo lavoro per diversi elementi, semplicemente variando i parametri si pò raggiungere questo risulatato

Nov 022012
 

Creiamo una pila di foto dandogli come effetto quello di essere buttate a caso una sopra l’altra nel loro contenitore e le sfogliamo cliccandoci sopra.

Come prima cosa pre pariamo in javascript l’array delle nostre immagini:


var foto=new Array(12);
foto[0]=’/foto/DSC00077.JPG’;
foto[1]=’/foto/DSC00078.JPG’;

tutte quelle che vogliamo.

In secondo luogo prepariamo un div contenitore e una lista che popoleremo con le nostre foto.


<div id=”contenitore”><ul id=”griglia”></ul></div>

Passiamo al css, quello di routine innanzitutto:


body {font-family: “Lucida Grande”, Verdana, Arial, sans-serif;}
#contenitore{ margin:50px auto; width:300px;}
#griglia { padding:0; margin:0; list-style:none; width:300px; height:300px; }
#griglia li { padding:0; margin:0; list-style:none; }

Poi passiamo alle cose specifiche, le liste saranno posizionate in modo assoluto:


.foto{position: absolute;}

questo ci serve per posizionarle una sopra l’altra.

Per dare l’effetto di sovrapposizione casuale, le foto dopo la prima saranno leggermente ruotate ciascuna in una direzione diversa, usando quindi le proproetà di css3:


.foto:nth-last-child(2) img{-webkit-transform: rotate(-5deg);-moz-transform: rotate(-5deg);-o-transform: rotate(-5deg);-ms-transform: rotate(-5deg);transform: rotate(-5deg);}
.foto:nth-last-child(3) img{-webkit-transform: rotate(5deg);-moz-transform: rotate(5deg);-o-transform: rotate(5deg);-ms-transform: rotate(5deg);transform: rotate(5deg);}
.foto:nth-last-child(4) img{-webkit-transform: rotate(7deg);-moz-transform: rotate(7deg);-o-transform: rotate(7deg);-ms-transform: rotate(7deg);transform: rotate(7deg);}
.foto:nth-last-child(5) img{-webkit-transform: rotate(-7deg);-moz-transform: rotate(-7deg);-o-transform: rotate(-7deg);-ms-transform: rotate(-7deg);transform: rotate(-7deg);}

in questo modo non risulteranno esattamente sovrapposte.

Successivamente diamo dimensioni, bordo e ombra alle nostre foto:


.foto img { max-width: 100%; height: auto; border: 5px solid #fff; -webkit-box-sizing: border-box;-moz-box-sizing: border-box;box-sizing: border-box;-webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);-moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);}

Non resta che aggiungerle alla pagina tramite jQuery.

Al document.ready

facciamo un ordinamento random dell’array

e poi sullo stesso un ciclo foreach per creare tutti gli elementi:


foto.sort(randomFunct);
$.each(foto, function(i, el) {$(‘#griglia’).append(‘<li><img src=”‘+foto[i]+’”></li>’);});

A questo punto la visualizzazione è fatta, come ultima cosa possiamo mettere queste istruzioni in una funzione

al fine di intercettare il click sulle foto stesse e mostrare la pila riorganizzata.

Particolare interessante non potremo usare il semplice gestore ‘click’ sul document.ready poiché

la lista viene creata dopo, useremo quindi on in modo da evitare il ricorso al deprecato live.


function randomFunct() { return 0.5 – Math.round(Math.random()); }
$(document).ready(function(e) {mostra_foto();}).on(‘click’,'#griglia li img’,function(){mostra_foto();});

function mostra_foto(){
foto.sort(randomFunct);
$.each(foto, function(i, el) {$(‘#griglia’).append(‘<li><img src=”‘+foto[i]+’”></li>’);});
}

L’esempio

Oct 312012
 

Affontiamo il problema della validazione dei form, problema annoso in passato ma oggi risolvibile più agevolemnte.

Useremo jQuery e il suo plugin jQuery Validate per risolvere la nostra questione, per inciso il plugin è in sé interessante poiché definisce i metodi di validazione più comuni, inoltre permette l’estensione con l’aggiunta di personalizzazioni.

Partiamo dal form con 3 campi di input obbligatori: il nome, l’email e lo username:


<form name=”info” id=”info”>
<fieldset>
<legend>Dati</legend>
<label for=”nome”>Nome</label><br />
<input type=”text” id=”nome” name=”nome” /><br /><br />
<label for=”email”>Email</label><br />
<input type=”text” id=”email” name=”email” /><br /><br />
<label for=”username”>Username</label><br />
<input type=”text” id=”username” name=”username” /><br /><br />
<input type=”button” id=”submit” value=”invia” />
</fieldset>
</form>

Nell’html mettiamo anche un div nascosto che useremo per dialogare con i nostri utenti:


<div id=”dialog” title=”Test”></div>

Prepariamo anche lo stile della label per la gestione degli errori:


label.error{ font:bold 14px Arial; color:#900;}

Passiamo alla parte di validazione vera e propria. Come prima cosa al caricamento della pagina agganciamo gli eventi che vogliamo gestire.

Il primo sarà relativo alla validazione dello username e andremo a verificare che non sia presente nel db con una chiamata ajax (si osservi che questa verifica non esenta dalla verifica server-side).

Quindi all’evento blur sul nostro campo, andremo a leggere il valore digitato dall’utente e manderemo una chiamata ajax al server web, in caso di risposta negativa, rimuoviamo la label dell’errore,

per evitare duplicazioni, la rimettiamo, svuotiamo il campo, altrimenti semplicemnte rimuoviamo la label dell’errore.


$(‘#username’).blur(function(){
var username=$(‘#username’).val();
$.ajax({
type:’GET’,
url:’data/test_username.php?username=’+username,
success:function(str){
if(str==’KO’){
$(“#username_error”).remove();
$(‘#username’).val(”);
$(‘#username’).after(‘<label for=”username” id=”username_error”>Username presente</label>’);
$(‘#username’).focus();
}
else{$(“#username_error”).remove();}
}
})
})

La successiva porzione di codice validerà il form e ci faremo restituire un valore booleano in base all’esito dell’operazione,

quindi al click sul submit, ma sipoteva anche dire al submit del form, aggiungiamo la vera validazione:


$(‘#submit’).click(function(){
var valido=$(‘#info’).validate().form();

})

Nel metodo validate specificheremo rules e messagges come ben spiegato nella pagina del plugin


rules:{
nome:’required’,
email:{
required:true,
email:true
},
username:{
required:true,
minlength:2
}
},
messages:{
nome:’Campo obbligatorio’,
email:{
required:’Campo obbligatorio’,
email:’Devi inserire un indirizzo valido’
},
username:{
required:’Campo obbligatorio’,
minlength:’Devi inserire almeno 2 caratteri’
}
}

Nel nostro caso ci siamo semplicemente limitati ai campi obbligatori e alla validazione dell’email.

Ultimo step l’invio del form.

Se la validazione ha avuto successo invieremo una chiamata ajax al nostro server web, passando i dati del form serializzati:


$.post(‘dati/inserisci.php’,$(‘#info’).serialize()

per poi gestire con una callback l’esito della risposta che se positivo implicherà:

1. nascondere il form

2. mostrare un messaggio di avviso all’utente

3. sostituire un contenuto visuale al posto del form


function(){
$(‘#info’).hide();
$(‘#dialog’).dialog().html(‘<p>Tutto ok!</p>’);
$(‘#contenitore’).append(‘<p>Record inserito</p>’);
}

Per testare tutte le funzionalità dell’esempio lo username presente è “pippo”

Oct 292012
 

Oltre che ordinare una lista con il drag&drop e salvare sul nostro server la nuova sequenza,

possiamo far eun’operazione analoga con due liste collegate fra di loro,

L’html dovrebbe risultare abbastanza intuitivo:


<ul id=”mialista_1″>
<li id=”lista_1″>Lista 1</li>
<li id=”lista_2″>Lista 2</li>
<li id=”lista_3″>Lista 3</li>
<li id=”lista_4″>Lista 4</li>
<li id=”lista_5″>Lista 5</li>
</ul>
<ul id=”mialista_2″>
<li id=”lista_6″>Lista 6</li>
<li id=”lista_7″>Lista 7</li>
<li id=”lista_8″>Lista 8</li>
<li id=”lista_9″>Lista 9</li>
</ul>

due liste sostanzialmente identiche formattate con un css:


#mialista_1{ margin:0; padding:0; list-style-type:none; width:150px; float:left; background-color:#09F;}
#mialista_1 li{ padding:5px; margin:5px;}
#mialista_2{ margin:0; padding:0; list-style-type:none; width:150px; float:left; background-color:#FC3; min-height:100px;}
#mialista_2 li{ padding:5px; margin:5px;}

è raccomandabile usare min-height per evitare che una lista, una volta svuotata, non possa più accogliere elementi.

Al document.ready creiamo due elementi sortable:


$(‘#mialista_1, #mialista_2′).sortable()

e soprattutto specifichiamo la possibilità di passare elementi da una lista all’altra:


connectWith:’.mialista’

all’evento stop, mandiamo al server, in modo molto schematico,

le nostre due liste:


var ordine1=$(‘#mialista_1′).sortable(‘serialize’);
var ordine2=$(‘#mialista_2′).sortable(‘serialize’);
$.get(‘data/inserisci2.php?’+ordine1,function(data){})
$.get(‘data/inserisci2.php?’+ordine2,function(data){})

Qui l’esempio

Oct 272012
 

jQuery UI, ormai giunto alla versione 1.9, mette a disposizione tutto quello che serve per gestire con semplictà liste ordinabili tramite drag&drop, vediamo come.
Per prima cosa serve collegare nella nostra pagina sia jQuery sia jQuery UI sia il tema scelto:


<link rel="stylesheet" type="text/css" href="http://code.jquery.com/ui/1.9.0/themes/base/jquery-ui.css" />
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
<script src="http://code.jquery.com/ui/1.9.0/jquery-ui.js"></script>

Poi in secondo luogo prepariamo l’html:

una comunissima lista e integriamo il css del tema:


<ul id="mialista">
<li id="lista_1">Lista 1</li>
<li id="lista_2">Lista 2</li>
<li id="lista_3">Lista 3</li>
<li id="lista_4">Lista 4</li>
<li id="lista_5">Lista 5</li>
<li id="lista_6">Lista 6</li>
<li id="lista_7">Lista 7</li>
<li id="lista_8">Lista 8</li>
<li id="lista_9">Lista 9</li>
</ul>

 

A questo punto al document.ready rendiamo i nostri elementi li trascinabili:

$(document).ready(function(e) {
$(‘#mialista’).sortable({…})
})

Aggiungiamo l’evento stop in mdo da mandare una chiamata via ajax al web server per memorizzare la sequenza attualmente visibile sulla pagina,
quindi come prima cosa leggiamo l’ordine:

var ordine=$(‘#mialista’).sortable(‘serialize’);

e successivamente mandiamo la chiamata:


$.get(‘data/inserisci.php?’+ordine,function(data){/*fai qualcosa*/})

la function di risposta viene utilizzata per esempio per dare conferma dell’avvenuto salvataggio,
anche se a volte potrebbe essere un po’ troppo invadente.

Per completezza la insersci php:


if(isset($_GET['lista'])){     print_r($_GET['lista']);     }


L’esempio

Oct 272012
 

Costruiamo un sistema per aggiornare il database tramite checkbox, senza ricaricare la pagina utilizzando chiamate ajax.

Per prima cosa il form:


<form>
<input type=”checkbox” id=”u1″ name=”u1″  /><label id=”l1″>Utente 1</label><br />
</form>

con tutte le checkbox di cui abbiamo bisogno. E’ importante fare in mdo che l’id e il name dei nostri checkbox siano legati all’id del record da aggiornare, in questo caso lo contengono insieme a un prefisso “u” poiché non si può assegnare agli id dei valori solo numerici. All’interno del form inseriamo anche un div che nasconderemo con il css per mostrare l’immaghine del loader ajax e avvisare l’utente che l’operazione è in corso e un dialog box che useremo per dare la risposta circa l’esito dell’operazione:


<div id=”loader”><img src=”images/ajax_loader.gif” /></div>
<div id=”dialog” title=”Risposta del server:”><p></p></div>

Nel css prevediamo due class per evidenziare in kodo diverso gli utenti abilitati e quelli non abilitati e nascondiamo ciò che non serve subito.


<style type=”text/css”>
.abilitato{ color:#003366;}
.disabilitato{ color:#666;}
#msg, #dialog, #loader{ display:none;}
</style>

Passiamo ora alla parte jQuery:

predisponiamo la visualizzazione del loader:


$(document)
.ajaxStart(function(){$(‘#loader’).css({‘display’:'block’});})
.ajaxStop(function(){$(‘#loader’).css({‘display’:'none’});});

al caricamento della pagina mappiamo l’evento click solo sui checkbox:


$(‘:checkbox’).bind(‘click’,function(){

e leggiamo l’id e il valore dell’attributo checked, oltre a ri cavare l’id “vero” del record:


var ctr=this.id;
var chk=$(‘#’+ctr).attr(‘checked’);
var id=ctr.substr(1);

inseriamo la chiamata ajax:


$.ajax({
type:’GET’,
url:’checkbox.php?azione=aggiorna_utenti&id=’+id+’&chk=’+chk,
success:function(chk){

e vediamo ora brevemente la pagina php che sarà un normale update sul db:


error_reporting(0);
include(‘include/mysql.inc.php’);


if($_GET['azione']==’aggiorna_utenti’){
$id=(int)$_GET['id'];
$chk=$_GET['chk'];
if($chk==’checked’){$chk=1;}
else{$chk=0;}
$sql=’update utenti set abil=”‘.$chk.’” where id=’.$id;
$result=mysql_query($sql,$conn);
if(!$result){echo -1;}
else{echo $chk;}
}

con 3 possibili output: -1 in caso di errore, 0 se l’utente è disabilitato e 1 se è abilitato.

Ora andiamo a gestire le risposte:


if(chk==1){
$(‘#l’+id).removeClass(‘disabilitato’).addClass(‘abilitato’);
$(‘#dialog’).dialog();
$(‘#dialog p’).html(‘Operazione completata’);
}

e quindi modifichiamo la classe sulla label per segnalre il cambio di stato e mostriamo il dilog di jQuery UI per avvertire l’utente che l’operazione è conclusa. Ripetiamo e personalizziamo l’operazione anche per le altre due risposte.

L’esempio completo