Как сделать страницу со списком элементов инфоблока - techart/bitrix.tao GitHub Wiki

Итак есть инфоблок, например, котиков (cats). Создан шаблон local/views/cats/teaser.phtml. Нужно сделать страницу с адресом /cats/ для отображения списка котиков.

Способ 1: через автоматический механизм

В local/php_interface/init.php добавляем маршрут:

\TAO::addRoute('{^/cats/$}', array('elements_of' => 'cats'));

По умолчанию сортировка [SORT => asc, NAME => asc]. Изменим порядок сортировки:

\TAO::addRoute('{^/cats/$}', array(
    'elements_of' => 'cats', 
    'order' => array('NAME' => 'desc')
));

Добавим постраничный вывод с навигацией снизу:

\TAO::addRoute('{^/cats/$}', array(
    'elements_of' => 'cats', 
    'order' => array('NAME' => 'desc'),
    'per_page' => 3,
    'pager_var' => 'page',
    'pager_bottom' => true,
));

Нам не нравится get-параметр page в адресе страницы - /cats/?page=2. Хотим чтобы было /cats/page-2/. Для этого добавим в init.php:

// local/init.php
\TAO\Urls::addVar('page');

Теперь мы хотим вывести произвольный текст над списком котиков. Текст должен редактироваться из админки. Для этого существует поле "Описание" в настройках инфоблока - заполните его, и оно выведется над списком. А если нужно вывести текст и над списком, и после списка? Тогда внедрите в текст строку {{ELEMENTS}}:

Наши котики - всем котикам котики!
{{ELEMENTS}}
А не наши нам неинтересны!

А теперь нам нужно вывести не всех котиков, а отфильтровать по значению свойства FOO:

\TAO::addRoute('{^/cats/$}', array(
    'elements_of' => 'cats', 
    'order' => array('NAME' => 'desc'),
    'filter' => array('PROPERTY_FOO' => 2),
));

Обратите внимание, что в этом случае выведутся даже те котики, у которых флаг активности отключен. Это произошло потому, что мы переопределили фильтр по умолчанию, в котором учитывался флаг активности. Поэтому если используем фильтр, то не забываем про активность:

\TAO::addRoute('{^/cats/$}', array(
    'elements_of' => 'cats', 
    'order' => array('NAME' => 'desc'),
    'filter' => array('PROPERTY_FOO' => 2, 'ACTIVE' => 'Y'),
));

Примечание: параметры order и filter - это те самые значения, которые передаются в стандартную функцию GetList(). Читайте документацию по API битрикса - и будет вам счастье.

А теперь - вишенка на торте: сделаем так, чтобы значение FOO не было прибито гвоздями, а передавалось в адресе страницы. Например /cats/foo576/.

\TAO::addRoute('{^/cats/foo(\d+)/$}', array(
    'elements_of' => 'cats', 
    'order' => array('NAME' => 'desc'),
    'filter' => array('PROPERTY_FOO' => '{1}', 'ACTIVE' => 'Y'),
));

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

И теперь - про переопределение шаблонов. Если нужно вывести элементы в другом шаблоне, то можно просто изменить item_mode:

TAO::addRoute('{^/cats/$}', array(
    'elements_of' => 'cats', 
    'item_mode' => 'gallery',
));

В этом случае создайте шаблон gallery.phtml, отображающий одну запись. Если нужно изменить весь шаблон страницы, то скопируйте local/vendor/techart/bitrix.tao/views/elements-page.phtml к себе в local/views/cats и изменяйте его как хотите. Можно скопировать с другим именем и указать это имя так:

TAO::addRoute('{^/cats/$}', array(
    'elements_of' => 'cats', 
    'page_mode' => 'my-cool-page',
));

Способ 2: создать страницу средствами Bitrix.TAO

Создадим файл local/pages/cats.phtml.

\TAO::app()->SetTitle('Котики');
print \TAO::infoblock('cats')->render();

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

Способ 3: создать страницу средствами битрикса, но вывести список не компонентом, а через TAO

Тут даже и говорить не о чем. Создаем страницу, но вместо богомерзкого компонента news (для вывода котиков, ага!) пишем все тот же \TAO::infoblock('cats')->render().

Способ 4: через контроллер

Тут уже работает механизм бандлов. Создаем контроллер с соответствующим экшеном, шаблон для этого экшена, маршрут для его вызова. Все как у взрослых. Но это опишем как-нибудь потом.

Как организовать роутинг адресов списка записей, если точка входа не определена

В случае, если точка входа не определена (.htaccess не переопределен), для организации показа списка записей необходимо зайти в админку в Настройки / Обработка адресов / Правила обработки, и прописать правило для адреса со списком.

Условие: #^/shops/#

Правило: /local/vendor/techart/bitrix.tao/urlrewrite.php

Т.е. мы для данного условия переопределили точку входа. После этого все заработает.