Modello di costruzione del menu


9

Ho problemi a orientarmi nella gestione dello stato attivo di un menu quando il menu non viene utilizzato per il routing.

Vengo da Drupal, dove anche il sistema di menu gestisce il routing. pertanto l'impostazione dello stato attivo e dello stato di traccia attiva viene gestita dal percorso (che funge anche da sistema di rendering dei menu).

Ora, molti framework PHP hanno classi Router che gestiscono il routing. Questa sembra una buona separazione poiché un menu non dovrebbe essere a conoscenza di POST || OPZIONI || ... richieste.

Ma quando ho scritto il frontend, mi sono trovato a scrivere codice nel menu. O archiviando tutto nel DB e passando quei valori a una vista. Quello che non mi piace di questo approccio è che stai creando una copia di ciò che hai già scritto nel tuo router ma ora usando la classe Menu.

Un esempio:

Route::get('/somewhere','routename.somewhere','showStuffController');
Route::post('/somewhere','routename.somewhere','saveStuffController');

Menu::add('label.somewhere','routename.somewhere');

Stai separando le preoccupazioni qui, quindi è carino. Ma Menu dipende fortemente da Route per impostare il suo stato attivo. Il menu dovrà anche conoscere la gerarchia per impostare active-trail.

Quindi sì, impostare la traccia attiva e le classi di stato attivo è in realtà una cosa di vista. Ma avendo

if ( Route::currentName() === $menuitem->getRouteName() ) { print 'active'; }

dappertutto le tue opinioni sembrano stupide. Quindi aggiungi tutti quei fastidiosi if attivi ed è un vero e proprio gonfiore. Gestire che prima che la vista venga renderizzata e impostare una flag di traccia attiva su true sembra così brutto come lo so io (una foreach che si ripercuote su tutti i bambini che si sovrappongono a tutti i bambini, ...)

La mia domanda è:

C'è un modello o un modo intelligente per ottenere questo più pulito, migliore, ...? Come si dovrebbe gestire il 'problema' active-trail?

Stavo pensando di rendere figlio -> genitore. Quindi inizia con l'annuncio al livello più profondo e poi sali su. Ma poi il bambino conosce il suo genitore ma il genitore non sa nulla dei suoi figli (sembra strano).

Risposte:


1

quando il menu non è utilizzato per il routing

Direi che il routing può essere utilizzato per il menu.


Come hai già sottolineato, il router sarebbe un bel posto da agganciare. Non credo che sarebbe brutto usare un hook che valuti la meta menu per la pagina corrente su ogni richiesta.

Se rendi le tue opinioni responsabili del monitoraggio dello stato attivo, non devi separare le preoccupazioni. Le viste dovrebbero fare tutto ciò per cui sono state create, ma non è necessario che gestiscano anche il loro stato di menu. I metadati del menu sono generalmente uguali a livello di applicazione e hai solo bisogno del percorso per poterti localizzare e renderizzare il menu.

A seconda del router e delle tue esigenze, una semplice funzione o classe che accetta alcuni metadati del menu statico e il percorso corrente sarebbe sufficiente per fornire tutte le informazioni necessarie in seguito.

Il meta menu stesso non deve necessariamente essere un oggetto. Nella maggior parte dei casi dovrebbe essere sufficiente una semplice struttura di dati valore-chiave senza metodi.

L'hook potrebbe creare un oggetto stato con alcune funzionalità comuni relative al tuo menu, come breadcrumb, profondità, pagina principale o pagina corrente e rendere noto questo oggetto nel contesto della tua richiesta http. Hai diverse possibilità all'interno dell'hook - ma generalmente si tratta di raccogliere, preparare e trasmettere i dati necessari a qualcosa che sa come gestirli.

Questo approccio si adatta alle tue esigenze e presenta alcuni vantaggi:

  1. Non è necessario che il tuo database gestisca i dati, che puoi fornire in fase di esecuzione con costi bassi
  2. Avrai il tuo menu (meta) in un posto che lo rende mantenibile
  3. Se vuoi che il tuo menu faccia completamente affidamento 1: 1 sui tuoi percorsi, puoi ottenerlo fornendo meta menu dinamicamente
  4. Se il contenuto aumenta (e quindi il menu) è possibile spostare questi dati nella sessione che potrebbero essere scritti in un archivio valori chiave veloce
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.