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

Oct 252012
 

Andiamo a leggere un file xml e a visualizzare i dati all’interno di una tabella.
Come prima cosa prepariamo l’html:
il div da utlizzare come avviso durante il caricamento con ajax che verrà nascosto dal css:

<div id="loader"><img alt="" src="http://www.lorenzodeambrosis.net/blog/2012/10/jquery-parsing-xml/images/ajax_loader.gif" /></div>

e la tabella dove andremo a visualizzare i dati:

<table id="lista">
	<thead>
    	<tr>
        	<th>Titolo</th>
        	<th>Link</th>
        	<th>Autore</th>
        </tr>
    </thead>
    <tr class="template">
    	<td><span class="item_titolo"></span></td>
    	<td><span class="item_link"></span></td>
    	<td><span class="item_autore"></span></td>
    </tr>
</table>

La prima riga della tabella contiene l’intestazione della stessa,
la seconda una riga “template”, nascosta dal css che verrà clonata nel corso della lettura del file xml

Rapidamente la struttura della nostra fonte di dati:

Al document.ready partirà la chiamata ajax come di consueto:

$.ajax({
type:’GET’,
url:’data/news2.xml’,
dataType:’xml’,
success:function(str_xml){
…
}
})

e una volta ricevuti i dati procediamo con il ciclo di lettura:


