Работа с CMS NetCat. Урок 19. Навигация на сайте


В сегодняшнем уроке мы разберём такую большую тему как навигация на сайте. Что будет рассмотрено:

  • меню на сайте;
  • карта сайта;
  • хлебные крошки (путь по сайту);
  • постраничная навигация.

Начнём по порядку.


Меню на сайте

Ни один известный мне сайт не обходится без меню (исключение: одностраничные сайты). Меню, как один из важнейших и основныых способов навигации, присутствует всегда: в разных видах, отображениях, местах и т.д.

Как происходит вывод меню на сайте под управлением CMS NetCat. Вы уже знакомы с таким понятием как «Карта сайта», отображаемая в административном разделе. Карта вашего сайта может состоять из неограниченного количества уровней вложенности. Отображение меню на сайте может быть как одноуровневым, так и многоуровневым.

Основа отображения меню (внешнего вида, функционала) формируется в шаблонах вывода навигации.


Рис.1 — Шаблоны вывода навигации

Шаблон по формированию меню состоит из массива данных. В качестве индексов массива могут задаваться следующие значения:

  • prefix – предшествует списку выводимых объектов. Например, в нем можно открыть таблицу.
  • suffix – идет после списка выводимых объектов. Например, в нем можно закрыть таблицу.
  • active – выводит активный элемент, одна его ссылка (%URL) не совпадает с адресом текущей страницы. Например, мы находимся в полном выводе «Новости».
  • active_link – выводит активный элемент, и его ссылка (%URL) совпадает с адресом текущей страницы. Например, мы находимся на странице списка новостей.
  • unactive – выводит неактивный элемент.
  • divider – разделитель между элементами списка навигации, например, Раздел 1 / Раздел 2. / - это разделитель.
  • sortby – позволяет сортировать выводы списка в нужном порядке. Чаще всего этот элемент не указывается, тогда список сортируется по приоритету (Priority).
  • nocache — флаг, позволяющий запретить кэширование (при наличии модуля «Кэширование»).

Используя любые из этих индексов можно сформировать простой массив данных для формирования меню следующего соержания:

$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 в шаблон вывода навигации, а в коде шаблона ( в месте вывода меню ) пропишем строку:

s_browse_sub(0,$top_menu)

на сайте отобразится ваше меню:


Рис.3 — Отображение меню на сайте

С формированием простого массива разобрались, теперь давайте разберём функции, которые осуществляют вывод меню на сайте. Функций для вывода меню есть две:

1. Используя функцию s_browse_sub() ( в примере выше ). Данная функция может принимать 4 параметра: 2 обязательных и 2 необязательных.

s_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 — Настройка нового поля

    обратите внимание на то, что поле имеет название showtopmenu. Таких полей можно создать несколько. Теперь в настройке раздела вам будут доступны созданные поля:


    Рис.6 — Опции по включению меню

  • в месте вывода меню прописываете вызов функции:

    s_browse_sub (0, $top_menu, 0, $where_cond = "showtopmenu='1'")

То есть здесь мы дописали необходимое условие. Дословно можно объяснить так: Если пункт показа в верхнем меню включен, меню выводится. Третий параметр при этом нужно указывать в состояние 0 или 1.

2. Есть ещё одна функция для вывода меню:

s_browse_level ( int $level, $template, $ignore_check = 0, $where_cond = '' )

Данная функция выводит список разделов уровня $level в соответствии с шаблоном $template. Обратите внимание, что нумерация уровней начинается с нуля, т.е. Для вывода списка разделов верхнего уровня первый параметр функции должна быть равен нулю.

На практике это выглядит следующим образом:

1. В шаблон вывода навигации прописываете:

$browse_sub[0]['prefix'] = "<ul>";
$browse_sub[0]['suffix'] = "</ul>";
$browse_sub[0]['active'] = "<li><b><a href=%URL>%NAME</b></a>".s_browse_level(1,$browse_sub[1])."</li>";
$browse_sub[0]['active_link'] = "<li><b>%NAME</b>".s_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]. Как вы видите в шаблоне вывода присутствует вызов следующего первого уровня:

s_browse_level(1,$browse_sub[1])

В этом случае шаблон вывода навигации будет выглядеть как:

$browse_sub[1]['prefix'] = "<ul>";
$browse_sub[1]['suffix'] = "</ul>";
и т.д.

