Как сделать страницу со списком элементов инфоблока - 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
Т.е. мы для данного условия переопределили точку входа. После этого все заработает.