/** * Form top menu * * @param array $top_menu top menu data from the database * @param int $level current menu level * @param boolean $active - menu item active flag, returned by reference to set tree branch as active * @return array formed top menu */ function fn_top_menu_form($top_menu, $level = 0, &$active = NULL) { $_active = false; foreach ($top_menu as $k => $v) { if (!empty($v['param_3'])) { // get extra items list($type, $id, $use_name) = fn_explode(':', $v['param_3']); if ($type == 'C') { // categories $cats = fn_get_categories_tree($id, true); $v['subitems'] = fn_array_merge(fn_top_menu_standardize($cats, 'category_id', 'category', 'subcategories', 'categories.view?category_id='), !empty($v['subitems']) ? $v['subitems'] : array(), false); if ($use_name == 'Y' && !empty($id)) { $v['descr'] = fn_get_category_name($id); $v['param'] = 'categories.view?category_id=' . $id; } } elseif ($type == 'A') { // pages $params = array('from_page_id' => $id, 'get_tree' => 'multi_level', 'status' => 'A'); list($pages) = fn_get_pages($params); $v['subitems'] = fn_array_merge(fn_top_menu_standardize($pages, 'page_id', 'page', 'subpages', 'pages.view?page_id='), !empty($v['subitems']) ? $v['subitems'] : array(), false); if ($use_name == 'Y' && !empty($id)) { $page_data = fn_get_page_data($id); $v['descr'] = $page_data['page']; $v['param'] = !empty($page_data['link']) ? $page_data['link'] : 'pages.view?page_id=' . $id; } } else { // for addons fn_set_hook('top_menu_form', $v, $type, $id, $use_name); } } if (!empty($v['param']) && fn_top_menu_is_current_url($v['param'], $v['param_2'])) { $top_menu[$k]['active'] = true; // Store active value $_active = true; } if (!empty($v['subitems'])) { $top_menu[$k]['subitems'] = fn_top_menu_form($v['subitems'], $level + 1, $active); // If active status was returned fron children if ($active) { $top_menu[$k]['active'] = $active; // Strore fo return and reset activity status for athother elements on this level // Because in one level may be only one active item $_active = true; $active = false; } } $top_menu[$k]['item'] = $v['descr']; $top_menu[$k]['href'] = $v['param']; $top_menu[$k]['level'] = $level; unset($top_menu[$k]['descr'], $top_menu[$k]['param']); } $active = $_active; return $top_menu; }
/** * Form top menu * * @param array $top_menu Top menu data from the database * @param int $level Current menu level * @param boolean $active Menu item active flag, returned by reference to set tree branch as active * * @return array Formed top menu */ function fn_top_menu_form($top_menu, $level = 0, &$active = NULL) { /** * Modifies top menu forming parameters * * @param array $top_menu Top menu data from the database * @param int $level Current menu level * @param boolean $active Menu item active flag */ fn_set_hook('top_menu_form_pre', $top_menu, $level, $active); $_active = false; foreach ($top_menu as $k => $v) { if (!empty($v['param_3'])) { // get extra items list($type, $id, $use_name) = fn_explode(':', $v['param_3']); if ($type == 'C') { // categories $cats = fn_get_categories_tree($id, true); $v['subitems'] = fn_array_merge(fn_top_menu_standardize($cats, 'category_id', 'category', 'subcategories', 'categories.view?category_id='), !empty($v['subitems']) ? $v['subitems'] : array(), false); if ($use_name == 'Y' && !empty($id)) { $v['descr'] = fn_get_category_name($id); $v['param'] = 'categories.view?category_id=' . $id; } //Should add this checking because the same pages can have different request parameters and the next checking //with fn_top_menu_is_current_url function could return incorrect result. //For example: categories.view?category_id=165 and categories.view?category_id=165¤cy=EUR should have the same active elements. if (fn_check_is_active_menu_item(array('category_id' => $id), 'categories')) { $top_menu[$k]['active'] = true; } } elseif ($type == 'A') { // pages $params = array('from_page_id' => $id, 'get_tree' => 'multi_level', 'status' => 'A'); list($pages) = fn_get_pages($params); $v['subitems'] = fn_array_merge(fn_top_menu_standardize($pages, 'page_id', 'page', 'subpages', 'pages.view?page_id='), !empty($v['subitems']) ? $v['subitems'] : array(), false); if ($use_name == 'Y' && !empty($id)) { $page_data = fn_get_page_data($id); $v['descr'] = $page_data['page']; $v['param'] = !empty($page_data['link']) ? $page_data['link'] : 'pages.view?page_id=' . $id; } if (fn_check_is_active_menu_item(array('page_id' => $id), 'pages')) { $top_menu[$k]['active'] = true; } } else { // for addons /** * Deprecated since 4.3.6, use top_menu_form_post instead */ fn_set_hook('top_menu_form', $v, $type, $id, $use_name); } } if (!empty($v['param']) && fn_top_menu_is_current_url($v['param'], $v['param_2'])) { $top_menu[$k]['active'] = true; // Store active value $_active = true; } if (!empty($v['subitems'])) { $top_menu[$k]['subitems'] = fn_top_menu_form($v['subitems'], $level + 1, $active); // If active status was returned fron children if ($active) { $top_menu[$k]['active'] = $active; // Strore fo return and reset activity status for athother elements on this level // Because in one level may be only one active item $_active = true; $active = false; } } $top_menu[$k]['item'] = $v['descr']; $top_menu[$k]['href'] = $v['param']; $top_menu[$k]['level'] = $level; unset($top_menu[$k]['descr'], $top_menu[$k]['param']); } $active = $_active; /** * Modifies top menu items * * @param array $top_menu Top menu data from the database * @param int $level Current menu level * @param boolean $active Menu item active flag */ fn_set_hook('top_menu_form_post', $top_menu, $level, $active); return $top_menu; }