martedì 29 luglio 2008

QContacts 1.0.3

Dopo circa tre mesi dal rilascio della prima versione, è arrivato il momento di aggiungere qualche nuova funzionalità al componente per la gestione contatti QContacts.

Ecco le principali novità introdotte dalla versione 1.0.3 appena rilasciata.

Dalla configurazione del componente è possibile modificare praticamente ogni aspetto del codice captcha: dimensioni dell'immagine, numero dei caratteri del codice, font, colore di sfondo e del testo, presenza o meno delle linee verticali e curve.

Sono adesso disponibili fino a 6 campi personalizzati. Il tipo dei campi non è limitato a testo e textarea, ma sono possibili anche checkbox, radio e liste di selezione a discesa (drop down). La posizione sul modulo contatti e la larghezza di ogni campo sono configurabili. Alcuni utenti giustamente avevano richiesto di poter posizionare i campi personalizzati anche prima di quelli predefiniti, cosa che a questo punto è possibile fare.

L'elenco contatti visualizzato dai link Aspetto Categoria Contatto può includere molti più campi della scheda contatto, sono inoltre impostabili l'ordine e la larghezza delle singole colonne.

Un asterisco o altro simbolo a scelta può essere mostrato per segnalare un campo obbligatorio. Ho aggiunto inoltre un apposito selettore in qcontacts.css (label.required) per impostare lo stile dell'etichetta di un campo obbligatorio: l'impostazione predefinita è colore del testo rosso.

Il sito è aggiornato con la documentazione delle nuove funzioni.

www.latenight-coding.com/it/joomla-addons/qcontacts.html

I commenti degli utenti sulla prima versione sono stati in generale molto positivi, QContacts è al momento al primo posto su extensions.joomla.org nella sua categoria: Non è la più competitiva delle categorie, ma sono sempre soddisfazioni!

Spero che queste migliorie possano rendere il componente più utile e funzionale. Chi volesse dare un voto può farlo a questo link (è necessario registrarsi al sito).

Ringraziamenti

Voglio ringraziare tutti coloro che hanno inviato critiche e suggerimenti ed hanno contribuito a dare visibilità al componente. In modo particolare

Alex Red e lo staff di Joomla.it per l'ospitalità nella sezione download (download.joomla.it).

Vamba e lo staff di Joomlaitalia.com per l'inserimento nella sezione estensioni del sito (extensions.joomlaitalia.com).

Andrea di Joomlovers.net per la recensione e il supporto. Il blog di Andrea è aggiornato quotidianamente su tutte le novità del mondo Joomla! Raccomandato agli utenti e appassionati di questo cms.

Questo per ora è tutto. Nuovi sviluppi sono in preparazione :)

giovedì 24 luglio 2008

Mootools. Ancora la classe QScroller

Concludiamo l'esame della funzione initialize() della classe QScroller.

var QScroller = new Class({
  /*...*/
  initialize: function(wrapper,options) {
    /*...*/  
    this.slides = $$('.'+this.options.slides); (1)
    
    if($defined(this.options.buttons)) {
      if($defined(this.options.buttons.next)) {
        $(this.options.buttons.next).addEvent('click', 
        this.next.bind(this)); (2)
      }
      /*...*/ 
    }
    this.auto = this.options.auto;
    this.idxSlide = 0;
    this.step = 0;
    this.isFirst = true;
  },
  load: function() { (3)
    if(!this.isFirst) {
      this.idxSlide += this.step;
      if(this.idxSlide > this.slides.length-1) {
        this.idxSlide = 0;
      } else if(this.idxSlide < 0) {
        this.idxSlide = this.slides.length-1;
      }
    }
    this.curSlide = this.slides[this.idxSlide].clone();
    this.show();
  },
  /*...*/
});
QScroller.implement(new Options, new Events);

(1) La funzione $$ ritorna un array di elementi DOM selezionati, in questo caso, in base ad un selettore css che passiamo come argomento.

