/** * Функция обработки тега модуля * * @param int $navigation_id - идентификатор меню навигации */ function mod_navigation($navigation_id) { global $AVE_DB, $AVE_Core; static $navigations = array(); $navigation_id = preg_replace('/\\D/', '', $navigation_id); if (isset($navigations[$navigation_id])) { echo $navigations[$navigation_id]; return; } $nav = get_navigations($navigation_id); if (!$nav) { echo 'Menu ', $navigation_id, ' not found'; return; } if (!defined('UGROUP')) { define('UGROUP', 2); } if (!in_array(UGROUP, $nav->navi_user_group)) { return; } if (empty($_REQUEST['module'])) { $curent_doc_id = isset($_GET['id']) && is_numeric($_GET['id']) ? $_GET['id'] : 1; $row_navi = $AVE_DB->Query("\r\n\t\t\tSELECT CONCAT_WS(',', nav.Id, nav.parent_id, nav2.parent_id)\r\n\t\t\tFROM\r\n\t\t\t\t" . PREFIX . "_navigation_items AS nav\r\n\t\t\tJOIN\r\n\t\t\t\t" . PREFIX . "_documents AS doc\r\n\t\t\tLEFT JOIN\r\n\t\t\t\t" . PREFIX . "_navigation_items AS nav2 ON nav2.Id = nav.parent_id\r\n\t\t\tWHERE nav.navi_item_status = 1\r\n\t\t\tAND nav.navi_id = '" . $navigation_id . "'\r\n\t\t\tAND doc.Id = '" . $curent_doc_id . "'\r\n\t\t\tAND (nav.navi_item_link = 'index.php?id=" . $curent_doc_id . "'" . (!empty($AVE_Core->curentdoc->document_alias) && $AVE_Core->curentdoc->Id == $curent_doc_id ? " OR nav.document_alias = '" . $AVE_Core->curentdoc->document_alias . "'" : '') . " OR nav.Id = doc.document_linked_navi_id)\r\n\t\t")->GetCell(); } else { $row_navi = $AVE_DB->Query("\r\n\t\t\tSELECT CONCAT_WS(',', nav.Id, nav.parent_id, nav2.parent_id)\r\n\t\t\tFROM\r\n\t\t\t\t" . PREFIX . "_navigation_items AS nav\r\n\t\t\tLEFT JOIN\r\n\t\t\t\t" . PREFIX . "_navigation_items AS nav2 ON nav2.Id = nav.parent_id\r\n\t\t\tWHERE nav.navi_item_status = '1'\r\n\t\t\tAND nav.navi_id = '" . $navigation_id . "'\r\n\t\t\tAND nav.navi_item_link LIKE 'index.php?module=" . $_REQUEST['module'] . "%%'\r\n\t\t")->GetCell(); } $where_elter = ''; if ($row_navi !== false) { $way = explode(',', $row_navi); if ($nav->navi_expand != 1) { $where_elter = "AND parent_id IN(0," . $row_navi . ")"; } } else { $way = array(''); if ($nav->navi_expand != 1) { $where_elter = "AND parent_id = 0"; } } $nav_items = array(); $sql = $AVE_DB->Query("\r\n\t\tSELECT *\r\n\t\tFROM " . PREFIX . "_navigation_items\r\n\t\tWHERE navi_item_status = '1'\r\n\t\tAND navi_id = '" . $navigation_id . "'\r\n\t\t" . $where_elter . "\r\n\t\tORDER BY navi_item_position ASC\r\n\t"); while ($row_nav_item = $sql->FetchAssocArray()) { $nav_items[$row_nav_item['parent_id']][] = $row_nav_item; } $ebenen = array(1 => array('aktiv' => str_replace('[tag:mediapath]', ABS_PATH . 'templates/' . THEME_FOLDER . '/', $nav->navi_level1active), 'inaktiv' => str_replace('[tag:mediapath]', ABS_PATH . 'templates/' . THEME_FOLDER . '/', $nav->navi_level1)), 2 => array('aktiv' => str_replace('[tag:mediapath]', ABS_PATH . 'templates/' . THEME_FOLDER . '/', $nav->navi_level2active), 'inaktiv' => str_replace('[tag:mediapath]', ABS_PATH . 'templates/' . THEME_FOLDER . '/', $nav->navi_level2)), 3 => array('aktiv' => str_replace('[tag:mediapath]', ABS_PATH . 'templates/' . THEME_FOLDER . '/', $nav->navi_level3active), 'inaktiv' => str_replace('[tag:mediapath]', ABS_PATH . 'templates/' . THEME_FOLDER . '/', $nav->navi_level3))); $END = str_replace('[tag:mediapath]', ABS_PATH . 'templates/' . THEME_FOLDER . '/', $nav->navi_begin); printNavi($END, $ebenen, $way, $navigation_id, $nav_items, $nav); $END .= str_replace('[tag:mediapath]', ABS_PATH . 'templates/' . THEME_FOLDER . '/', $nav->navi_end); $END = rewrite_link($END); $END = preg_replace("/(^[\r\n]*|[\r\n]+)[\\s\t]*[\r\n]+/", "\n", $END); // $END = str_replace(array("\r\n","\n","\r"),'',$END); $END = str_replace(array("\n", "\r"), '', $END); $search = array($nav->navi_level1begin . $nav->navi_level1end, $nav->navi_level2begin . $nav->navi_level2end, $nav->navi_level3begin . $nav->navi_level3end, '</li>' . $nav->navi_level2begin . '<li', '</li>' . $nav->navi_level3begin . '<li', '</li>' . $nav->navi_level1end . '<li', '</li>' . $nav->navi_level2end . '<li', '</li>' . $nav->navi_level1end . $nav->navi_level2end . '<li', '</li>' . $nav->navi_level1end . $nav->navi_level2end . $nav->navi_level3end, '</li>' . $nav->navi_level1end . $nav->navi_level2end, '</li>' . $nav->navi_level2end . $nav->navi_level3end); $replace = array('', '', '', $nav->navi_level2begin . '<li', $nav->navi_level3begin . '<li', '</li>' . $nav->navi_level1end . '</li><li', '</li>' . $nav->navi_level2end . '</li><li', '</li>' . $nav->navi_level1end . '</li>' . $nav->navi_level2end . '</li><li', '</li>' . $nav->navi_level1end . '</li>' . $nav->navi_level2end . '</li>' . $nav->navi_level3end, '</li>' . $nav->navi_level1end . '</li>' . $nav->navi_level2end, '</li>' . $nav->navi_level2end . '</li>' . $nav->navi_level3end); $END = str_replace($search, $replace, $END); $navigations[$navigation_id] = $END; echo $END; }
function mod_quickfinder($navi_ids = '') { global $AVE_DB, $AVE_Core, $navigations; if (!empty($navi_ids)) { $sql = array(); $navi_ids = explode(',', $navi_ids); foreach ($navi_ids as $navi_id) { if (is_numeric($navi_id) && check_navi_permission($navi_id)) { $sql[] = "(\r\n\t\t\t\t\t\t\tSELECT\r\n\t\t\t\t\t\t\t\tId,\r\n\t\t\t\t\t\t\t\tparent_id,\r\n\t\t\t\t\t\t\t\ttitle,\r\n\t\t\t\t\t\t\t\tnavi_item_link,\r\n\t\t\t\t\t\t\t\tnavi_item_target,\r\n\t\t\t\t\t\t\t\tnavi_item_level,\r\n\t\t\t\t\t\t\t\tdocument_alias,\r\n\t\t\t\t\t\t\t\t0 AS active\r\n\t\t\t\t\t\t\tFROM " . PREFIX . "_navigation_items\r\n\t\t\t\t\t\t\tWHERE navi_item_status = '1'\r\n\t\t\t\t\t\t\tAND navi_id = " . $navi_id . "\r\n\t\t\t\t\t\t\tORDER BY navi_item_position ASC\r\n\t\t\t\t\t\t)"; } } $sql = implode(' UNION ', $sql); if (empty($sql)) { return; } } else { $navigations = get_navigations(); if (empty($navigations)) { return; } $navi_in = array(); foreach ($navigations as $navigation) { if (in_array(UGROUP, $navigation->navi_user_group)) { array_push($navi_in, $navigation->id); } } if (sizeof($navi_in)) { $sql = "\r\n\t\t\t\tSELECT\r\n\t\t\t\t\tId,\r\n\t\t\t\t\tparent_id,\r\n\t\t\t\t\ttitle,\r\n\t\t\t\t\tnavi_item_link,\r\n\t\t\t\t\tnavi_item_target,\r\n\t\t\t\t\tnavi_item_level,\r\n\t\t\t\t\tdocument_alias,\r\n\t\t\t\t\t0 AS active\r\n\t\t\t\tFROM " . PREFIX . "_navigation_items\r\n\t\t\t\tWHERE navi_item_status = '1'\r\n\t\t\t\tAND navi_id IN(" . implode(',', $navi_in) . ")\r\n\t\t\t\tORDER BY navi_id ASC, navi_item_position ASC\r\n\t\t\t"; } else { return; } } $nav_items = array(); $sql = $AVE_DB->Query($sql); while ($row_nav_item = $sql->FetchAssocArray()) { if (empty($_REQUEST['module'])) { $curent_doc_id = isset($_GET['id']) && is_numeric($_GET['id']) ? $_GET['id'] : 1; if ($row_nav_item['document_alias'] == $AVE_Core->curentdoc->document_alias || $row_nav_item['navi_item_link'] == 'index.php?id=' . $curent_doc_id) { $row_nav_item['active'] = 1; } } else { if ($row_nav_item['navi_item_link'] == 'index.php?module=' . $_REQUEST['module']) { $row_nav_item['active'] = 1; } } $nav_items[$row_nav_item['parent_id']][] = $row_nav_item; } if (sizeof($nav_items)) { $quickfinder = '<select class="mod_quickfinder" name="quickfinder" onchange="eval(this.options[this.selectedIndex].value);">'; $quickfinder .= '<option></option>'; printQuickfinder($nav_items, $quickfinder); echo $quickfinder . '</select>'; } }
/** * Функция вывода карты сайта * * @param int $navi_ids - идентификатор меню навигации * или нескольких меню указанных через запятую * для формирования карты сайта. * Если идентификатор не указан используются все меню */ function mod_sitemap($navi_ids = '') { global $AVE_DB; if (!empty($navi_ids)) { $sql = array(); $navi_ids = explode(',', $navi_ids); foreach ($navi_ids as $navi_id) { if (is_numeric($navi_id) && check_navi_permission($navi_id)) { array_push($sql, "(\r\n\t\t\t\t\t\tSELECT *\r\n\t\t\t\t\t\tFROM " . PREFIX . "_navigation_items\r\n\t\t\t\t\t\tWHERE navi_item_status = '1'\r\n\t\t\t\t\t\tAND navi_id = " . $navi_id . "\r\n\t\t\t\t\t\tORDER BY navi_item_position ASC\r\n\t\t\t\t\t)"); } } $sql = implode(' UNION ', $sql); if (empty($sql)) { return; } } else { $navigations = get_navigations(); if (empty($navigations)) { return; } $navi_in = array(); foreach ($navigations as $navigation) { if (in_array(UGROUP, $navigation->navi_user_group)) { array_push($navi_in, $navigation->id); } } if (sizeof($navi_in)) { $sql = "\r\n\t\t\t\tSELECT *\r\n\t\t\t\tFROM " . PREFIX . "_navigation_items\r\n\t\t\t\tWHERE navi_item_status = '1'\r\n\t\t\t\tAND navi_id IN(" . implode(',', $navi_in) . ")\r\n\t\t\t\tORDER BY navi_id ASC, navi_item_position ASC\r\n\t\t\t"; } else { return; } } $nav_items = array(); $sql = $AVE_DB->Query($sql); while ($row_nav_item = $sql->FetchAssocArray()) { $nav_items[$row_nav_item['parent_id']][] = $row_nav_item; } $sitemap = ''; if (sizeof($nav_items)) { printSitemap($nav_items, $sitemap); } echo $sitemap; }
/** * Функция обработки навигации * * @param int $navi_id - идентификатор меню навигации */ function parse_navigation($navi_tag) { global $AVE_DB, $AVE_Core; $gen_time = microtime(); // извлекаем id из аргумента $navi_id = (int) $navi_tag[1]; // извлекаем level из аргумента $navi_print_level = $navi_tag[2]; // получаем меню навигации по id, // и если такой не существует, выводим сообщение $navi_menu = get_navigations($navi_id); if (!$navi_menu) { echo 'Menu ', $navi_id, ' not found!'; return; } // выставляем гостевую группу по дефолту if (!defined('UGROUP')) { define('UGROUP', 2); } // выходим, если навиг. не предназначена для текущей группы if (!in_array(UGROUP, $navi_menu->navi_user_group)) { return; } // Находим активный пункт (связь текущего открытого документа и навигации). Нас интересуют: // 1) документы, которые сами связаны с пунктом меню // 2) пункты навигации, у которых ссылка совпадает с алиасом дока // 3) текущий level, текущий id // возвращаем в $navi_active через запятую id пунктов: // 1) активный пункт // 2) родители активного пункта // после ; через запятую все level-ы текущего пути, чтобы потом взять max // после ; id текущего пункта // если текущая страница не модуль, а документ // if (!$_REQUEST['module']) // { // id текущего документа. Если не задан, то главная страница $doc_active_id = (int) ($_GET['id'] ? $_GET['id'] : 1); // запрос для выборки по текущему алиасу $sql_doc_active_alias = $AVE_Core->curentdoc->document_alias && $AVE_Core->curentdoc->Id == $doc_active_id ? " OR nav.document_alias = '" . $AVE_Core->curentdoc->document_alias . "'" : ''; $navi_active = $AVE_DB->Query("\r\n\t\t\tSELECT CONCAT_WS(\r\n\t\t\t\t\t';',\r\n\t\t\t\t\tCONCAT_WS(',', nav.Id, nav.parent_id, nav2.parent_id),\r\n\t\t\t\t\tCONCAT_WS(',', nav.navi_item_level),\r\n\t\t\t\t\tnav.Id\r\n\t\t\t\t)\r\n\t\t\tFROM\r\n\t\t\t\t" . PREFIX . "_navigation_items AS nav\r\n\t\t\tJOIN\r\n\t\t\t\t" . PREFIX . "_documents AS doc\r\n\t\t\tLEFT JOIN\r\n\t\t\t\t" . PREFIX . "_navigation_items AS nav2 ON nav2.Id = nav.parent_id\r\n\t\t\tWHERE nav.navi_item_status = 1\r\n\t\t\t\tAND nav.navi_id = " . $navi_id . "\r\n\t\t\t\tAND doc.Id = " . $doc_active_id . "\r\n\t\t\t\tAND (\r\n\t\t\t\t\tnav.navi_item_link = 'index.php?id=" . $doc_active_id . "'" . $sql_doc_active_alias . "\r\n\t\t\t\t\tOR nav.Id = doc.document_linked_navi_id\r\n\t\t\t\t)\r\n\t\t")->GetCell(); $navi_active = explode(';', $navi_active); // готовим 2 переменные с путём if ($navi_active[0]) { $navi_active_way = explode(',', $navi_active[0]); } $navi_active_way[] = '0'; $navi_active_way_str = implode(',', $navi_active_way); // текущий уровень $navi_active_level = (int) max(explode(',', $navi_active[1])) + 1; // текущий id $navi_active_id = (int) $navi_active[2]; // } /* // если текущая страница - модуль (логин, магазин и т.д.) else { @$extended_by_module = "(nav.navi_item_link LIKE '%%" . $refurl2 . "%%')"; @$extended_by_module2 = "(nav.document_alias LIKE '%%" . $refurl2 . "%%')"; $navi_active_way = $AVE_DB->Query(" SELECT CONCAT_WS(',',nav.Id, nav.parent_id, nav2.parent_id) FROM " . PREFIX . "_navigation_items AS nav LEFT JOIN " . PREFIX . "_navigation_items AS nav2 ON nav2.Id = nav.parent_id WHERE nav.navi_item_status = '1' AND nav.navi_id = '" . $navi_id . "' ")->GetCell(); if(empty($navi_active_way)) { $navi_active_way = $AVE_DB->Query(" SELECT CONCAT_WS(',',nav.parent_id, nav2.parent_id) FROM " . PREFIX . "_navigation_items AS nav LEFT JOIN " . PREFIX . "_navigation_items AS nav2 ON nav2.Id = nav.parent_id WHERE nav.navi_item_status = '1' AND nav.navi_id = '" . $navi_id . "' AND $extended_by_module2 ")->GetCell(); } }*/ // если просят вывести какие-то конкретные уровни: $sql_navi_level = ''; $sql_navi_active = ''; if ($navi_print_level) { $sql_navi_level = ' AND navi_item_level IN (' . $navi_print_level . ') '; $sql_navi_active = ' AND parent_id IN(' . $navi_active_way_str . ') '; } else { switch ($navi_menu->navi_expand_ext) { // все уровни case 1: $navi_parent = 0; break; // текущий и родительский уровни // текущий и родительский уровни case 0: $sql_navi_active = ' AND parent_id IN(' . $navi_active_way_str . ') '; $navi_parent = 0; break; // только текущий уровень // только текущий уровень case 2: $sql_navi_level = ' AND navi_item_level = ' . $navi_active_level . ' '; $navi_parent = $navi_active_id; break; } } // запрос пунктов меню $sql_navi_items = $AVE_DB->Query("\r\n\t\tSELECT *\r\n\t\tFROM " . PREFIX . "_navigation_items\r\n\t\tWHERE navi_item_status = '1'\r\n\t\tAND navi_id = '" . $navi_id . "'" . $sql_navi_level . $sql_navi_active . "\r\n\t\tORDER BY navi_item_position ASC\r\n\t"); $navi_items = array(); while ($row_navi_items = $sql_navi_items->FetchAssocArray()) { $navi_items[$row_navi_items['parent_id']][] = $row_navi_items; } if ($navi_print_level) { $keys = array_keys($navi_items); $navi_parent = $keys[0]; } // Парсим теги в шаблонах пунктов $navi_item_tpl = array(1 => array('inactive' => $navi_menu->navi_level1, 'active' => $navi_menu->navi_level1active), 2 => array('inactive' => $navi_menu->navi_level2, 'active' => $navi_menu->navi_level2active), 3 => array('inactive' => $navi_menu->navi_level3, 'active' => $navi_menu->navi_level3active)); // запускаем рекурсивную сборку навигации if ($navi_items) { $navi = printNavi($navi_menu, $navi_items, $navi_active_way, $navi_item_tpl, $navi_parent); } // преобразуем все ссылке в коде $navi = rewrite_link($navi); // удаляем переводы строк и табуляции $navi = preg_replace("/(^[\r\n]*|[\r\n]+)[\\s\t]*[\r\n]+/", "\n", $navi); $navi = str_replace(array("\n", "\r"), '', $navi); $gen_time = microtime() - $gen_time; $GLOBALS['block_generate'][] = array('NAVIGATION_' . $navi_id => $gen_time); return $navi; }
/** * Проверка прав доступа к навигации по группе пользователя * * @param int $id идентификатор меню навигации * @return boolean */ function check_navi_permission($id) { $navigation = get_navigations($id); if (empty($navigation->navi_user_group)) { return false; } if (!defined('UGROUP')) { define('UGROUP', 2); } if (!in_array(UGROUP, $navigation->navi_user_group)) { return false; } return true; }