Навигация - 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/' => 'Контакты',
]

Передавать можно не только простой массив ссылок.

  1. Мнемокод инфоблока в конструкции вида 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(),
  1. Если ссылки необходимо формировать каким-то хитрым способом, то можно вызвать свой метод.

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

'sub' => 'infoblock:cats:my_navigation',

где, my_navigation - имя собственного метода, который формирует вложенный список каким-то образом.

И для бандла:

'sub' => 'bundle:Cats:my_navigation',

Здесь соответственно указывается имя бандла, а метод формирования списка my_navigation описывается в классе бандла.

  1. 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. Как правило, в этом файле описывается структура главного меню. А если в другой части сайта (например, в футере) требуется вывести меню со своей структурой? Вопрос решается следующим образом:

  1. В папку /local/ (там же, где и .navigation.php) кладем свой файл с произвольным именем .my_menu.php. В котором описываем альтернативную структуру навигации.

  2. В шаблоне при выводе навигации передаем в метод navigation() имя файла с альтернативной навигацией.

print \TAO::navigation('my_menu')->route()

Уровни навигации

Для отображения второго и последующих уровней навигации необходимо воспользоваться методом level($n).

print \TAO::navigation()->level(1)->render();

Нумерация, как в ТАО, начинается с нуля. Поэтому запись:

\TAO::navigation()->level(0)->render()

аналогична непосредственному вызову навигации.

Необходимо использовать проверку существования уровня перед выводом, иначе будет возвращена ошибка (например, для корневого уровня).

Фильтрация

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

  1. В файле .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()],
]);