$(str_xml).find(‘item’).each(function(){
var titolo=$(this).find(‘titolo’).text();
var miolink=$(this).find(‘link’).text();
var autore=$(this).find(‘autore’).text();

e a questo prunto prepariamo l’output clonando il template e rimuovendo la class per renderlo visibile

var newRow=$(‘#lista .template’).clone().removeClass(‘template’);

prepariamo un oggetto litteral con i dati da iniettare nella nuova riga:

var listaItem={titolo:titolo, varlink:miolink, varautore:autore};

infine popoliamo e appendiamo la nostra riga:

popola_template(newRow, listaItem).appendTo(‘#lista’).fadeIn();

la funzione popola_template cerca i tag span dove andare a scrivere i contenuti dell’oggetto passato
e restituisce l’oggetto jQuery da appendere:

function popola_template(row, lista){
row.find(‘.item_titolo’).text(lista.titolo);
row.find(‘.item_link’).text(lista.varlink);
row.find(‘.item_autore’).text(lista.varautore);
return(row);
}

L’esempio completo

Oct 232012
 

Uno dei formati più popolari per l’interscambio dei dati e JSON.
Vediamo come fare una ricerca su twitter e gestire la risposta.

Per prima cosa al document.ready andremo a mappare sugli input che hanno type=button l’evento click,
in questo modo la parte di form relativa all’input verrà gestita.
Il nostro utente inserirà la sua keyword, al click avvieremo la ricerca chiamando l’opportuna funzione:


<p><input id="cerca" type="search" /><br />
<input type="button" value="cerca" /></p>


$(document).ready(function(e) {$(‘input[type="button"]‘).click(function(){cerca();})})

La nostra funzione come prima cosa leggerà il valore inserito e poi costruirà la urla da chiamare:


var searchTerm=$(‘#cerca’).val();
 var baseUrl=’http://search.twitter.com/search.json?q=’;

Passo successivo la chiamata vera e propria e il parsing della risposta:

 $.getJSON(baseUrl+searchTerm+’&callback=?’,function(data){

})

La variabile data conterrà i dati di ritorno che scorreremo con un ciclo each, meglio scorreremo data.results che contiene le informazioni che vorremo visualizzare.
all’interno del ciclo creeremo l’html da appendere a un contenitore opportunamente predisposto nella pagina:

 $.each(data.results,function(){
 $(‘<div></div>‘)
 .append(‘<img src="<a href="http://www.lorenzodeambrosis.net/blog/2012/10/jquery-ricerca-su-twitter-e-parsing-json/'+this.profile_image_url+'" target="_blank">'+this.profile_image_url+'</a>" alt="" />‘)
 .append(‘<a href="http://www.lorenzodeambrosis.net/blog/2012/10/jquery-ricerca-su-twitter-e-parsing-json/#">‘+this.from_user+’</a>‘+this.text+’‘)
 .appendTo(‘#contenitore’)
 })

L’esempio completo

Oct 232012
 

Quasi sempre creando una pagina e lavorando su di essa con jQuery andremo a mettere il codice da eseguire all’interno del document.ready
ovvero faremo in modo che le varie attività, come per esmepio binding degli eventi siano disponibili solo una volta che il browser abbia effettivamente caricato il DOM.
Per far questo abiamo due possibilità $(function) o il più esteso e autodescrittivo $(docuemnt).ready, ma sono equivalenti.
Altra cosa invece è porsi il problema di quando sia terminato il download delle risrose collegate alla pagina, come per esempio immagini:
in questo caso disponiamo solo dell’evento load, nel tutorial scritto con jQuery e con js nativo, ma che è deprecato in quanto non sufficientemente consistente nei vari browser e non sempre affidabile per via di interferenze di cache (per approfondimento).

Il codice seguente “prende i tempi” di caricamento:

</pre>
<pre id="line1">var date=new Date();
var start=date.getTime();

$(function(e) {
	var date0=new Date();
	var start0=date0.getTime();
	$('#box0').text(start0-start);
	});
$(document).ready(function(e) {
	var date1=new Date();
	var start1=date1.getTime();
	$('#box1').text(start1-start);
	});
$(window).load(function(){
	var date2=new Date();
	var start2=date2.getTime();
	$('#box2').text(start2-start);
	})
window.onload=function(){
	var date3=new Date();
	var start3=date3.getTime();
	$('#box3').text(start3-start);
	}


 

</pre>
<pre id="line1"><p>$(function(){})</p>
<div id="<a>box1</a>"></div>
<p>Document ready</p>
<div id="<a>box1</a>"></div>
<p>$(window).load [deprecated]</p>
<div id="<a>box2</a>"></div>
<p>window.onload</p>
<div id="<a>box3</a>"></div>
<img src="<a href="view-source:http://static.jquery.com/files/rocker/images/logo_jquery_215x53.gif">http://static.jquery.com/files/rocker/images/logo_jquery_215x53.gif</a>" />

L’esempio

Oct 192012
 

Questo tutorial è dedicato al parsing di un feed rss tramite jQuery.
Al caricamento del documento andremo a a caricare via ajax il file news.xml
e poi prepareremo la visualizzazione.

Trattandosi di una chiamata ajax useremo la tradizionale icona animata per avvisare del caricamento dati in corso.
Nell html predisponiamo un div nascosto via css:

<div id="loader"><img src=”http://www.lorenzodeambrosis.net/blog/tutorial/images/ajax_loader.gif” alt="" /></div>

Al document assegniamo la gestione della visualizzazione e della scompars del div in oggetto (che poi andrà posizionato al centro della pagina)

$(document)
.ajaxStart(function(){$(‘#loader’).show();})
.ajaxStop(function() {$(‘#loader’).hide();})

al caricamento invece inoltriamo la chiamata con il metodo .ajax():

$.ajax({
type:’GET’,
url:’data/news.xml’,
dataType:’xml’,
success:function(str_xml){

}
})

Per quanto riguarda la parte di visualizzaizone dei dati invece utilizzeremo le funzionalità tradizionali di jQuery di attraversamento del DOM.
Quindi come prima cosa andremo a cercare il tag “item” all’interno della stringa str_xml ottenuta in risposta e per ogni item andremo a caccia delle info contenute

$(str_xml).find(‘item’).each(function(){
…
})

Come prima cosa assegniamo delle variabili ottenute dall’estrazione del contenuto dai tag con il metodo .text(),
quindi $(this) rappresenta l’item sul quale ci troviamo, al suo interno andiamo alla ricerca del tag desisderato (.find())
e infine preleviamo il testo del tag


var titolo=$(this).find(‘title’).text();
var miolink=$(this).find(‘link’).text();
var description=$(this).find(‘description’).text();
var pubDate=$(this).find(‘pubDate’).text();
var category=$(this).find(‘category’).text();

A questo punto possiamo costruire la stringa html da appendere al contenitore target della visualizzazione:

var riga1=”+titolo+”;
var riga2=’<strong>‘+</strong>category<strong>+’</strong> – <em>‘+&lt;/em>pubDate&lt;em>+’</em>‘;
var riga3=”+description+”;

$(‘<div class=”item”></div>’).html(riga1+riga2+riga3).appendTo(‘#contenitore’)

Ecco l’esempio completo

Dec 272011
 

Spesso dobbiamo inserire delle date usando un calendario, ma molte volte abbiamo dei piccoli fastidiosi problemi legati alla durata o alla comodità di selezione delle date.

Costruiremo un calendario in italiano che vada a risolvere alcuni di questi problemi.

Per prima cosa colleghiamo jquery, jqueryUI, un tema e la traduzione dei mesi e dei giorni attingendo dai repository di google, ovviamente, volendo, tutti questi files possono essere scaricati in locale sul proprio server web:


<link rel=”stylesheet” type=”text/css” href=”http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/themes/cupertino/jquery-ui.css” />
<script type=”text/javascript” src=”https://ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.js”></script>
<script type=”text/javascript” src=”https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/jquery-ui.min.js”></script>
<script type=”text/javascript” src=”js/jquery.ui.datepicker-it.js”></script>

Nella nostra pagina inseriremo un frammento di form con un campo di input:


<label for=”data”>Data:</label>
<input type=”text” id=”data” name=”data” />

Quindi al caricamento della pagina andreamo a mappare sul nostro controllo html la trasformazione in calendario:


$().ready(function(){
var dates1 = $( “#data” ).datepicker({

});
})

A questo punto avendo già agganciato la traduzione italiana le date saranno automaticamente nel formato giorno-mese-anno, abilitiamo le opzioni per modificare velocemente mese e anno senza dver necessariamente scorrere di mese in mese:


changeMonth:true,
changeYear:true,

e infine rendiamo dinamico lo scorrere del range degli anni: per fare questo partiremo dall’anno in corso e calcoleremeo i limiti prima e dopo:


var oggi=new Date();
var anno=oggi.getFullYear();
var da=parseInt(anno-5);
var a=parseInt(anno+2);

infine l’ultima proprietà sarà dunque l’yearRange:


yearRange: da+’:'+a

L’esempio

Dec 272011
 

Per creare una selezione di un periodo di date senza impazzire con i vari controlli un’ottima soluzione è ricorrere a jQuery UI, avremo a disposizione un calendario e tutti gli strumenti che ci servono.

Per prima cosa serve include il core di jQuery (direttamente dalla CDN di google):


<script type=”text/javascript” src=”https://ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.js”></script>

Poi jquery UI:


<script type=”text/javascript” src=”https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/jquery-ui.min.js”></script>

e, se necessario, la localizzazione in italiano (questa formatterà anche di default la data anche se poi lo potremo modificare):


<script type=”text/javascript” src=”js/jquery.ui.datepicker-it.js”></script>

Infine usiamo un tema fra quelli disponibili:


<link rel=”stylesheet” type=”text/css” href=”http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/themes/cupertino/jquery-ui.css” />

Nell’html della pagina la parte che ci interessa è composta semplicemente da due campi di input:


<input type=”text” id=”da” name=”da” />
<input type=”text” id=”a” name=”a” />

A questo punto bisogna “solo” trasformarli in controlli datepicker sncronizzati al caricamento della pagina:


$().ready(function(){
var dates1 = $( “#da, #a” ).datepicker({
defaultDate: “+1w”,
numberOfMonths: 1,
yearRange: ’1990:2011′,
onSelect: function( selectedDate ) {
var option = this.id == “da” ? “minDate” : “maxDate”,
instance = $( this ).data( “datepicker” ),
date = $.datepicker.parseDate(
instance.settings.dateFormat ||
$.datepicker._defaults.dateFormat,
selectedDate, instance.settings );
dates1.not( this ).datepicker( “option”, option, date );
}
});
})

dove $().datepicker() per mette di trasformare appunto in datepicker i due input con id “a” e “da”;

infine all’evento select della prima data prepariamo il secondo datepicker disabilitando le date non selezionabili (perché precedenti).

Per provare l’esempio completo portare il focus nei due campi di input.

Nov 172011
 

Facciamo in modo che gli utenti non commettano errori nella compilazione dei nostri form. Dove possibile una strada da seguire è quella dell’autocomplete, ovvero forni resu ggerimenti “live” in  modo che l’utente possa scegliere l’opzione desiderarata. Per fare quersto useremo jQuery UI, e per la parte server php e mysql.

Il database: una semplice tabella contenente le province italiane, a noi serviranno i campi sigla e nome.

A questo punto abbiamo bisogno di due file, uno sarà quello visualizzato dall’utente, il secondo sarà un file php che pescherà dal database i dati filtrati e li restituirà in formato json.

Il file html: due campi di input, il primo da compilare da parte dell’utente dove noi assoveremo la chiamata al server (quando avrà digitato il secondo carattere) e un campo dove scriveremo la sigla:


<input type=”text” id=”tag” name=”tag” value=”" />
<input type=”text” id=”tagid” name=”tagid” value=”" />

Nel tag head andremo a inserire:

1. il collegamento a jquery (preso dalla CDN di google)


<script type=”text/javascript” src=”https://ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.js”></script>

2. il collegamento a jquery ui dalla stessa fonte


<script type=”text/javascript” src=”https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/jquery-ui.min.js”></script>

3. il tema css che applicheremo al nostro oggetto


<link rel=”stylesheet” type=”text/css” href=”http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/themes/cupertino/jquery-ui.css” />

A questo punto, al caricamento del DOM, associamo all’elemento che ha id tag la funzione autocomplete:


$().ready(function(){
$(‘#tag’).autocomplete();
})

e andiamo a personalizzarlo specificando:

minLength:2, ovvero almeno due caratteri prima di effettuare la chiamata

source: ‘autocomplete.php’ la nostra fonte di dati

la gestione dell’evento change


change:function(event,ui){
if(!ui.item){
$(this).val(”);
$(‘#tagid’).val(”);
return false;
}
},

e soprattuto la gestione dell’evento select


select:function(event,ui){
$(‘#tagid’).val(ui.item.id);
}

per scrivere il valore dell’id nel secondo campo.

Ultimo passaggio il file php:


error_reporting(0);
require(‘include/mysql.inc.php’);
$return_arr=array();
$nome=$_GET['term'];
$sql=’select nome, sigla from province where nome like “‘.mysql_real_escape_string($nome).’%” order by nome’;
$fetch=mysql_query($sql);
while($row=mysql_fetch_array($fetch, MYSQL_ASSOC)){
$row_array['value']=$row['nome'];
$row_array['id']=$row['sigla'];
array_push($return_arr,$row_array);
}
mysql_close($conn);
echo json_encode($return_arr);

l’include contiene la connessione al database, dichiariamo l’array che useremo per raccogliere i dati, leggiamo la variabile get passata dal form e la usaimo all’interno della clausola where come filtro.

Mettiamo i risultati in un array che stampiamo nel formato json per inviarli alla pagina che ne ha fatto richiesta.

Ecco l’esempio al lavoro.