2009-03-05 9 views
9

Quiero mostrar un menú en cada página que se ejecuta desde una base de datos. Usar php sucio y sucio es fácil, pero quiero integrarlo con cakephp usando su sistema MVC. Ahora mi pregunta es ¿cuál es la mejor manera de hacerlo?¿Cuál es la mejor manera de crear menús dinámicos basados ​​en bases de datos en CakePHP?

Mi idea es hacer un elemento con el diseño y luego un componente o controlador para toda la lógica. Alguna sugerencia sobre esto? ¿O es un Ayudante lo que quiero usar?

También necesito obtener todos los datos de varias tablas en la base de datos. ¿Es mejor hacer toda mi lógica de recopilación de datos a través de un modelo? ¿O lo hace en su mayoría en el controlador de menú (o componente) y usa los modelos para cada mesa?

Gracias,

Walter

Respuesta

7

modelos deben extraer y procesar datos de la tabla que se modelización, por lo que obtener los datos de menú para cada modelo en ese modelo.

Los componentes están destinados a albergar la lógica compartida por varios controladores, por lo que un componente de menú utilizado por todos sus controladores parece un buen lugar para colocar el código para obtener los datos del menú de los modelos y mezclarlos.

Un menú es típicamente una lista anidada, si este es el caso también con su menú, la forma más fácil de generar el marcado es una función recursiva (una función que se llama) que produce un nivel a la vez, así que en lugar de un elemento, simplemente crearía un ayudante con un método de menú() y lo llamaría directamente desde el diseño.

4

Estoy de acuerdo con la respuesta de Neilcrooks, pero me gustaría agregar algunas cosas para mayor claridad.

Los ayudantes y los elementos son bastante simples, excepto que los ayudantes pueden ser un poco más robustos (al menos, así es como pienso en ellos;)). Por lo tanto, si usa un ayudante, puede vincular y desvincular asociaciones de modelos sobre la marcha, lo que le permitirá tomar datos de sus modelos (temporalmente) asociados.

Personalmente, me gustan los modelos gordos y los controladores delgados, así que creo que si estuviera en esta situación, usaría un ayudante y uniría temporalmente los modelos. Se accederá a todos los datos que necesito obtener de los modelos existentes a través de las llamadas de tipo Model1-> fetchMenuPart (...).

Luego puede llamar a su ayudante desde su (s) archivo (s) de diseño.

0

Creo que usaría crear un elemento que contendría el html para el menú y luego mostrar el menú en su diseño.

echo $this->element('your menu'); 

Para que sea dinámico, configura los enlaces del menú, tal vez como una matriz en el controlador.

1

No sé por qué esto no está documentado en ninguna parte, pero acabo de encontrar esto anoche. Las variables para su diseño o elementos deben definirse con la terminación _for_layout. Por ejemplo: $ this-> set ('categories_for_layout', $ this-> Category-> find ('all'));

Utilicé el método beforeFilter en la clase AppController, porque necesitaba ese menú en cada página.

Cuestiones relacionadas