Навигация - techart/bitrix.tao GitHub Wiki
Подключение навигации
Для подключения своей навигации:
а) желательно удалить предустановленные файлы стандартной навигации Битрикса.
б) в папке /local/ завести файл с именем .navigation.php, в котором и будет описана структура навигационного меню.
Настройка навигационного дерева
Структура навигации строится по тому же принципу, что и в ТАО.
// local/.navigation.php
return
[
[
'url' => '/about/',
'title' => 'О компании',
'sub' =>
[
[
'url' => '/about/history.php',
'title' => 'История компании',
],
[
'url' => '/about/vacancies.php',
'title' => 'Вакансии',
],
],
'match' => '*',
],
[
'url' => '/news/',
'title' => 'Новости',
'match' => '*',
],
];
Вложенная навигация
Вложенные ссылки также описываются через параметр sub, который в свою очередь представляет собой массив с таким же синтаксисом, что и корневой.
'sub' => [
'/about/authors/' => 'Об авторах',
'/about/contacts/' => 'Контакты',
]
Передавать можно не только простой массив ссылок.
- Мнемокод инфоблока в конструкции вида infoblock:name_infoblock, sections:name_infoblock для получения всех элементов инфоблока или только разделов (sections).
'sub' => 'infoblock:news',
'sub' => 'section:news',
При формировании навигации будет происходить обращение по имени к инфоблоку, у которого будет вызываться тот или иной метод: navigationTree() - для получения элементов (infoblock:), navigationTreeSections() - соответственно для получения разделов (sections:).
Можно вызвать эти методы напрямую в файле навигации.
'sub' => \TAO::infoblock('cats')->navigationTreeSections(),
'sub' => \TAO::infoblock('cats')->navigationTree(),
- Если ссылки необходимо формировать каким-то хитрым способом, то можно вызвать свой метод.
Если метод описывается в классе инфоблока, то указывать необходимо инфоблок. Запись будет выглядеть следующим образом:
'sub' => 'infoblock:cats:my_navigation',
где, my_navigation - имя собственного метода, который формирует вложенный список каким-то образом.
И для бандла:
'sub' => 'bundle:Cats:my_navigation',
Здесь соответственно указывается имя бандла, а метод формирования списка my_navigation описывается в классе бандла.
- Callback-функцию.
'sub' => function() {
$list = [
'/news/' => 'Новости',
];
return $list;
}
Отображение навигации в шаблоне
Для вывода применяем следующий метод:
<?= \TAO::navigation()->render(); ?>
Будет выведено главное меню сайта, состоящее из корневых ссылок в виде последовательного списка тегов a.
Шаблоны
По умолчанию для вывода навигации применяется шаблон simple (выводит верхний уровень ссылок навигационного дерева). Также есть шаблон ul - для вывода меню в виде маркированного списка.
<?= \TAO::navigation()->render('ul'); ?>
Данные шаблоны можно переопределить или подключить свои, передав имя шаблона в метод render(). Кастомные шаблоны необходимо хранить в папке /local/view/navigation/.
Изменение разделителя в шаблоне
В качестве разделителя по умолчанию применяется знак ::. Для изменения применяется метод delimiter().
print \TAO::navigation()->route()->delimetr('/')->render();
Подключение альтернативной навигации
По умолчанию навигация строится из файла .navigation.php. Как правило, в этом файле описывается структура главного меню. А если в другой части сайта (например, в футере) требуется вывести меню со своей структурой? Вопрос решается следующим образом:
-
В папку /local/ (там же, где и .navigation.php) кладем свой файл с произвольным именем .my_menu.php. В котором описываем альтернативную структуру навигации.
-
В шаблоне при выводе навигации передаем в метод navigation() имя файла с альтернативной навигацией.
print \TAO::navigation('my_menu')->route()
Уровни навигации
Для отображения второго и последующих уровней навигации необходимо воспользоваться методом level($n).
print \TAO::navigation()->level(1)->render();
Нумерация, как в ТАО, начинается с нуля. Поэтому запись:
\TAO::navigation()->level(0)->render()
аналогична непосредственному вызову навигации.
Необходимо использовать проверку существования уровня перед выводом, иначе будет возвращена ошибка (например, для корневого уровня).
Фильтрация
В случаях, когда требуется выводить только отдельные узлы, можно применить фильтрацию.
- В файле .navigation.php добавляем к каждой ссылке, которую хотим видеть в навигации, произвольный параметр.
Например, требуется вывести определенные ссылки в навигации. Добавим в нужные ссылки произвольный параметр.
// local/.navigation.php
return
[
[
'url' => '/about/',
'title' => 'О компании',
'on_main' => 1, // произвольный параметр, по которому будет срабатывать фильтрация
],
[
'url' => '/news/',
'title' => 'Новости',
'on_main' => 1,
],
[
'url' => '/articles/',
'title' => 'Статьи',
],
]
2.В шаблоне страницы при выводе меню укажем по какому параметру фильтровать ссылки.
\TAO::navigation()->filter('on_main')->render();
Допускается обратная фильтрация. Тогда указываем:
\TAO::navigation()->filter('!on_main')->render();
Возможно использование нескольких параметров.
\TAO::navigation()->filter('on_main','!no_render')->render();
Будет возвращен список ссылок, у которых установлен параметр on_main и не установлен no_render.
Определение текущей ссылки
Также как и в ТАО для получения текущих ссылок определены параметры match и flag.
В match можно указывать:
- Непосредственно адрес страницы.
- В качестве значения параметра указываем специальный знак звездочки ** * **. Т.е. все ссылки, которые начинаются со строчки, указанной в парметре url, будут также считаться текущими, и добавятся в навигацию.
[
'url' => '/news/',
'title' => 'Новости',
'match' => '*',
],
- Знак звездочки (*) можно сочетать со строкой (адресом).
[
'url' => '/catalog/',
'title' => 'Каталог',
'match' => '/catalog/*',
],
Если определить текущую ссылку по адресу невозможно, можно воспользоваться флагами. Помечаем ссылку флагом, а затем возводим флаг.
'url' => '/news/regions/',
'flag' => 'regions', //помечаем ссылку
\TAO::navigation()->flag('regions'); //возводим флаг
Значение параметра флага может быть задано в виде массива.
'flag' => [
'moscow',
'tula',
'ryazan'
],
Хлебные крошки
Вывод хлебных крошек осуществляется через метод route().
\TAO::navigation()->route()->render()
Перед выводом желательно организовать проверку на принадлежность ссылки страницы к навигации. Если страница не входит в навигацию, метод route() отдаст null.
if ($route = \TAO::navigation()->route()) print $route->render();
Добавление ссылок в навигационную цепочку крошек
Для этого существуют следующие методы:
- add($data) - добавление одной ссылки в навигационную цепочку.
- addArray($struct) - добавление массива ссылок в навигационную цепочку.
Формат добавления следующий:
\TAO::navigation()->route()->add(['url' => $this->url(), 'title' => $this->title()]);
\TAO::navigation()->route()->addArray([
['url' => $this['LIST_PAGE_URL'], 'title' => $this->infoblock()->title()],
['url' => $this->url(), 'title' => $this->title()],
]);