Таким образом реализуется многоуровневый вывод меню сайта, то есть последовательно описываются шаблоны вывода навигации, начиная с последнего. Например, у вас на сайте есть 3 уровня вложенности: корень — первый уровень — второй уровень. Вам нужно на сайте вывести горизонтальное меню с выпадающими пунктами. Во-первых, вы верстаете HTML-шаблон вывода. Во-вторых, прописываете шаблоны вывода навигации:

# Второй уровень
$browse_sub[2]['prefix'] = "<ul>";
$browse_sub[2]['suffix'] = "</ul>";
$browse_sub[2]['active'] = "<li><b><a href=%URL>%NAME</a></b>";
$browse_sub[2]['active_link'] = "<li><b>%NAME</b>";
$browse_sub[2]['unactive'] = "<li><a href=%URL>%NAME</a>";
$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>".s_browse_level(2,$browse_sub[2]);
$browse_sub[1]['active_link'] = "<li><b>%NAME</b>".s_browse_level(2,$browse_sub[2]);
$browse_sub[1]['unactive'] = "<li><a href=%URL>%NAME</a>";
$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>".s_browse_level(1,$browse_sub[1]);
$browse_sub[0]['active_link'] = "<li><b>%NAME</b>".s_browse_level(1,$browse_sub[1]);
$browse_sub[0]['unactive'] = "<li><a href=%URL>%NAME</a>";
$browse_sub[0]['divider'] = "";

В-третьих, в коде сайта прописываем вывод меню:

s_browse_level(0,$browse_sub[0])

В результате внедрения данного кода на вашем сайте будет выведено меню с разделами и подразделами.

В шаблона вывода навигации есть возможность использовать макропеременные:

  • %NAME — название элемента (раздела)
  • %URL — адрес к текущему элементу (разделу)
  • %PARENT_SUB — номер родительского раздела (только для разделов)
  • %KEYWORD — ключевое слово раздела (только для разделов)
  • %SUB — номер раздела (только для разделов)
  • %COUNTER — номер выводимого элемента в списке (начиная с нуля)

Если вам не хватает данных макропеременных, вы можете использовать внутренний массив $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> ".listQuery("SELECT count(Message_ID) as count
FROM MessageXX WHERE Catalogue_ID=$catalogue AND Subdivision_ID=".$data[$i][Subdivision_ID],"\$data[count]")."</li>";

Обратите внимание на слэши перед знаками $ и ", они обязательны, поскольку обработка этого массива должна осуществляться внутри функции, а не на этапе обработки макета дизайна.


Карта сайта

Список всех разделов (карты сайта) на самом сайте выводится так же весьма просто. Для этого карты сайта нужно создать новый раздел, к нему подключить макед дизайна следующего содержания:

  • в шаблон вывода навигации прописать:

    $browse_map['prefix'] = "<ul>";
    $browse_map['unactive'] = "<li><a href=%URL>%NAME</a>".s_browse_sub($data[$i][Subdivision_ID],$browse_template)."";
    $browse_map['active'] = "<li><a href=%URL>%NAME</a>".s_browse_sub($data[$i][Subdivision_ID],$browse_template)."";
    $browse_map['suffix'] = "</ul>";

  • в место вывода карты прописать вызов функции:

    s_browse_sub(0,$browse_map)

В данном примере каждый элемент шаблона вызывает функцию еще раз с одинаковым шаблоном, а в качестве номера раздела передается ID текущего выводимого раздела. Таким образом у вас на одной странице будет выведена полная иерархия структуры сайта.

Значения параметров функции s_browse_sub были описаны выше.


Хлебные крошки (путь по сайту)

Хлебные крошки — элемент навигации по сайту, представляющий собой путь по сайту от его «корня» до текущей страницы, на которой находится пользователь. Обычно представляет собой полосу в верхней части страницы примерно такого вида:

Главная страница &rarr; Раздел &rarr; Подраздел &rarr; Текущая страница

Для вывода хлебных крошек на сайте под управлением 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'] = " &darr; ";
$browse_global['active'] = "<b>%NAME</b> ";
$browse_global['unactive'] = "<a href='%URL'>%NAME</a> &rarr; ";


Постраничная навигация

