'y']; if (isset($params['params'])) { $params = array_merge($params, $params['params']); unset($params['params']); } $params = array_merge($default, $params); extract($params, EXTR_SKIP); if (empty($link_on_section) || $link_on_section == 'y') { $smarty->assign('link_on_section', 'y'); } else { $smarty->assign('link_on_section', 'n'); } if (empty($translate)) { $translate = 'y'; } $smarty->assignByRef('translate', $translate); if (empty($menu_cookie)) { $menu_cookie = 'y'; } $smarty->assignByRef('menu_cookie', $menu_cookie); if (empty($bs_menu_class)) { $bs_menu_class = ''; } $smarty->assignByRef('bs_menu_class', $bs_menu_class); list($menu_info, $channels) = get_menu_with_selections($params); $smarty->assign('menu_channels', $channels['data']); $smarty->assign('menu_info', $menu_info); $objectCategories = TikiLib::lib('categ')->get_current_object_categories(); if ($objectCategories) { $categGroups = array_values( array_filter( array_map( function ($categId) { $categ = TikiLib::lib('categ')->get_category($categId); $parent = TikiLib::lib('categ')->get_category($categ["parentId"]); if (! $parent || $parent["parentId"] != 0 || ! $parent["tplGroupContainerId"]) { return null; } $templatedgroupid = TikiLib::lib('attribute')->get_attribute("category", $categId, "tiki.category.templatedgroupid"); $tplGroup = TikiLib::lib('user')->get_groupId_info($templatedgroupid); if (empty($tplGroup['groupName'])) { return null; } return [$parent["tplGroupContainerId"] => $tplGroup['groupName']]; }, $objectCategories ), function ($group) { return $group != null; } ) ); } else { $categGroups = []; } if (isset($params['bootstrap']) && $params['bootstrap'] !== 'n' && $prefs['javascript_enabled'] === 'y') { $structured = []; // Unification with structure menus - adds sectionLevel if (empty($menu_info['structure'])) { $channels['data'] = add_section_levels_to_menu_data($channels['data']); } // Builds Menus nested tree of options foreach ($channels['data'] as $element) { $attribute = TikiLib::lib('attribute')->get_attribute('menu', $element["optionId"], 'tiki.menu.templatedgroupid'); if ($attribute && $catName = $categGroups[$attribute]) { $element["name"] = str_replace("--groupname--", $catName, $element["name"]); $element["url"] = str_replace("--groupname--", $catName, $element["name"]); $element["sefurl"] = str_replace("--groupname--", $catName, $element["sefurl"]); $element["canonic"] = str_replace("--groupname--", $catName, $element["canonic"]); } elseif ($attribute && ! $categGroups[$attribute]) { continue; } if ($element['type'] !== '-') { $level = $element['sectionLevel']; // Creates new branch at level 0 if ($level === 0) { array_push($structured, $element); continue; } // Always selects last branch at level 0 $branch = &$structured[count($structured) - 1]; // Selects nested part of the branch at element level for ($i = 0; $i < $level - 1; $i++) { if ($branch['children']) { $branch = &$branch['children'][count($branch['children']) - 1]; } } // Pushes the element at the end of selected element children. if (! empty($branch['children'])) { array_push($branch['children'], $element); } else { $branch['children'] = [$element]; } } } $smarty->assign('list', $structured); return $smarty->fetch('bootstrap_menu.tpl'); } if ($params['css'] !== 'n' && $prefs['feature_cssmenus'] == 'y') { static $idCssmenu = 0; if (! isset($css_id)) {//adding $css_id parameter to customize menu id and prevent automatic id renaming when a menu is removed $smarty->assign('idCssmenu', $idCssmenu++); } else { $smarty->assign('idCssmenu', $css_id); } if (empty($params['type'])) { $params['type'] = 'vert'; } $smarty->assign('menu_type', $params['type']); if (! empty($drilldown) && $drilldown == 'y') { $smarty->assign('drilldownmenu', 'y'); } $tpl = 'tiki-user_cssmenu.tpl'; } else { $tpl = 'tiki-user_menu.tpl'; } $data = $smarty->fetch($tpl); return MenuLib::clean_menu_html($data); } function compare_menu_options($a, $b) { return strcmp(tra($a['name']), tra($b['name'])); } function get_menu_with_selections($params) { global $user, $prefs; $tikilib = TikiLib::lib('tiki'); $menulib = TikiLib::lib('menu'); $cachelib = TikiLib::lib('cache'); $cacheName = isset($prefs['mylevel']) ? $prefs['mylevel'] : 0; $cacheName .= '_' . $prefs['language'] . '_' . md5(implode("\n", $tikilib->get_user_groups($user))); extract($params, EXTR_SKIP); if (isset($structureId)) { $cacheType = 'structure_' . $structureId . '_'; } else { $cacheType = 'menu_' . $id . '_'; } if ($cdata = $cachelib->getSerialized($cacheName, $cacheType)) { list($menu_info, $channels) = $cdata; } elseif (! empty($structureId)) { $structlib = TikiLib::lib('struct'); if (! is_numeric($structureId)) { $structureId = $structlib->get_struct_ref_id($structureId); } $channels = $structlib->build_subtree_toc($structureId); $structure_info = $structlib->s_get_page_info($structureId); $channels = $structlib->to_menu($channels, $structure_info['pageName'], 0, 0, $params); $menu_info = ['type' => 'd', 'menuId' => $structureId, 'structure' => 'y']; } elseif (! empty($id)) { $menu_info = $menulib->get_menu($id); $channels = $menulib->list_menu_options($id, 0, -1, 'position_asc', '', '', isset($prefs['mylevel']) ? $prefs['mylevel'] : 0); $channels = $menulib->sort_menu_options($channels); } else { return 'menu function: Menu or Structure ID not set'; } if (strpos($_SERVER['SCRIPT_NAME'], 'tiki-register') === false) { $cachelib->cacheItem($cacheName, serialize([$menu_info, $channels]), $cacheType); } if (! isset($setSelected) || $setSelected !== 'n') { $channels = $menulib->setSelected($channels, isset($sectionLevel) ? $sectionLevel : '', isset($toLevel) ? $toLevel : '', $params); } foreach ($channels['data'] as & $item) { if (! empty($menu_info['parse']) && $menu_info['parse'] === 'y') { $item['block'] = TikiLib::lib('parser')->contains_html_block($item['name']); // Only used for CSS menus $item['name'] = preg_replace('/(.*)\n$/', '$1', $item['name']); // parser adds a newline to everything } } return [$menu_info, $channels]; } function add_section_levels_to_menu_data($data) { $sectionLevel = 0; $prev_type = null; $new_data = array_map(function ($menu_item) use (&$sectionLevel, &$prev_type) { if ($menu_item['type'] === 's') { $sectionLevel = 0; } elseif (($prev_type === 's' || is_numeric($prev_type)) && $menu_item['type'] === 'o') { $sectionLevel++; } elseif ($menu_item['type'] === '-') { if ($sectionLevel - 1 >= 0) { $sectionLevel--; } } elseif (is_numeric($menu_item['type'])) { $sectionLevel = (int)$menu_item['type']; } $prev_type = $menu_item['type']; $menu_item['sectionLevel'] = $sectionLevel; return $menu_item; }, $data); return $new_data; }