Menu intermedio fai da te..

1 contenuto / 0 new
Menu intermedio fai da te..

Non avendo trovato niente a riguardo in giro per i forum sia italiani che inglesi, vi propongo un sistema rudimentale per poter creare una serie di menù intermedi nelle pagine. Sicuramente c'è un sistema migliore per farlo e magari c'è anche un modulo apposito (nn l'ho trovat) comunque sia, mi sono arrangiato da me, con un'ottimo risultato.

Il sistema è rudimentale quindi se qualcuno ha consigli e suggerimenti per migliorarlo ben vengano!!!

Come tutti sappiamo Drupal sfrutta un sistema di vocabolari e termini per organizzare i contenuti all'interno del sito. Quando creiamo un vocabolario e gli associamo dei termini, abbiamo la possibilità di vedere, o a destra o a sinistra, un menù ad albero con i contenuti(vocabolari) che abbbiamo creato e gli eventuali sottomenu associati(termini).

L'esigenza che avevo era quella di mostrare un menu intermedio che mi visualizzasse i termini correlati, ogni volta che si cliccava sulla categoria(vocabolario) del menu.

Ok nn si capisce una mazza... facciamo un'esempio pratico:
Il mio sito ha questi 3 vocabolari(categorie):
Guide
Articoli
Tutorials

Le categorie hanno i temini correlati(sottocategorie):
Guide
-- concetti base
-- dispositivi
-- effetti
Articoli
-- generale
-- news
Tutorials
-- base
-- avanzati

Il sistema visualizzera un menu nella pagina in base al vocabolario(categoria) selezionato.

Vediamo un pò codice:
non avendo trovato una funzione che faceva al caso mio me la sono creata:

function termini_del_vocabolario($vocid) {
$query = db_query(db_rewrite_sql("SELECT * FROM rr_term_data WHERE vid = $vocid ORDER BY weight"));
while ($termine = db_fetch_object($query)) {
$termini[] = $termine;
}
return $termini;
}

è molto semplice, alla funzione viene passata una variabile, $vocid che identifica l'id del vocabolario richiesto. Con questo id si esegue una query che seleziona tutti i campi dalla tabella "rr_term_data" (questo nome potrebbe cambiare per voi) e li ritorna sotto forma di array di oggetti. Inserite questo codice all'interno del file template.php

Ora che abbiamo la possibilità di avere tutti i campi della tabella dei termini, possiamo fare quello che vogliamo:
In drupal creiamo un nuovo blocco e inseriamo il seguente codice php all'interno:

<?php
$vocid
= 5;
?>

<div id="menu_intermedio">
<h3>Le guide presenti nel sito</h3>
<dl>
<?php
foreach (termini_del_vocabolario($vocid) AS $k => $v) {
  
$menu = "<dt><strong><a href="" . $base_url . "/taxonomy/term/" . $v->tid . "">" . $v->name . "</a></strong></dt>\n";
  
$menu .= "<dd>" . $v->description . "</dd><br />\n";
  echo
$menu;
}
?>

</dl>
</div>

Questo blocco dovrà essere visibile solamente nella pagina di riferimento della categoria, in questo caso: node/guide.
Analiziamo il codice:
$vocid - passerà l'id del vocabolario(categoria) di cui vogliamo visualizzare i termini. Per vederlo, guardate la tabella nel database chiamata vocabulary
Eseguiamo poi un ciclo foreach dell'array ritornato dalla funzione che abbiamo aggiunto alla pagina template e creiamo una lista di definizione che avra come titolo (dt) un link ai nodi del termine e come descrizione la descrizione del termine correlato.
Il menu è fatto!!!!!

Pro: il div cosi com'è è personalizzabile tramite CSS questo quello che utilizzo io:

/*---------------------------------stile menu intermedio----------------------*/
#menu_intermedio {
  margin: 1em 1em 2em 2em;
  border-bottom: 1px dotted #999;
  padding-bottom: 1em;
}
#menu_intermedio h3 {
  color: #404449;
  border-bottom: 1px solid #e0e0e0;
}
#menu_intermedio dl {
  margin-left: 1.5em;
}

Contro: questo sistema funziona ma non è ottimale. Infatto dobbiamo creare tanti blocchi quanto sono i vocabolari(categorie) e dargli una visualizzazione solo nella pagina relativa. Non sò come recuperare automaticamente l'id del vocabolario quindi un'altra rottura è quella di andare a vederselo ogni volta.

Mi scuso se mi spiego da cani se avete domande o ci sono mancanze sono disponibile. E se avete un'alternativa più ottimale ben venga.
Un'esempio di implementazione lo trovate sul mio sito in firma. Selezionate la categoria nel menu a sinistra e vedete il menu-intermedio.

Buon tutto