Il rapporto gerarchico tra i dati è spesso uno degli elementi fondamentali per la creazione di applicazioni complesse; che si stia realizzando un blog engine, un CMS, una directory per siti Web o un manager per l'advertising pubblicitario diventa spesso necessario dover gestire strutture che prevedono categorie e sottocategorie illimitate sia per numero che per profondità.
Il sito PhpClasses mette a disposizione una vera e propria miniera di classi pronte all'uso con le quali è possibile svolgere le operazioni più disparate; tra di esse ve n'è una che ha riscosso un grande successo fra gli utenti del sito, il suo nome è Unlimited sub-categories ed è stata concepita con lo scopo di consentire la gestione di categorie illimitate nelle applicazioni basate su PHP e MySQL.
In questo breve articolo vedremo come sia possibile utilizzare questa classe per gestire efficacemente le relazioni tra categorie.
Scaricare ed installare Unlimited sub-categories
Unlimited sub-categories è una classe distribuita sotto licenza open source può essere quindi utilizzata liberamente e gratuitamente. Questa classe permette di gestire categorie (e relative proprietà) memorizzate all'interno di un database MySQL strutturato gerarchicamente. Per la gestione dei dati memorizzati sono disponibili funzioni con le quali sarà possibile aggiungere nuove categorie, aggiornarle, cancellarle, elencarle e modificarne le proprietà.
PHPClasses dedica una pagina ad Unlimited sub-categories da cui sarà possibile scaricarla dopo aver effettuato una semplice operazione di registrazione gratuita.
La classe si compone sostanzialmente di un unico file denominato categories.class.php che contiene tutte le funzioni e i metodi necessari per il suo funzionamento, la stessa pagina per il download offre anche un sample con alcuni esempi per l'utilizzo della classe e un breve manuale in formato HTML.
Una volta scaricato il file contenente la classe, questa per poter funzionare dovrà appoggiarsi ad un database composto da un'unica tabella in cui saranno presenti i seguenti campi:
id
, identificativo univoco auto-incrementale;position
, destinato a contenere una stringa indicante le relazioni tra gli id delle diverse categorie;c_name
, campo relativo al nome delle categorie e delle sottocategorie;c_desc
, campo contenente una descrizione relativa alle categorie;c_icon
, campo che memorizza il percorso alle icone eventualmente associate alle categorie;c_group
, campo relativo al gruppo di appartenenza delle categorie.
Sulla scorta di queste descrizioni potremo quindi creare la nostra tabella e cominciare a lavorare con Unlimited sub-categories:
CREATE TABLE `categorie` ( `id` INT(11) NOT NULL AUTO_INCREMENT , `position` VARCHAR( 255 ) NOT NULL , `c_name` VARCHAR( 255 ) NOT NULL , `c_desc` VARCHAR( 255 ) NOT NULL , `c_icon` VARCHAR( 255 ) NOT NULL , `c_group` VARCHAR( 255 ) NOT NULL default '0' , PRIMARY KEY ( `id` ) );
Il nome della tabella non è vincolante, l'unico accorgimento da prendere sarà quello di modificare il valore relativo alla variabile $table_name
presente nella classe con il nome scelto. Si tenga conto del fatto che la classe non svolge compiti di connessione al DBMS e di selezione del database, a questo scopo l'utente potrà creare un apposito file di configurazione con tutti i parametri necessari per interfacciare la propria applicazione a MySQL.
Un'altra variabile il cui valore potrà essere modificato è $name_prefix
, di default " ", esso verrà aggiunto al nome di una categoria sulla base della sua posizione gerarchica.
Utilizzo di Unlimited sub-categories
La classe principale su cui si basa Unlimited sub-categories è chiamata categories, essa contiene tutte le funzioni per la gestione dei record contenuti in tabella; quindi per istanziare la classe all'interno di una nostra applicazione sarà necessario innanzitutto includere il file contenente la classe:
require_once("categories.class.php");
per poi passare all'istanza della stessa:
$categories = new categories;
In questo momento la nostra tabella è ancora vuota, infatti non abbiamo inserito alcuna categoria; per popolarla dobbiamo tenere conto che la classe vede le categorie come una struttura gerarchica per la quale a parte le categorie principali ("madri") tutte le altre sono "figlie" delle prime; per le categorie principali esiste in ogni caso un riferimento gerarchicamente superiore denominato "ROOT" rispetto al quel occupano un primo livello, la sottocategoria di una principale occuperà un livello secondario e le sue derivate scenderanno ulteriormente nella gerarchia.
Questo discorso introduce un metodo disponibile nella classe che si chiama build_list()
, il suo scopo è quello di restituire un array contenente le categorie e la loro posizione all'interno della gerarchia; questo array potrà essere associato come valore di una variabile attraverso una semplice chiamata al metodo:
$categories_list = $categories->build_list();
Nel caso in cui al metodo non venga passato alcun argomento (o un valore pari a "0"), l'array conterrà i valori relativi a tutte le categorie presenti in tabella.
Sarà quindi possibile creare una lista completa delle categorie disponibili tramite un semplice ciclo foreach
che potrà essere utilizzato per esempio nella creazione di un form per l'inserimento di nuove classi:
<select name="parent" id="parent"> <option value="0">ROOT</option> <?php foreach($categories_list as $c) { ?> <option value="<?php=$c["id"]?>" > <?php=$c["prefix"]?>»<?php=$c["c_name"]?> </option> <? } ?> </select>
Per l'aggiunta di una nuova categoria, la classe mette a disposizione il metodo add_new()
che accetta come parametri i dati provenienti da un semplice form:
$categories->add_new($_POST['parent'], $_POST["name"], $_POST["desc"], $_POST["icon"] );
Il form potrà essere realizzato manualmente dallo sviluppatore aggiungendo eventualmente campi per informazioni addizionali o eliminando quelle che non interessano; sarà per esempio possibile omettere le informazioni relative alla descrizione delle categorie o l'abbinamento di un'icona, è invece fondamentale l'informazione relativa alla posizione gerarchica della categoria creata così come (ovviamente) quella relativa al suo nome.
Immaginiamo quindi di creare una prima categoria principale denominata "Animali", il suo id sarà logicamente pari ad "1" in quanto primo incremento in tabella, il valore relativo al campo "position" sarà quindi "1>" in quanto non si tratta di una sottocategoria. Aggiungiamo ora la sottocategoria "Gatti" come categoria figlia di "Animali", il suo id sarà pari a 2 mentre il campo position ospiterà il valore "1>2" dove "1" è l'id della categoria principale mentre "2" è quello della sottocategoria. Se infine aggiungiamo un'ultra sottocategoria ad "Animali" denominata "Cani" e ad essa associamo un'ulteriore sottocategoria denominata "Boxer", avremo per quest'ultima una valore position pari a "1>3>4>".
Il campo position è quindi fondamentale per l'utilizzo della nostra classe, grazie ad esso possiamo infatti memorizzare una stringa contenente i rapporti di gerarchia tra le nostre categorie; riassumendo l'esempio appena proposto avremo quindi:
ROOT - Animali -- Gatti -- Cani --- Boxer
I metodi di Unlimited sub-categories
Abbiamo già parlato in precedenza del metodo build_list()
; questo potrà essere utilizzato in due modi: con o senza il passaggio di parametri. Avendo già analizzato il secondo caso passiamo ad una descrizione del primo: build_list()
accetta due parametri:
$id
, questo argomento potrà essere utilizzato se si desidera creare una lista relativa ad una sola categoria (principale o secondaria) e mostrare soltanto le sottocategorie ad essa relative, se questo valore non viene specificato allora l'elenco partirà dalla ROOT;$collapsed
, se presente non permette l'espansione dell'elenco oltre il primo livello successivo a quello della categoria riferita al valore$id
.
Immaginiamo quindi di dover lavorare con una struttura gerarchica che prevede due categorie principali:
ROOT -1 (id=1) --2 ---3 -a (id=2) --b ---c
Passando al metodo il valore $id
pari a "1" (build_list(1)
) visualizzeremo soltanto la categoria numerica e tutte le sue sottocategorie; se invece passassimo a build_list()
un $id
pari a "2" e l'argomento $collapse
(build_list(2, ,"collapsed")
), allora visualizzeremmo la principale categoria alfabetica seguita dalla sua prima sottocategoria e non oltre.
build_list()
, rientra nel gruppo di metodi che la classe mette a disposizione per restituire informazioni relative ai dati memorizzati in tabella; allo stesso gruppo appartengono:
browse_by_id()
: accetta come parametro l'id di una categoria e restituisce un array contenente le relative sottocategorie;fetch()
: restituisce le informazioni riguardanti la categoria corrispondente all'id passato come argomento;count_categories()
: restituisce il numero delle sottocategorie per la categoria corrispondente all'id passato come argomento;
L'output in HTML
Un discorso a parte merita il metodo html_output()
; anch'esso accetta come parametro l'id di una categoria, ma il suo compito è quello di restituire i dati sotto forma di output HTML; a questo scopo la classe mette a disposizione una variabile, $HtmlTree
, a cui potranno essere associati gli stili per la formattazione. La vediamo nella pagina successiva.
Ad $HtmlTree
spetta il compito di conservare l'informazione relativa al template con cui verrà presentato l'elenco delle categorie; si tratta di un array che contiene al suo interno quattro valori corrispondenti alle diverse parti del template:
$HtmlTree['header']
: intestazione;$HtmlTree['BodySelected']
: stile per la categoria selezionata;$HtmlTree['BodyUnselected']
: stile per gli altri elementi della lista;$HtmlTree['footer']
: piè di pagina;
Il valore $id
, che viene passato come argomento per indicare la categoria di appartenenza delle voci elencate da build_list()
, assume una particolare importanza nel momento in cui viene creata una nuova categoria tramite il metodo della classe denominato add_new()
; in questo caso l'id prende il nome di parametro $parent
e grazie ad esso sarà possibile catalogare una data categoria sulla base della sua posizione gerarchica, se $parent
è uguale a "0" allora dovrà essere creata una categoria principale.
Un altro metodo disponibile per la classe è update()
che si occupa dell'aggiornamento delle categorie, grazie a questo metodo sarà possibile modificare il nome (e le altre proprietà) di una categoria, la posizione gerarchica o il gruppo di appartenenza.
Questo metodo necessita di 4 parametri:
$id
: cioè l'identificativo della categoria da modificare;$parent
: la variabile riferita all'eventuale categoria di appartenenza ("0" per le principali);$nome
: il nome della categoria da aggiornare;
Vi sono poi altri parametri opzionali come $desc
(descrizione associata alla categoria) e $icon
(il percorso all'icona da associare alla categoria) che possono essere coinvolti o meno nel processo di modifica:
update($id, $parent, $name, $desc, $icon);
Per la cancellazione di una categoria esiste un metodo apposito, chiamato delete()
, che per funzionare necessita unicamente dell'id della categoria da rimuovere:
delete($id);
Questo metodo, per quanto comodo, deve essere utilizzato con cautela in quanto l'eliminazione di una categoria determinerà la cancellazione di tutte le voci gerarchicamente inferiori. Per le operazioni di cancellazione non è infatti richiesta alcuna conferma.
Conclusioni
Unlimited sub-categories è una delle migliori classi per la gestione di rapporti di gerarchia tra categorie, è ricca di metodi e funzioni e può essere facilmente integrata in qualsiasi template. Gli utilizzatori più attenti non mancheranno di notare alcuni difetti, tra cui citiamo:
- Non viene integrato un metodo per la connessione al DBMS e la selezione del database
- Non sono previsti filtri per i parametri di input e l'escape dei caratteri speciali
- Le procedure di modifica e cancellazione dei dati non richiedono conferma per essere eseguite;
In ogni caso, la natura open source della classe consente di modificarla sulla base delle diverse esigenze e di rimuovere eventuali problematiche riscontrate in sede di sviluppo.