В сегодняшнем уроке мы разберём такую большую тему как навигация на сайте. Что будет рассмотрено:
Начнём по порядку.
Ни один известный мне сайт не обходится без меню (исключение: одностраничные сайты). Меню, как один из важнейших и основных способов навигации, присутствует всегда: в разных видах, отображениях, местах и т.д.
Как происходит вывод меню на сайте под управлением CMS NetCat. Вы уже знакомы с таким понятием как «Карта сайта», отображаемая в административном разделе. Карта вашего сайта может состоять из неограниченного количества уровней вложенности. Отображение меню на сайте может быть как одноуровневым, так и многоуровневым.
Основа отображения меню (внешнего вида, функционала) формируется в шаблонах вывода навигации.
Рис.1 — Шаблоны вывода навигации
Шаблон для формирования меню состоит из массива данных. В качестве индексов массива могут задаваться следующие значения:
Используя любые из этих индексов можно сформировать простой массив данных для формирования меню следующего соержания:
$top_menu['prefix'] = "<ul>"; $top_menu['suffix'] = "</ul>"; $top_menu['active'] = "<li>%NAME</li>"; $top_menu['unactive'] = "<li><a href='%URL'>%NAME</a></li>";
Имя массива вы можете задавать произвольно. В данном примере используется имя $top_menu, что наглядно показывает в какой части сайта осуществляется вывод.
Давайте на простом примере разберём схему несложного сайта. Допустим что карта сайта у вас выглядит примерно таким образом:
Рис.2 — Шаблоны вывода навигации
После того, как мы добавим массив $top_menu в шаблон вывода навигации, а в коде шаблона ( в месте вывода меню ) пропишем строку:
nc_browse_sub(0,$top_menu)
на сайте отобразится ваше меню:
Рис.3 — Отображение меню на сайте
С формированием простого массива разобрались, теперь давайте разберём функции, которые осуществляют вывод меню на сайте. Функций для вывода меню есть две:
1. Используя функцию nc_browse_sub() ( в примере выше ). Данная функция может принимать 4 параметра: 2 обязательных и 2 необязательных.
nc_browse_sub (int $parent_sub, $template, $ignore_check = 0, $where_cond = '' )
Функция выводит список подразделов раздела $parent_sub в соответствии с шаблоном $template. C помощью флага $ignore_check можно игнорировать вывод только включённых разделов ( если $ignore_check равен 1, то выведутся все разделы ).
С помощью $where_cond можно дополнить запрос в секции WHERE.
$parent_sub — это целое число. В данный параметр записывается ID необходимого раздела. В примере выше этот параметр равен нулю, что говорит нам о том, что мы использовали корневой раздел для вывода меню. В том случае, если мы заменим 0 на 83 ( ID раздела «Наши услуги», Рис. 2 ), то увидим соответствующие изменения:
Рис.4 — Отображение меню на сайте
$template — имя массива. В нашем случае следует писать $top_menu.
$ignore_check = 0/1. Так как разделы в НетКэте можно делать скрытыми/выключенными ( на Рис.2 выключенные разделы выделены серым цветом ), с помощью данного параметра можно проигнорировать их текущее состояние, При установке значения в 1 будут выведены все пункты карты сайта указанного раздела.
$where_cond = ''. Очень удобный и нужный параметр задащий условие вывода. На практике его можно использовать в тех случаях, когда вы выводите меню нулевого уровня в нескольких местах. При этом вам нужно дать возможность редактору сайта самостоятельно выбирать где и какое меню выводить. Решить данную задачу можно решить следующим образом:
Рис.5 — Настройка нового поля
Рис.6 — Опции по включению меню
nc_browse_sub (0, $top_menu, 0, $where_cond = "showtopmenu='1'")
То есть здесь мы дописали необходимое условие. Дословно можно объяснить так: Если пункт показа в верхнем меню включен, меню выводится. Третий параметр при этом нужно указывать в состояние 0 или 1.
2. Есть ещё одна функция для вывода меню:
nc_browse_level ( int $level, $template, $ignore_check = 0, $where_cond = '' )
Данная функция выводит список разделов уровня $level в соответствии с шаблоном $template. Обратите внимание, что нумерация уровней начинается с нуля, т.е. Для вывода списка разделов верхнего уровня первый параметр функции должна быть равен нулю.
Пример 1. Вам нужно вывести список разделов и чтобы у текущего раздела показывался список подразделов:
1. В шаблон вывода навигации прописываете:
$browse_sub[1]['prefix'] = "<ul>"; $browse_sub[1]['suffix'] = "</ul>"; $browse_sub[1]['active'] = "<li><b><a href='%URL'>%NAME</b></a></li>"; $browse_sub[1]['active_link'] = "<li><b>%NAME</b></li>"; $browse_sub[1]['unactive'] = "<li><a href='%URL'>%NAME</a></li>"; $browse_sub[1]['divider'] = ""; $browse_sub[0]['prefix'] = "<ul>"; $browse_sub[0]['suffix'] = "</ul>"; $browse_sub[0]['active'] = "<li><b><a href='%URL'>%NAME</b></a>".nc_browse_level(1,$browse_sub[1])."</li>"; $browse_sub[0]['active_link'] = "<li><b>%NAME</b>".nc_browse_level(1,$browse_sub[1])."</li>"; $browse_sub[0]['unactive'] = "<li><a href='%URL'>%NAME</a></li>"; $browse_sub[0]['divider'] = "";
2. В месте вывода в шаблоне сайта прописываете:
s_browse_level(0,$browse_sub[0])
Дословно: выводить все разделы нулевого уровня в соответствии с шаблоном $browse_sub[0]. Как вы видите при формировании шаблона вывода нулевого уровня в него сразу добавляется код первого уровня текущего раздела, который будет видно только у активного(текущего раздела):
nc_browse_level(1,$browse_sub[1])
Как видно, шаблон $browse_sub[1] должен быть объявлен выше, чтобы корректно отрабатывал код nc_browse_level(1,$browse_sub[1]).
Пример 2. У вас на сайте есть 3 уровня вложенности: корень — первый уровень — второй уровень. Вам нужно на сайте вывести горизонтальное меню с выпадающими пунктами. Во-первых, вы верстаете HTML-шаблон вывода. Во-вторых, прописываете шаблоны вывода навигации по схеме:
# Второй уровень $browse_sub[2]['prefix'] = "<ul>"; $browse_sub[2]['suffix'] = "</ul>"; $browse_sub[2]['active'] = "<li><b><a href='%URL'>%NAME</a></b></li>"; $browse_sub[2]['active_link'] = "<li><b>%NAME</b></li>"; $browse_sub[2]['unactive'] = "<li><a href='%URL'>%NAME</a></li>"; $browse_sub[2]['divider'] = ""; # Первый уровень $browse_sub[1]['prefix'] = "<ul>"; $browse_sub[1]['suffix'] = "</ul>"; $browse_sub[1]['active'] = "<li><b><a href='%URL'>%NAME</b></a> %NEXT_LEVEL</li>"; $browse_sub[1]['active_link'] = "<li><b>%NAME</b> %NEXT_LEVEL</li>"; $browse_sub[1]['unactive'] = "<li><a href='%URL'>%NAME</a></li>"; $browse_sub[1]['divider'] = ""; # Нулевой уровень $browse_sub[0]['prefix'] = "<ul>"; $browse_sub[0]['suffix'] = "</ul>"; $browse_sub[0]['active'] = "<li><b><a href='%URL'>%NAME</b></a> %NEXT_LEVEL</li>"; $browse_sub[0]['active_link'] = "<li><b>%NAME</b> %NEXT_LEVEL</li>"; $browse_sub[0]['unactive'] = "<li><a href='%URL'>%NAME</a></li>"; $browse_sub[0]['divider'] = "";
В-третьих, в коде сайта прописываем вывод меню:
nc_browse_level(0,$browse_sub)
В результате внедрения данного кода на вашем сайте будет выведено меню с разделами и подразделами.
В шаблона вывода навигации есть возможность использовать макропеременные:
Использование s_browse_
Если вам не хватает данных макропеременных, или вы хотите использовать PHP условия, вы можете использовать функции с префиксом s_browse_, в которых доступен внутренний массив $data[] и выполняется eval() шаблонов. Массив $data[] содержит все данные из таблицы Subdivision о текущих подразделах выводимых функцией.
Например:
$browse_sub[0]['unactive'] = "<li><a href=\".\$data[\$i][Hidden_URL].\">\".\$data[\$i][Subdivision_Name].\"</a></li>";
равносильно записи:
$browse_sub[0]['unactive'] = "<li><a href=%URL>%NAME</a></li>";
Так же в шаблоне можно использовать дополнительные запросы. К примеру, вам нужно вывести количество элементов в разделах. Для этого дописывается запрос в шаблон:
$browse_sub[0]['unactive'] = "<li><a href=%URL>%NAME</a> \".\$db->get_var(\"SELECT COUNT(Message_ID) FROM MessageXX WHERE Subdivision_ID=\".\$data[\$i][Subdivision_ID]).\"</li>";
где XX - номер компонента подключенного в разделах.
Обратите внимание на слэши перед знаками $ и ", они обязательны, поскольку обработка этого массива и выполнение вложенных функций должны осуществляться внутри функции s_browse_, а не на этапе инициализации массива $browse_sub.
Важно: в функциях s_browse_ недоступна макропеременная %NEXT_LEVEL.
Важно: функции s_browse_ не выбирают автоматически уровень шаблона как это делается в %NEXT_LEVEL, поэтому необходимо при вызове функции передавать один конкретный уровень шаблона, например
s_browse_level(0,$browse_sub[0])
Для того чтобы вывести следующий уровень массива, необходимо прописать вызов функции для следующего уровня внутри шаблона и заэкранировать так, чтобы вызов прозошел внутри функции текущего уровня.
$left_menu[0]['active'] = "<li>%NAME \".s_browse_sub(\$data[\$i][Subdivision_ID],\$left_menu[1]).\"</li>\n";
Также шаблон следующего уровня $left_menu1[1] не будет доступен в области видимости функции s_browse_sub, поэтому нужно получить к нему доступ через глобализацию:
$left_menu[0]['prefix'] = "\"; global \$left_menu; \$result.=\"<ul>";
Полный пример на 3 уровня вложенности:
$left_menu[0]['prefix'] = "\"; global \$left_menu; \$result.=\"<ul>"; $left_menu[0]['suffix'] = "</ul>"; $left_menu[0]['active'] = "<li>%NAME \".s_browse_sub(\$data[\$i][Subdivision_ID],\$left_menu[1]).\"</li>\n"; $left_menu[0]['unactive'] = "<li><a href='%URL' title='%NAME'>%NAME</a>\".s_browse_sub(\$data[\$i][Subdivision_ID],\$left_menu[1]).\"</li>\n"; $left_menu[1]['prefix'] = "\"; global \$left_menu; \$result.=\" <ul>"; $left_menu[1]['suffix'] = "</ul>"; $left_menu[1]['active'] = "<li>%NAME\".s_browse_sub(\$data[\$i][Subdivision_ID],\$left_menu[2]).\"</li>\n"; $left_menu[1]['unactive'] = "<li ><a href='%URL' title='%NAME'>%NAME</a>\".s_browse_sub(\$data[\$i][Subdivision_ID],\$left_menu[2]).\"</li>\n"; $left_menu[2]['prefix'] = "<ul>"; $left_menu[2]['suffix'] = "</ul>"; $left_menu[2]['active'] = "<li>%NAME</li>\n"; $left_menu[2]['unactive'] = "<li><a href='%URL' title='%NAME'>%NAME</a></li>\n"; echo s_browse_sub(0, $left_menu[0]);
Важно: в случае если шаблон навигации описывается в шаблоне компонента(префикс/системные настройки), то необходимо дополнительно вывести массив шаблон из области видимости компонента в общую:
global $left_menu;
Список всех разделов (карты сайта) на самом сайте выводится так же весьма просто. Для карты сайта нужно создать новый раздел, к нему подключить макеn дизайна следующего содержания:
$browse_map['prefix'] = "<ul>"; $browse_map['unactive'] = "<li><a href=%URL>%NAME</a>\".s_browse_sub(\$data[\$i][Subdivision_ID],\$browse_template).\"<li>"; $browse_map['active'] = "<li><a href=%URL>%NAME</a>\".s_browse_sub(\$data[\$i][Subdivision_ID],\$browse_template).\"</li>"; $browse_map['suffix'] = "</ul>";
s_browse_sub(0,$browse_map)
В данном примере каждый элемент шаблона вызывает функцию еще раз с одинаковым шаблоном, а в качестве номера раздела передается ID текущего выводимого раздела. Таким образом у вас на одной странице будет выведена полная иерархия структуры сайта.
Хлебные крошки — элемент навигации по сайту, представляющий собой путь по сайту от его «корня» до текущей страницы, на которой находится пользователь. Обычно представляет собой полосу в верхней части страницы примерно такого вида:
Главная страница → Раздел → Подраздел → Текущая страница
Для вывода хлебных крошек на сайте под управлением CMS NetCat нужно использовать фунцию s_browse_path ( $template ) или s_browse_path_range ( $from, $to, $template ). Обе функци выводит навигацию типа «хлебные крошки» (путь до текущей страницы) в соответствии с шаблоном $template.
Первая функция выводит путь полностью, а вторая выводит только путь указанного диапазона (минимальное значение $from – (-1), максимальное значение $to - $sub_level_count).
Например, использование фукции ".s_browse_path_range (-1,$sub_level_count-1,$browse_global)." приведёт к тому, что будут выведены все разделы, кроме корневого. Шаблон вывода нафигации может выглядеть следующим образом:
$browse_global['suffix'] = " ↓ "; $browse_global['active'] = "<b>%NAME</b> "; $browse_global['unactive'] = "<a href='%URL'>%NAME</a> → ";
Постраничная навигация необходима для разбиения больших списков объектов на списки поменьше с возможностью переходов по страницам. Для отображения блока навигации используется массив $browse_msg[], значения которого указываются в настройках макета дизайна. Макропеременная %PAGE обозначает номер страницы, макропеременная %URL – ссылку на соответствующие страницы. Возможно также использование макропеременных %FROM и %TO, соответственно обозначающих номера начального и конечного объекта на странице
$browse_msg['prefix'] = ""; // Префикс перед блоком навигации $browse_msg['suffix'] = ""; // Суффикс после блока навигации $browse_msg['active'] = "%PAGE"; // Формат вывода текущей страницы $browse_msg['unactive'] = "<a href='%URL'>%PAGE</a>"; // Формат вывода ссылок $browse_msg['divider'] = " "; // Разделитель между ссылками
и далее, прописать вызов функции вывода в нужном месте:
browse_messages ( $cc_env, $range )
Массив $cc_env является неизменным параметром данной функции и содержит переменные окружения текущего компонента раздела. Параметр $range определяет количество выводимых страниц. Вместо этой переменной обычно пишется число.
Одновременно с выводом данной функции вам так же доступны ряд переменных для формирования более удобной навигации, а именно:
Предположим, что у вас на сайте есть раздел с новостями и вам нужно внедрить постраничную навигацию. Сделать это можно следующим образом: в месте вывода навигации нужно вставить строку:
Новости $begRow - $endRow из $totRows ".opt($prevLink, "<a href=$prevLink>пред.</a>")." ".browse_messages($cc_env, 10)." ".opt($nextLink, "<a href=$nextLink>след.</a>")
На странице вы увидите примерно следующее:
Рис.7 — Вывод навигации
Оперируя данными переменными вы можете добиться наилучшего вида отображения навигации на вашем сайте.
Настроить количество отображаемых объектов на одной странице можно в настройках компонента в заданном поле:
Рис.8 — Количество объектов на странице
На этом всё. Не бойтесь экспериментировать и обязательно добивайтесь нужных результатов!