this.options.slides come abbiamo visto è un'opzione di configurazione della classe. Quindi ad esempio

this.slides = $$('.qslide');

Seleziona e memorizza nell'attributo slides della classe tutti gli elementi di classe qslide. Controllando il sorgente html degli esempi è facile capire che questi elementi sono le div che contengono il testo o le immagini da far scorrere.

(2) Aggiunge un event listener per l'evento click ad ogni pulsante (next, prev, play, stop). AddEvent() l'abbiamo già incontrata (vedi questo post), per ulteriori dettagli rimando al sorgente degli esempi 2 e 3 (nel pacchetto di installazione) dove si vede come tramite il meccanismo delle options viene passato alla classe un oggetto buttons con gli ID dei link che servono per controllare lo scorrimento delle immagini.

Il codice rimanente serve solo ad inizializzare alcuni attributi il cui utilizzo sarà visto in seguito. Possiamo proseguire con le altre funzioni.

(3) il funzionamento di load() dovrebbe, almeno spero, essere del tutto intuitivo.

Come abbiamo detto sopra slides è un array con gli elementi (div) contenenti il testo e/o le immagini da far scorrere. La funzione memorizza in curSlide un clone del prossimo elemento da visualizzare in base alla direzione corrente dello scorrimento (step=1 avanti, step=-1 indietro).

È chiaro che devono esserci dei controlli per rendere ciclico il movimento. Se ci si sposta avanti quando siamo posizionati sull'ultimo elemento (idxSlide uguale a slides.length-1) si visualizza il primo, se ci si sposta indietro quando siamo posizionati sul primo elemento (idxSlide uguale a zero) si visualizza l'ultimo.

E anche per questa volta è tutto.

sabato 19 luglio 2008

PHP: Funzioni di ordinamento array

PHP possiede diverse funzioni dedicate all'ordinamento di array. Credo sia utile vedere alcuni esempi anche perché, a mio parere, quelli presenti sulla documentazione ufficiale non sono sempre lineari e facili da capire.

Inizieremo da esempi molto semplici potrei tranquillamente dire banali.

Ordinamento di array a una dimensione

Ordinamento degli elementi di un array

Consideriamo il seguente codice

$a = array(9,4,2,7,5);
sort($a);
print_r($a);

Il risultato di questo esempio è

Array
(
  [0] => 2
  [1] => 4
  [2] => 5
  [3] => 7
  [4] => 9
)

La funzione sort() ordina l'array in ordine crescente in base al valore degli elementi. Esiste anche una funzione rsort() che svolge un'operazione analoga, ma con ordinamento decrescente.

Altro esempio sempre utilizzando lo stesso array

$a = array(9,4,2,7,5);
asort($a);
print_r($a);
Il risultato è
Array
(
  [2] => 2
  [1] => 4
  [4] => 5
  [3] => 7
  [0] => 9
)

asort() ordina l'array in ordine crescente in base al valore degli elementi, ma, a differenza di sort(), mantiene l'associazione chiavi / valori dell'array originario. Per questo motivo è particolarmente utile quando si lavora con array associativi.

Nell'esempio seguente abbiamo un array associativo in cui ogni chiave è il nome di una squadra associato al rispettivo punteggio. Ecco come possiamo visualizzare una 'classifica'.

$a = array(
  'Fiorentina' => 66,
  'Inter' => 85,
  'Juventus' => 72,
  'Roma' => 82
);
arsort($a);
print_r($a);

Utilizziamo arsort(), l'omologa di asort() per l'ordinamento decrescente, perché vogliamo ordinare dal punteggio più alto al più basso ottenendo questo risultato

Array
(
  [Inter] => 85
  [Roma] => 82
  [Juventus] => 72
  [Fiorentina] => 66
)

Ordinamento delle chiavi di un array

Per ordinare un array in base al valore delle chiavi si utilizza ksort(). Ordiniamo l'array delle squadre visto in precedenza con questa funzione

