Modello di costruzione del menu

9

Ho problemi a capire come gestire un menu quando il menu non è utilizzato per il routing.

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

Ora, molti framework PHP hanno classi di router che gestiscono il routing. Sembra una buona separazione dal momento che un Menu non dovrebbe essere a conoscenza del POST || OPZIONI || ... richieste.

Ma quando ho scritto il frontend mi sono trovato a dover codificare il menu. O memorizzare tutto nel DB e passare quei valori a una vista. Quello che non mi piace di questo approccio è che si sta 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 è bello. Ma Menu dipende molto da Route per impostare il suo stato attivo. Il menu dovrà anche conoscere la gerarchia per impostare la traccia attiva.

Quindi sì, impostare la traccia attiva e le classi di stato attive sono in realtà una cosa da vedere. Ma avendo

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

ovunque le tue opinioni sembrano stupide. Quindi aggiungi tutte quelle fastidiose tracce attive se è ed è davvero gonfio. Gestirlo prima che la vista abbia i rendering e impostare un flag di traccia attiva su true sembra così brutto come faccio io a sapere (un ciclo foreach su tutti i bambini che passano su tutti i bambini, ...)

La mia domanda è:

C'è un modello o un modo intelligente per ottenere questo pulitore, meglio, ...? Come si dovrebbe gestire il "problema" della pista attiva?

Stavo pensando di renderizzare child - > genitore. Quindi inizia con l'annuncio al livello più profondo e poi prosegui verso l'alto. Ma poi il bambino sa del suo genitore, ma il genitore non sa nulla dei suoi figli (sembra strano).

    
posta Pinoniq 04.08.2014 - 11:05
fonte

1 risposta

1

when the menu isn't used for routing

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

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

Se rendi le tue opinioni responsabili del tracciamento dello stato attivo non separi le preoccupazioni. I punti di vista dovrebbero fare qualsiasi cosa per cui sono fatti - ma non è necessario che gestiscano anche il loro stato del menu. I metadati del menu di solito sono uguali a quelli dell'applicazione e hai solo bisogno del percorso per essere in grado di localizzarti e visualizzare il menu.

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

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

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

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

  1. Il tuo database non ha bisogno di gestire i dati, che puoi fornire su runtime a costi contenuti
  2. Avrai il tuo menu (meta) in un unico posto che lo rende gestibile
  3. Se vuoi che il tuo menu si basi completamente su 1: 1 sui tuoi percorsi, puoi ottenerlo fornendo meta del menu in modo dinamico
  4. Se il contenuto cresce (e quindi il menu) puoi spostare questi dati nella sessione che potrebbe essere scritta in un archivio di valori a chiave rapida
risposta data 20.11.2016 - 09:24
fonte

Leggi altre domande sui tag