Агрегатор используется для вывода в одном инфоблоке данных из разных компонентов (инфоблоков). Например, если на главной странице интернет-магазина необходимо вывести блок "Хиты продаж", в который войдут товары разных типов (компонентов).
Компонент-агрегатор оперирует виртуальными полями, то есть создавать поля для компонента не нужно. Для сопоставления полей, которые будут использованы в агрегаторе, с полями исходных компонентов необходимо в системных настройках компонента прописать следующее:
// подключаем файл класса агрегатора и создаем объект агрегатора require_once $nc_class_agregator_path; $agregator_settings = new nc_class_aggregator_setting(); // создаем виртуальные поля, которые понадобятся в шаблонах вывода $agregator_settings->register_fields('Name', 'BigImage', 'Price', 'Property1', 'Property2', 'Property3'); // для каждого компонента, откуда берутся данные, составляем соответствие: в данном случае поле агрегатора Property1 из компонента номер 352 "возьмет" поле Screen, а из компонента 353 - Genre $agregator_settings->add_class(352)->register_fields('Name', 'Image', 'Price', 'Screen', 'ScreenType', 'Camera')->field_as_message_name('Name'); $agregator_settings->add_class(353)->register_fields('Name', 'Image', 'Price', 'Genre', 'NumberPages', 'Cover')->field_as_message_name('Name');
Следующий шаг - верстка отображения. Объекты в списке выводятся так же, как и обычные компоненты, как будто виртуальные поля являются обычными. При необходимости, шаблонов вывода может быть много.
Компонент-агрератор должен иметь минимум два поля: номер исходного компонента и номер объекта этого компонента, которые нужны вывести. Эти поля нужно добавить с названиями db_Class_ID и db_Message_ID соответственно, оба целые числа. Теперь пользователь может добавлять объекты из указанных компонентов. Но, чтобы он оперировал названиями, а не числами, необходимо настроить альтернативные формы добавления и изменения объектов агрегатора. Для этого сгенерируем формы по умолчанию и заменим фрагмент, выводящий поля ввода чисел, на следующую конструкцию:
$nc_class_aggregator->get_class_select() $nc_class_aggregator->get_message_select_area('Товар:')
вместо
nc_int_field("db_Class_ID", "maxlength='12' size='12'", $classID, 1) nc_int_field("db_Message_ID", "maxlength='12' size='12'", $classID, 1)
Комментарии 2