You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

248 lines
9.4 KiB

<?php
// (c) Copyright by authors of the Tiki Wiki CMS Groupware Project
//
// All Rights Reserved. See copyright.txt for details and a complete list of authors.
// Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details.
// $Id$
/* params
* - link_on_section
* - css = use suckerfish menu
* - type = vert|horiz
* - id = menu ID (mandatory)
* - translate = y|n , n means no option translation (default y)
* - menu_cookie=y|n (default y) n, it will automatically open the submenu the url is in
* - bs_menu_class='' custom class for the top level bootstrap menu element
* - sectionLevel: displays from this level only
* - toLevel : displays to this level only
* - drilldown ??
* - bootstrap : navbar|basic (equates to horiz or vert in old menus)
* - setSelected=y|n (default=y) processes all menu items to show currently selected item, also sets open states, sectionLevel, toLevel etc
* so menu_cookie, sectionLevel and toLevel will be ignored if this is set to n
*/
function smarty_function_menu($params, $smarty)
{
global $prefs;
$default = ['css' => '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 '<span class="alert-warning">menu function: Menu or Structure ID not set</span>';
}
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;
}