30 gennaio 2011

Drupal 6: blocco con dati del 'nodo collegato'

In questo periodo sono stato davvero indaffarato per le fasi finali del mio lavoro con il Comune di Monsummano Terme, per il quale ho gestito tutta la migrazione a Drupal come interfaccia gestionale: e non solo, stesso lavoro in contemporanea anche per altri tre comuni della Valdinievole (Larciano, Lamporecchio, Pieve a Nievole), che prima erano gestiti in modo associato, ma adesso avevano la necessità di avere piattaforme gestionali indipendenti.

Dato che il layout esteriore è rimasto inalterato, ho dovuto soddisfare una serie di richieste di presentazione di contenuti che non sarebbe stato possibile gestire con le funzionalità di default di Drupal. Ad esempio, oggi farò vedere com'è semplice andare a pescare del contenuto "secondario" e metterlo su un blocco in una regione qualsiasi della pagina.

Nel sito del Comune, ciascuna pagina informativa è di competenza di un certo Ufficio, che a sua volta è rappresentato da un nodo (di un apposito tipo di contenuto). L'Ufficio di competenza deve essere visualizzato in un apposito box sulla colonna destra, completo di tutte le informazioni di pubblica utilità (link, orari d'apertura, recapiti vari).

L'Ufficio è collegato alla pagina tramite un campo CCK 'nodo collegato' a selezione univoca: una tendina consente di scegliere uno qualsiasi dei nodi del tipo 'Ufficio' precedentemente pubblicati.

Il problema da risolvere è caricare i dati di un nodo che non è quello caricato nella pagina, ma bensì un nodo ad essa collegato; inoltre lavorando in un blocco non abbiamo a disposizione la variabile $node con tutti i dati del nodo della pagina.

Dobbiamo quindi caricare prima il nodo principale, e poi, accedendo al campo 'nodo collegato', caricare il nodo collegato ed estrarre i dati che ci servono. A tal fine usiamo la funzione node_load(), che ha bisogno di un NID per poter funzionare.

Per individuare l'ID del nodo principale, sfruttiamo la funzione arg(), che ritorna una parte del path corrente: ad esempio, in una pagina nodo con un path del tipo www.mysite.com/node/nid arg(0) ritorna "node", arg(1) ritorna "nid", e così via.

Tutto il codice che esamineremo da ora in poi va a finire in un bel blocco nuovo da mettere dovunque più ci piaccia.
<?php 
if ( arg(0) == 'node' && is_numeric(arg(1)) ) {
$node = node_load(arg(1));
$node_collegato= node_load($node->field_ufficiocompetenza[0]["nid"]);
// codice per estrarre i dati d'interesse dal nodo collegato
}
?>
La condizione serve per assicurarsi di avere a che fare con una pagina/nodo (ovviamente funziona anche se il path è sotto forma di alias).
Il primo uso di node_load carica il nodo principale, il secondo accede al campo CCK che riporta il NID del nodo Ufficio collegato. Il resto è facile: basta stampare i dati che ci interessano con il markup necessario a formattare il tutto. Quindi il mio blocco "ufficio di competenza" finito e pronto all'uso è:
<?php 
global $base_path;

if ( arg(0) == 'node' && is_numeric(arg(1)) ) {

$node = node_load(arg(1));
$node_collegato= node_load($node->field_ufficiocompetenza[0]["nid"]);
if($node->field_ufficiocompetenza[0]["nid"]>0) {
 print "<div class=\"itemdx\">";
 print "<h2><a href=\"".$base_path.$node_collegato->path."\" title=\"pagina "".$node_collegato->title.""\">".$node_collegato->title."</a></h2>";
 print "<ul>";
 print "<li><b>Settore: </b>".$node_collegato->field_settore[0]["value"]."</li>";
 print "<li><b>Orario: </b>".$node_collegato->field_apertura[0]["value"]."</li>";
 print "<li><b>Responsabile ufficio: </b>".$node_collegato->field_responsabile[0]["value"]."</li>";
 print "<li><b>Telefono: </b>".$node_collegato->field_telefono[0]["value"]."</li>";
 print "<li><b>Fax: </b>".$node_collegato->field_fax[0]["value"]."</li>";
 print "</ul>";
 print "</div>";
}

}
?>  
La condizione della riga 8 serve per assicurarsi che vi sia effettivamente un Ufficio collegato; altrimenti il blocco rimane vuoto.

Con lo stesso metodo poi ci si può sbizzarrire a suddividere i contenuti nelle varie regioni tramite altri blocchi.