Menu: come creare un menu tramite una funzione che consenta di mostrare o nascondere un sottomenu senza ricaricare la pagina?

9 contenuti / 0 new
Ultimo contenuto
Menu: come creare un menu tramite una funzione che consenta di mostrare o nascondere un sottomenu senza ricaricare la pagina?
AllegatoDimensione
Image icon A.png25.4 KB
Image icon B.png56.95 KB

Io vorrei poter utilizzare un menu che sia lo stesso per tutti i siti web che utilizzano lo stesso tema core.
Questo menu deve essere indipendente da ogni sito web. Quindi non devo crearlo dall'interfaccia di ogni sito e non deve esistere all'interno del DB di ogni singolo sito. Il menu è orizzontale.
Detto così sembra più che facile ma c'è un problema...

Il le voci di Menu hanno un sottomenu.
La questione che incasina è che io vorrei che il sottomenu si aprisse NON ricaricando la pagina, ma espandendosi (nel senso applicare un display: block la dove prima c'era un display: none ). Cioè io clicco sulla voce di menu orizzontale e questo menu senza ricaricare la pagina, apre un altro menu orizzontale (sottomenu) proprio sotto all'area del primo menu. Praticamente la stessa cosa che fa il modulo Dynamic Persistent Menu.
Il problema è che io non idea di come fare una cosa del genere che funzioni su tutti i siti web senza configurare un Menu apposito su ogni sito.

Potete aiutarmi? Si può sistemare la cosa con qualche funziona in template.php e/o trovando un modo per usare javascript?

Ciao,
Hai più modi per poter fare quello che vuoi (mi è oscuro il perché lo vuoi statico...). Comunque sia puoi:
1) realizzare un template con all'interno (in page.tpl.php) il menu statico;
2) realizzare una funzione in template.php che ti restituisca il menu;
3) utilizzare javascript per il funzionamento del menu (forse un pò eccessivo, dato che l'html lo fai tu);
4) utilizzare un menu in puro css (http://www.cssplay.co.uk/menus/ qui trovi degli ottimi menu realizzati unicamente con css)
;)

I motivi x cui cerco un motivo così fatto sono:

  1. il menu ed il sottomenu è uguale x tutti i siti quindi ogni cambiamento non deve richiedere un intervento su tutti i siti web
  2. Se le voci di menu non hanno una pagina specifica di riferimento ma servono solo x aprire il relativo sottomenu, allora quando clicco su di esse o se ci passo sopra con il mouse, è inutile che mi venga ricaricata la pagina, mi serve solo che appaia il sottomenu le cui voci sono invece linkate all'esterno del sito stesso.
  3. il menu è orizzontale e sarei interessato ad avere un sottomenu caratterizzato da un blocco di voci sempre in orizzontale che appare sotto il blocco del menu, senza sovrapporsi ma facendo slittare giù tutto il resto del sito web (prima display: none; dopo display: block;).

E se volessi porre le voci di menu e tutti i sottomenu ad esse relative all'interno di array che contengono anche i link? Come potrei fare x gestirli questi array secondo le logiche di drupal in modo tale da avere:

<div id="menu">...</div>
<div id="sottomenu">...</div>

Definendo gli array e capendo come gestirli è possibile popolare il sottomenu così come drupal popola i secondary links quando questi sono invece delle voci di gerarchia dei primary links. Questo sarebbe molto vantaggioso per puoi inserire una specie di :

<?php
if ($sottomenu) then
...
endif
... o qualcosa di simile

Come fare?

Secondo me ti stai complicando la vita! Se il menu è statico non ha senso, secondo me, che vai a fare funzioni su funzioni (che portano via memoria a php) visto che il menu comunque non è dinamico. Fai prima e con meno sforzo a farlo html puro dentro page.tpl.php.
;)

Su questo sono d'accordo, ma dal sito che mi hai indicato o scovato solo modelli di menu, che quando li ho testati, aprivano il sottomenu in sovrapposizione, nel senso che la struttura è così:

<div>
  <ul>
     <li>menu item 1
       <div>
          <ul>
            <li>sottomenu 1 item 1<li>
            <li>sottomenu 1 item 3<li>
            <li>sottomenu 1 item 2<li>
         </ul>
       </div>
    </li>
    <li>menu item 2
      <div>
        <ul>
          <li>sottomenu 2 item 1<li>
          <li>sottomenu 2 item 3<li>
          <li>sottomenu 2 item 2<li>
        </ul>
      </div>
    </li>
  </ul>
</div>

Con questa struttura, quando il display: block mostra il sottmenu questo immncabilmente va in sovrapposizione ad altre cose ed anche se ti metti x cercare di gestire meglio la cosa, non risolvi bene.

