Modèle de construction de menu

9

J'ai du mal à me familiariser avec la gestion de l'état actif d'un menu lorsque le menu n'est pas utilisé pour le routage.

Je viens de Drupal où le système de menus gère également le routage. ainsi, la définition de l'état actif et de l'état de la piste active est gérée par l'itinéraire (qui agit également comme un système de rendu de menu).

Maintenant, beaucoup de frameworks PHP ont des classes de routeur qui gèrent le routage. Cela semble une bonne séparation car un menu ne devrait pas être au courant de POST || OPTIONS || ... demandes.

Mais lors de l'écriture du frontend, je me suis retrouvé à coder dur le menu. Ou tout stocker dans la base de données et transmettre ces valeurs à une vue. Ce que je n'aime pas, c'est que vous créez en quelque sorte une copie de ce que vous avez déjà écrit dans votre routeur, mais que vous utilisez maintenant la classe Menu.

Un exemple:

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

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

Vous séparez les préoccupations ici, donc c'est bien. Mais le menu dépend fortement de Route pour définir son état actif. Le menu devra également connaître la hiérarchie pour définir la piste active.

Alors oui, la définition de la piste active et des classes de statut actives est en fait une chose à voir. Mais ayant

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

partout, vos vues semblent stupides. Ensuite, ajoutez tous ces si actifs-si ennuyeux et c'est un vrai ballonnement. Gérer cela avant que la vue ne soit rendue et définir un indicateur de piste active sur vrai semble si moche que je le sache (une boucle foreach sur tous les enfants qui boucle sur tous les enfants, ...)

Ma question est:

Existe-t-il un modèle ou un moyen intelligent pour obtenir ce plus propre, mieux, ...? Comment gérer le «problème» de la piste active?

Je pensais rendre enfant -> parent. Commencez donc avec l'annonce au niveau le plus profond, puis montez. Mais alors l'enfant connaît son parent mais le parent ne sait rien de ses enfants (semble bizarre).

Pinoniq
la source

Réponses:

1

lorsque le menu n'est pas utilisé pour le routage

Je dirais que le routage peut être utilisé pour le menu.


Comme vous l'avez déjà souligné, le routeur serait un bon endroit pour se connecter. Je ne pense pas qu'il serait moche d'utiliser un crochet qui évalue la méta du menu pour la page en cours à chaque demande.

Si vous rendez vos opinions responsables du suivi de l'état actif, vous ne séparez pas les préoccupations. Les vues doivent faire ce pour quoi elles sont faites - mais il n'est pas nécessaire qu'elles gèrent également leur état de menu. Les métadonnées du menu sont généralement les mêmes pour toute l'application et vous n'avez besoin que de l'itinéraire pour pouvoir vous localiser et rendre le menu.

Selon votre routeur et vos besoins, une fonction ou une classe simple qui prend des métadonnées de menu statiques et l'itinéraire actuel suffiraient pour fournir toutes les informations dont vous avez besoin par la suite.

La méta de menu elle-même ne doit pas nécessairement être un objet. Une structure de données de valeur clé simple sans méthodes devrait suffire dans la plupart des cas.

Le crochet peut créer un objet d'état avec certaines fonctionnalités courantes liées à votre menu, comme le fil d'Ariane, la profondeur, la page parent ou la page actuelle et faire connaître cet objet dans le contexte de votre demande http. Vous avez différentes possibilités à l'intérieur du crochet - mais il s'agit généralement de collecter, de préparer et de transmettre les données nécessaires à quelque chose qui sait comment les traiter.

Cette approche s'adapte à vos besoins et présente quelques avantages:

  1. Votre base de données n'a pas besoin de traiter les données que vous pouvez fournir à l'exécution à faible coût
  2. Vous aurez votre menu (méta) en un seul endroit, ce qui le rend maintenable
  3. Si vous voulez que votre menu repose entièrement sur 1: 1 sur vos itinéraires, cela peut être réalisé en fournissant un menu méta dynamiquement
  4. Si votre contenu se développe (et donc le menu), vous pouvez déplacer ces données dans la session qui pourrait être écrite dans un magasin de valeurs de clé rapide
dahrens
la source