Постраничная навигация необходима для разбиения больших списков объектов на списки поменьше с возможностью переходов по страницам. Для отображения блока навигации используется массив $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 определяет количество выводимых страниц. Вместо этой переменной обычно пишется число.

Одновременно с выводом данной функции вам так же доступны ряд переменных для формирования более удобной навигации, а именно:

  • $prevLink — ссылка на предыдущую страницу в листинге шаблона (если текущее положение в списке – его начало, то переменная пустая)
  • $nextLink — ссылка на следующую страницу в листинге шаблона (если текущее положение в списке – его конец, то переменная пустая)
  • $recNum — максимальное количество записей, выводимых в списке
  • $totRows — общее количество записей в списке
  • $begRow — номер записи (по порядку), с которой начинается листинг списка на данной странице
  • $endRow — номер записи (по порядку), которой заканчивается листинг списка на данной странице

Предположим, что у вас на сайте есть раздел с новостями и вам нужно внедрить постраничную навигацию. Сделать это можно следующим образом: в месте вывода навигации нужно вставить строку:

Новости $begRow - $endRow из $totRows ".opt($prevLink, "<a href=$prevLink>пред.</a>")." ".browse_messages($cc_env, 10)." ".opt($nextLink, "<a href=$nextLink>след.</a>")

На странице вы увидите примерно следующее:


Рис.7 — Вывод навигации

Оперируя данными переменными вы можете добиться наилучшего вида отображения навигации на вашем сайте.

Настроить количество отображаемых объектов на одной странице можно в настройках компонента в заданном поле:


Рис.8 — Количество объектов на странице

На этом всё. Не бойтесь экспериментировать и обязательно добивайтесь нужных результатов!

Добавлено: 19.11.2011    Просмотров: 751    Метки: навигация, netcat
Написал(а): ivan, 23.11.2011 в 15:15
ух,много информации
А приходилось использовать nocache в s_browse_sub?
Написал(а): Orlenko K.N., 23.11.2011 в 15:28
Пост можно назвать «Многабукаф»
нет, пока не приходилось
Написал(а): Ирина, 20.02.2012 в 08:11
1. Здорово, что «Многабукаф», я столько всего сделала по этому уроку!
2. Вопрос: чтобы вставить постраничную навигацию, нужно создавать еще дополнительный макет (например, для новостей), и писать там эту строчку
Новости $begRow - $endRow
?
3. Вставляю эту строчку в код, а мне пишется ошибка :
Parse error: syntax error, unexpected '/' in C:\...\index.php(75) : eval()'d code on line 2 
Написал(а): Orlenko K.N., 20.02.2012 в 08:26
Здравствуйте, Ирина.
Вы верно вставляете код. Так вам будут выведены первая и последняя страницы.
В ошибке написано, что символ «/» лишний где-то. Нужно код шаблона пересмотреть
Написал(а): Ирина, 20.02.2012 в 08:39
1. Подскажите, пожалуйста, куда нужно вставлять то этот код? Ведь нужно, чтобы он был сразу после содержательной части страницы (после всех новостей).
2. Наверное ошибка и вылазит потому, что я его не туда вставляла...
Написал(а): Ирина, 20.02.2012 в 09:05
Ой, я поняла, что это в «Редактирование компонента»
Написал(а): Orlenko K.N., 20.02.2012 в 09:06
В Суффикс списка объектов. Можете такой код попробовать вставить:
".($totRows>$f_RowNum?"<div class='nc_pagination'>Страницы: ".browse_messages($cc_env, 10)."</div>":NULL )."
Написал(а): Ирина, 21.02.2012 в 06:46
А вы случайно не знаете, почему постраничная навигация выводится со ссылками, считая их от корневой папки (у меня сайт в подпапке)? Остальные ссылки навигации нормально работают, а эти - нет.
Написал(а): Orlenko K.N., 21.02.2012 в 07:17
К сожалению, нет. Попробуйте на форуме спросить.

 
   
 
 

Последняя работа

Торговый дом «Зелёная линия»

Шаблон

HTML-шаблон Marked

Статистика


Сегодня: 23 февраля 2012 г.
  Постов на блоге: 146
  Оставлено комментариев: 896
  Шаблонов в базе: 223
  Выполнено работ: 40
Все комментарии
Загрузка: 0.019

Яндекс.Метрика