ksort($a);

otteniamo

Array
(
  [Fiorentina] => 66
  [Inter] => 85
  [Juventus] => 72
  [Roma] => 82
)

La funzione krsort() è analoga, ma effettua un ordinamento decrescente delle chiavi.

Ordinamento naturale

La funzione natsort() ordina le stringhe contenenti valori numerici in modo più 'naturale', cioè più simile a quanto farebbe un essere umano, rispetto agli algoritmi usati dalle altre funzioni di ordinamento.

Vediamo un esempio. Questo è l'array da ordinare

$a=array('A4','A11','B6','A2','B400','B3','B31');

ordinamento con sort()

sort($a);
print_r($a);

Risultato

Array
(
  [0] => A11
  [1] => A2
  [2] => A4
  [3] => B3
  [4] => B31
  [5] => B400
  [6] => B6
)

Ordinamento con natsort()

natsort($a);
print_r($a);

Risultato

Array
(
  [3] => A2
  [0] => A4
  [1] => A11
  [5] => B3
  [2] => B6
  [6] => B31
  [4] => B400
)

Confrontando i due risultati si nota come natsort() ordini numericamente la parte numerica delle stringhe. Inoltre le associazioni chiavi valori sono preservate analogamente a quanto accade con asort().

La funzione natcasesort() è del tutto analoga tranne per il fatto che l'ordinamento non è sensibile alle maiuscole e minuscole.

Ordinamento di array multidimensionali

Tra le funzioni per l'ordinamento di array, array_multisort() è forse la più complessa. Serve ad ordinare più array insieme o un array multidimensionale, rispetto a una o più delle sue dimensioni: è di questo secondo utilizzo che vedremo un esempio.

Consideriamo il seguente codice

$a = array(
  array(5, 7, 8, 5),
  array(1, 2, 6, 4)
);
array_multisort($a[0], SORT_ASC, $a[1], SORT_DESC);

$a è un array a più dimensioni (o array di array se si preferisce). Il risultato dell'ordinamento è

Array
(
  [0] => Array
    (
      [0] => 5
      [1] => 5
      [2] => 7
      [3] => 8
    )

  [1] => Array
   (
     [0] => 4
     [1] => 1
     [2] => 2
     [3] => 6
   )
)

Il funzionamento può non essere facile da capire a prima vista. Il tutto però risulta più chiaro se rappresentiamo come tabella l'array multidimensionale da ordinare (i numeri in grassetto sono gli indici).

Array di partenza,

  | 0 | 1 | 2 | 3 |
0 | 5 | 7 | 8 | 5 |
1 | 1 | 2 | 6 | 4 |

Array risultante dopo l'esecuzione di array_multisort().

  | 0 | 1 | 2 | 3 |
0 | 5 | 5 | 7 | 8 |
1 | 4 | 1 | 2 | 6 |

L'array è stato ordinato in ordine crescente (SORT_ASC) in base al valore degli elementi della prima dimensione (la prima riga); quando due di questi elementi hanno lo stesso valore (nell'esempio 5), l'ordinamento è stato fatto in base agli elementi corrispondenti della seconda dimensione (la seconda riga) e questa volta l'ordine è decrescente (SORT_DESC): la colonna contenente i valori 5-4 è posta prima di quella contenente 5-1.

L'ordine degli argomenti passati ad array_multisort() detta la priorità dei criteri di ordinamento. Chi ha familiarità con il linguaggio SQL riconoscerà che la situazione è del tutto analoga a quella che si verifica quando si specificano più campi di ordinamento in una clausola ORDER BY.

Spero che questa breve panoramica delle funzioni PHP per l'ordinamento di array sia stata utile. Non è certo mia intenzione duplicare la documentazione ufficiale del PHP a cui consiglio di fare riferimento per numerosi dettagli che ho necessariamente omesso e per esempi di codice più complessi di quelli sopra presentati.