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#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.
# 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
function _exectueQuery($sql, $values) {
global $db;
$subsel = $db->prepare($sql);
return $subsel->execute($values);
}
function getParentMenus() {
$sql = "SELECT id, link, title, level FROM menu ORDER BY title";
#Ejecutamos la consulta y obtenedremos todos los menús padres
return _exectueQuery($sql, $data);
}
function getChildMenus($item) {
$sql = "SELECT id, link, title, level FROM menu WHERE id_parent = :parent ORDER BY title";
#Ejecutamos la consulta y obtenedremos todos los menús hijos
return _exectueQuery($sql, $data);
}
# Esta función te retorna el menú ya construido
function getMenus()
{
$html = '';
# Conseguimos los menús padres
$menus = getParentMenus();
#Primero recorremos los menus padres para colocarlos dentro del menu
$html .= createsMenu($menus);
return $html;
}
# 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.
function createsMenu($menus, $color = '')
{
# Tendrás que pasar como parametro el color del menú para poder hacerlo dinámico
$html = '<ul id="' . $color . '"class="treeview-' . $color . '">';
foreach ($menus as $menu) {
#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
#Creamos la primera lista pero no lo cerramos todavía
# Comprobamos si el actual menú tiene hijos
$childs = getChildMenus($menu['id']);
# Si los tiene, los recorremos para imprimirlos dentro del menú en curso, de lo contrario, cerramos <li></li>
$html .= count($childs) > 0? createsMenu
($childs) : '</li>'; }
# Cerramos la lista si ya no hay más registros
$html .= '</ul>';
return $html;
}
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:
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.