La cosa corretta sarebbe quella mostrata nelle immagini allegate che ho appena aggiunto nel post di apertura di questa discussione, simile al comportamento del modulo Dynamic Persistent Menu.

se ho capito bene il livello superiore non contiene veri link ma solo dei segnaposto per aprire il relativo sottomenu.
in questo caso ti serve un modulo come special_menu_items per gestire link che non sono veri link.

poi, sempre se ho capito bene, vuoi che il sottomenu sia persistente anche se non ci tieni il cursore sopra.

questa roba si può fare con un semplice superfish orizzontale (ad es quello presente in fusion con questa aggiunta)
per fare in modo che i sottomenu rimangano "aperti" devi giocare di CSS facendo in modo che il sottomenu sia visibile quando la voce di menu genitore ha la classe active o active-trail

se vuoi costruirti un array del tuo menu come dici tu vedi questa soluzione: http://drupal.org/node/327252
con questo sistema puoi gestire completamente l'output anche se, sono d'accordo, è un po' ridondante visto che già lo fa drupal.

vedi anche http://drupal.org/project/superfish che forse ti offre una soluzione già pronta

Quote:
se ho capito bene il livello superiore non contiene veri link ma solo dei segnaposto per aprire il relativo sottomenu.
in questo caso ti serve un modulo come special_menu_items per gestire link che non sono veri link.

Lo scopo del menu è quello di raggruppare dei link a tutti i sitiweb del network, raggruppandoli cose fossero categorizzati:

  • Business -> blogB1 blogB2
  • Sport -> blogS1, blogS2
  • Leisure -> BlogL1, BlogL2, BlogL3
  • ...

E questo menu deve essere uguale per tutti i siti web del network. Per tale motivo parto dal presupposto che creare il menu con gli strumenti dell'interfaccia di drupal (menu) diventi una cosa laboriosa nel momento in cui devi fare dei cambiamenti, considerando che i siti sono tanti e tendono ad aumentare sempre +.

Quindi può essere che alcuni link del livello superiore siano dei segnaposto che aprono un sottomenu orizzontale, qualche altro magari può essre un link diretto ad un altro sitoweb.

Quote:
poi, sempre se ho capito bene, vuoi che il sottomenu sia persistente anche se non ci tieni il cursore sopra.

Si e No. se passi il cursore sopra ad un segnaposto (o ci clicchi sopra), si apre il sottomenu relativo, va li sul sotto menu clicchi sul link che ti porta verso un'altro sito web del network. Se ti allontani può benissimo richiudersi. Ma nulla vieta di lasciarlo aperto.

Quote:
se vuoi costruirti un array del tuo menu come dici tu vedi questa soluzione: http://drupal.org/node/327252
con questo sistema puoi gestire completamente l'output anche se, sono d'accordo, è un po' ridondante visto che già lo fa drupal.

Il mio problema è che il menu non dovrebbe essere creato all'interno del db di drupal, quindi non creato dall'interfaccia di amministrazione di drupal, per il motevo spiegato su. Mi serve generarlo in maniera indipendente, magari con una funzione in template.php richiamata in page.tpl.php

Quote:
vedi anche http://drupal.org/project/superfish che forse ti offre una soluzione già pronta

E' una soluzione già pronta sicuramente, maaaa ha sempre bisogno di un menu creato all'internod i drupal... mi pare.

Il menu deve essere uguale per ogni sito web ed in caso di cambiamenti deve essere facilmente gestibile. Quindi sono obbligato a non crearlo su ogni sito web del network, tramite l'interfaccia di drupal, semmai tramite una funzione in template.php come detto prima.

Ho risolto il problema.

Potete vedere il risultato in questo sito (che poi è uguale x tutti i siti al momento attivi):
http://snowblade.ejarvis.eu/

Praticamente, ho aggiunto un menu statico esterno a quelli di drupal, aggiungendolo all'interno del tema core con una funzione in php in template.php e aggiunta poi in page.tpl.php.

Questa soluzione non è che mi piace proprio tantissimo, però per il momento va bene.
Tra l'altro è una soluzione momentanea, perchè con l'arrivo di Drupal 7, il tema core qui realizzato per Dupral 6, non sarà più utilizzabile.

In ogni caso, sono partito da questa soluzione http://www.cssplay.co.uk/menus/pro_dropline.html presente nel sito suggerito da Gioppy. Grazie mille Gioppy, mi sei stata di grande aiuto :-D.

L'idea per Drupal 7 è di creare una customizzazione di Bartik da usare come tema core, quindi non so ancora cosa ci sarà in futuro. Spero qualcosa di buono.

Infine ho qualche problema con IE7 ma non per questo specifico menu che di per se funziona benissimo... ma per il Primary Links (li menu appena sotto) che con IE7 fa i capricci.