Ciao a tutti,
stò cercando di apportare delle modifiche su un codice php per rendere il menu con infiniti submenù la parte amministrativa sono riuscita a strutturarla è funziona il problema adesso viene sullo sviluppo della parte pubblica in quanto utilizzo smarty.
La funzione originale del codice è la seguente:
Codice PHP:
function smarty_function_menu ($params, $smarty) {
if (!isset($params['name'])) {
return 'The {menu} template plugin requires a "name" parameter to identify the menu to load.';
}
$smarty->CI->load->model('menu_manager/menu_model');
$menu = $smarty->CI->menu_model->get_menu_by_name($params['name']);
if (empty($menu)) {
return 'The "name" parameter you passed to {menu} (' . $params['name'] . ') is not associated with a menu. Menu load failed.';
}
// set default parameter for show_sub_menus
if (!isset($params['show_sub_menus'])) {
$params['show_sub_menus'] = 'yes';
}
// we have the menu
// get root level menu items
$links = $smarty->CI->menu_model->get_links(array('menu' => $menu['id'], 'parent' => '0'));
if (empty($links)) {
return 'There are no links in this menu (' . $menu['name'] . '). Go to your Menu Manager in the control panel and add more links.';
}
// we'll store menu_items here with main key "id" and keys "text", "url", "active", "class"
$menu_items = array();
$menu_children = array();
// parse parent links, which will in turn call child links if necessary
parse_links($menu_items, $menu_children, $links, $menu, $smarty, $params);
// sort through menu items and display the menu
$params['class'] = (isset($params['class'])) ? $params['class'] : '';
$params['id'] = (isset($params['id'])) ? $params['id'] : '';
$return = '<ul class="' . $params['class'] . '" id="' . $params['id'] . '">';
//
foreach ($menu_items as $id => $item) {
// do we have children?
$children_items = array();
if ($item['is_child'] == FALSE) {
if (isset($menu_children[$id])) {
foreach ($menu_children[$id] as $key) {
$item_child = $menu_items[$key];
if (!empty($menu_items[$key])) {
// set parent active if it's child is active
if ($item_child['active'] == TRUE) {
//$item['active'] = TRUE;
}
$children_items[] = li_html($item_child);
}
}
}
}
if ($item['is_child'] == FALSE) {
$classes = (!empty($children_items)) ? array('current') : array();
$return .= li_html($item, $children_items, $classes);
}
}
$return .= '[/list]';
return $return;
}
Ho provato ad appartare la seguente modifica:
Codice PHP:
function smarty_function_menu ($params, $smarty) {
// check params
if (!isset($params['name'])) {
return 'The {menu} template plugin requires a "name" parameter to identify the menu to load.';
}
$smarty->CI->load->model('menu_manager/menu_model');
$menu = $smarty->CI->menu_model->get_menu_by_name($params['name']);
if (empty($menu)) {
return 'The "name" parameter you passed to {menu} (' . $params['name'] . ') is not associated with a menu. Menu load failed.';
}
// set default parameter for show_sub_menus
if (!isset($params['show_sub_menus'])) {
$params['show_sub_menus'] = 'yes';
}
// we have the menu
// get root level menu items
$links = $smarty->CI->menu_model->get_links(array('menu' => $menu['id'], 'parent' => '0'));
if (empty($links)) {
return 'There are no links in this menu (' . $menu['name'] . '). Go to your Menu Manager in the control panel and add more links.';
}
// we'll store menu_items here with main key "id" and keys "text", "url", "active", "class"
$menu_items = array();
$menu_children = array();
// parse parent links, which will in turn call child links if necessary
parse_links($menu_items, $menu_children, $links, $menu, $smarty, $params);
// sort through menu items and display the menu
$params['class'] = (isset($params['class'])) ? $params['class'] : '';
$params['id'] = (isset($params['id'])) ? $params['id'] : '';
$return = '<ul class="' . $params['class'] . '" id="' . $params['id'] . '">';
//
foreach ($menu_items as $id => $item) {
// do we have children?
$children_items = array();
if ($item['is_child'] == FALSE) {
if (isset($menu_children[$id])) {
foreach ($menu_children[$id] as $key) {
$item_child = $menu_items[$key];
if (!empty($menu_items[$key])) {
// set parent active if it's child is active
if ($item_child['active'] == TRUE) {
//$item['active'] = TRUE;
}
$children_items[] = li_html($item_child);
}
}
}
}
if ($item['is_child'] == FALSE) {
$classes = (!empty($children_items)) ? array('current') : array();
$return .= li_html($item, $children_items, $classes);
}
/* CLONATE PART FOR MENU LEVEL */
$links2 = $smarty->CI->menu_model->get_links(array('menu' => $menu['id'], 'parent' => $key));
$menu_items2 = array();
$menu_children2 = array();
// parse parent links, which will in turn call child links if necessary
parse_links($menu_items2, $menu_children2, $links2, $menu, $smarty, $params);
foreach ($menu_items2 as $id2 => $item2) {
$children_items2 = array();
if ($item2['is_child'] == FALSE) {
if (isset($menu_children2[$id])) {
foreach ($menu_children2[$id] as $key2) {
$item_child2 = $menu_items2[$key2];
if (!empty($menu_items2[$key2])) {
// set parent active if it's child is active
if ($item_child2['active'] == TRUE) {
//$item['active'] = TRUE;
}
$children_items[] = li_html($item_child2);
}
}
}
}
if ($item2['is_child'] == FALSE) {
$classes2 = (!empty($children_items2)) ? array('current') : array();
$return .= li_html($item2, $children_items2, $classes2);
}
}
/* ENDCLONATE PART FOR MENU LEVEL */
}
$return .= '[/list]';
return $return;
}
Soltanto che mi limita il dump ad un solo livello e non mi visualizza in serie il 3 menù
Qualcuno di voi sa darmi un idea oppure aiutarmi sulla modifica del seguente codice in modo tale che i menù (sub) siano recursivi?
Grazie
Marko