Ver Mensaje Individual
  #4 (permalink)  
Antiguo 11/04/2017, 08:00
Avatar de vb2005
vb2005
 
Fecha de Ingreso: noviembre-2005
Ubicación: Paderborn - Alemania
Mensajes: 568
Antigüedad: 19 años, 1 mes
Puntos: 25
Respuesta: Menú dinamico en mvc

Cita:
Iniciado por Triby2 Ver Mensaje
Las almas estás pero quizás no en el momento cuando las necesitamos jejejeje

Tu problema es que aún no estás concibiendo el funcionamiento del patrón MVC. Desde las vistas no se llaman a las funciones, ni tienen lógica incrustada. Eso se realiza desde los controladores y desde ahí se pasan los resultados a las vistas, que por eso lo llaman "vista".

Después tienes que obtener primero todos los menús padres, recorrerlos y conseguir de cada uno los hijos para imprimirlos y ya.

Yo lo haría de este modo:

Código PHP:
Ver original
  1. #El siguiente código se debe de colocar en el controlador correspondiente dentro de la función que le corresponda que en este caso podría ser index() dentro del HomeController por poner un ejemplo de controlador.
  2.  
  3. # Primero, creo una función para ejecutar todas mis consultas a la base de datos, recuerda la siguiente norma: una función ha de contener UNA sola función, de este modo, consigues, además, poder reutilizar el mismo código sin tener que repetir una y otra vez las mismas lineas por cada consulta
  4. function _exectueQuery($sql, $values) {
  5.     global $db;
  6.     $subsel = $db->prepare($sql);
  7.  
  8.     return $subsel->execute($values);
  9. }
  10.  
  11. function getParentMenus() {
  12.     $sql = "SELECT id, link, title, level FROM menu ORDER BY title";
  13.  
  14.     #Ejecutamos la consulta y obtenedremos todos los menús padres
  15.    return _exectueQuery($sql, $data);
  16. }
  17.  
  18. function getChildMenus($item) {
  19.     $sql = "SELECT id, link, title, level FROM menu WHERE id_parent = :parent ORDER BY title";
  20.  
  21.     #Ejecutamos la consulta y obtenedremos todos los menús hijos
  22.    return _exectueQuery($sql, $data);
  23. }
  24.  
  25. # Esta función te retorna el menú ya construido
  26. function getMenus()
  27. {
  28.     $html = '';
  29.     # Conseguimos los menús padres
  30.    $menus = getParentMenus();
  31.  
  32.     #Primero recorremos los menus padres para colocarlos dentro del menu
  33.    $html .= createsMenu($menus);
  34.  
  35.     return $html;  
  36. }
  37.  
  38. # Y aquí la función de recursividad, donde consultará todos los niveles habidos y por haber dentro de una matriz multidimensional o en tu caso, los menús.
  39. function createsMenu($menus, $color = '')
  40. {  
  41.     # Tendrás que pasar como parametro el color del menú para poder hacerlo dinámico
  42.    $html = '<ul id="' . $color . '"class="treeview-' . $color . '">';
  43.  
  44.     foreach ($menus as $menu) {
  45.         #NO entiendo la parte de tu código ($i['level'] -1), si el valor de level es 0, no puede ser -0. Por eso lo dejé como lo hago ahora
  46.  
  47.         #Creamos la primera lista pero no lo cerramos todavía
  48.        $html .= '<li class="menucolor-' . $color . '"><a href="' . htmlspecialchars($menu['link']) . '">' . htmlspecialchars($menu['title']) . '</a>';
  49.  
  50.         # Comprobamos si el actual menú tiene hijos
  51.        $childs = getChildMenus($menu['id']);
  52.  
  53.         # Si los tiene, los recorremos para imprimirlos dentro del menú en curso, de lo contrario, cerramos <li></li>
  54.        $html .= count($childs) > 0? createsMenu($childs) : '</li>';
  55.     }
  56.  
  57.     # Cerramos la lista si ya no hay más registros
  58.    $html .= '</ul>';
  59.  
  60.     return $html;
  61. }

Una vez que tengas toda la lógica en el controlador, cuando llames a la vista pasandole el parámetro $html tendrías que tener algo como:
Código HTML:
Ver original
  1. <!DOCTYPE html>
  2.     <title>Tu app</title>
  3. </head>
  4.     <nav><?=$html ?></nav>
  5.  
  6. </body>
  7. </html>

Como ves, no he hecho uso de ninguna lógica de php para obtener el resultado, solo le paso el parametro a la vista ya.

Espero que te sirva en un futuro, he decidido darte esta pequeña clase, ya que otros no han sabido aplicar bien las explicaciones por entregarles pseudo-codigo a algiuen que está comenzando. Así te lo entrego de una vez, lo aprendes y ya no se te va a olvidar.

OJO! No lo he probado pero debería de funcionarte, si algo te sale mal, te garantizo que el fallo te saldrá dentro de la función createsMenu(); es muy probable que me haya podido confundir en los lugares que imprimo cada sección del html.
Es un error de concepto que tu "controlador" genere código html

No hay que confundir la lógica a hacer un loop en un array de elementos para generar una lista de elementos en html.

Es totalmente correcto hacer un for dentro de la vista para imprimir asi los elementos.

Tu código tiene todo acumulado en un sólo método que lo hace todo, ese no es el objetivo de MVC
__________________
www.marcher.com.uy - Web personal
Nerd's Corner - Desarrollo de software a medida