2009-03-05 8 views
9

Je souhaite afficher un menu sur chaque page exécutée à partir d'une base de données. Utilisation juste en bas et php sale c'est facile mais je veux l'intégrer avec cakephp en utilisant leur système MVC. Maintenant, ma question est comment est la meilleure façon de faire à ce sujet? Mes pensées sont de faire un élément avec la mise en page, puis un composant ou un contrôleur pour toute la logique. Des suggestions à ce sujet? Ou est un assistant que je veux utiliser?Quelle est la meilleure façon de créer des menus dynamiques pilotés par base de données dans CakePHP?

J'ai également besoin de toutes les données de plusieurs tables dans la base de données. Est-il préférable de faire toute ma logique de collecte de données à travers un seul modèle? Ou en faire la plupart dans le contrôleur de menu (ou le composant) et utiliser les modèles pour chaque table?

Merci,

Walter

Répondre

7

Les modèles doivent chercher et traiter les données de la table qu'ils sont modélisant, donc récupérer les données de menu pour chaque modèle dans ce modèle. Les composants sont destinés à loger la logique partagée par plusieurs contrôleurs, de sorte qu'un composant de menu utilisé par tous vos contrôleurs semble être un bon endroit pour placer le code pour extraire les données de menu des modèles et les écraser ensemble. Un menu est généralement une liste imbriquée, si c'est aussi le cas avec votre menu, la façon la plus simple d'afficher le balisage est une fonction récursive (une fonction qui s'appelle elle-même) qui sort un niveau à la fois, donc plutôt qu'un élément, je créerais simplement une aide avec une méthode de menu() dedans, et j'appellerais cela directement de la disposition.

4

Je suis d'accord avec neilcrooks réponse, mais je voudrais ajouter quelques éléments pour plus de clarté.

Les aides et les éléments sont assez simples, sauf que les aides peuvent être un peu plus robustes (du moins, c'est comme ça que je pense à eux;)). Ainsi, si vous utilisez une aide, vous pouvez lier et dissocier des associations de modèles à la volée - ce qui vous permettra d'extraire des données de vos modèles (temporairement) associés.

Personnellement, j'aime les gros modèles et les contrôleurs minces, donc je pense que si j'étais dans cette situation, j'utiliserais un assistant et lier temporairement les modèles. Toutes les données que je dois extraire des modèles existants seront accessibles via les appels de type Model1-> fetchMenuPart (...). Ensuite, vous pouvez appeler votre assistant à partir de votre (vos) fichier (s) de mise en page.

0

Je pense que vous utiliseriez créer un élément qui contiendrait le html pour le menu, puis rendrait le menu dans votre mise en page. Pour le rendre dynamique, vous définissez les liens de menu, peut-être sous forme de tableau dans le contrôleur.

1

Je ne sais pas pourquoi cela n'est documenté nulle part, mais je viens de le trouver la nuit dernière. Les variables pour votre mise en page ou vos éléments doivent être définies avec la fin _for_layout. Par exemple: $ this-> set ('categories_for_layout', $ this-> Category-> find ('all'));

J'ai utilisé la méthode beforeFilter dans la classe AppController, car j'avais besoin de ce menu dans chaque page.

Questions connexes