ЗАДАЧА: Создать решение на
основе стандартной рубрицированной новостной ленты Amiro.CMS c поддержкой
категорийности.
Добавить возможность в панели управления любому элементу в ленте
выставить свойство «Показывать на главной».
Создать дополнительный спецблок, который будет отображать список категорий, в
каждой из которых выводится наиболее свежий элемент, отмеченный
флагом «Показывать на главной». Если в категории нет ни
одного элемента, отмеченного данным флагом, то категория в спецблоке не
выводится.
Суть решения
Задача будет реализована
следующим образом:
- Добавим в модель
новое поле-флаг show_on_mainpage.
Для этого модифицируем в дистрибутиве sql-файл
содержащий запрос создания таблицы в БД. - Добавим на форму
редактирования элемента панели управления флажок "Показывать на
главной", который будет управлять флагом show_on_mainpage.
Для этого в методе инициализации отображения компоненты формы добавим
новое поле
и определим языковые переменные в файле локализаций. - Добавим в список
элементов панели управления столбец "На главной", который будет
выделять элементы, с установленным флагом.
Для этого в методе инициализации отображения компоненты списка
добавим новый столбец
и определим языковые переменные в файле локализаций. - Создадим новый
спецблок на основе стандартного и модифицируем его поведение согласно
поставленной задаче.
Этот этап будет решен через подмену настроек спецблока и перехват события
загрузки модели списка с модификацией запроса. - Зарегистрируем
спецблок и дадим возможность указать его заголовок для Менеджера Сайта.
Сделаем это через определение ресурсов
спецблока в файле деклараций
и добавление в Meta-файл
конфигурации решения информации о спецблоке.
Далее - подробная
пошаговая инструкция по реализации решения.
Реализация
Создание кода дистрибутива
Используя решение «Генератор
решений» создадим дистрибутив стандартной новостной ленты.

Добавление нового поля
Добавим поле
«Показать на главной» (show_on_mainpage) в модель, а так же список и
форму в панели администратора.
Для того чтобы новое
поле появилось в модели, его необходимо прописать в SQL файле создания таблицы
дистрибутива.
_local/modules/data/{genModId}/amiro.multifeeds_adv/distrib/configs/ami_multifeeds/advanced_feed/db/database.sql
`show_on_mainpage` tinyint(1) NOT NULL DEFAULT '0',
Добавим поле типа
checkbox на форму добавления/редактирования элемента панели администратора.
Для этого в файле
_local/modules/data/{genModId}/amiro.multifeeds_adv/code/AmiMultifeeds_AdvancedFeed_Adm.php
изменим метод инициализации отображения компоненты формы.
class AmiMultifeeds_AdvancedFeed_FormViewAdm extends Hyper_AmiMultifeeds_FormViewAdm{
public function init(){
parent::init();
$this->addField(array('name' => 'show_on_mainpage', 'type' => 'checkbox'));
}
}
В файл локализации
компоненты формы добавим языковые переменные для нового поля.
_local/modules/data/{genModId}/amiro.multifeeds_adv/distrib/configs/ami_multifeeds/advanced_feed/locales/--modId–_form.lng
%%form_field_show_on_mainpage%en%%
Show on Mainpage
%%form_field_show_on_mainpage%ru%%
Показывать на главной
Добавим отображение
столбца с индикатором поля в списке элементов модуля в панели администратора.
Для этого переопределим
метод инициализации компоненты списка.
_local/modules/data/{genModId}/amiro.multifeeds_adv/code/AmiMultifeeds_AdvancedFeed_Adm.php
class AmiMultifeeds_AdvancedFeed_ListViewAdm extends Hyper_AmiMultifeeds_ListViewAdm{
public function init(){
parent::init();
$this
->addColumn('show_on_mainpage')
->setColumnWidth('show_on_mainpage', 'narrow') // Малая ширина столбца
->setColumnAlign('show_on_mainpage', 'center') // Выравнивание по центру
// Формат отображения - иконка с классом checked
->formatColumn('show_on_mainpage', array($this, 'fmtColIcon'), array('class' => 'checked'));
}
}
В файл локализации
компоненты списка добавим языковые переменные для заголовка столбца.
_local/modules/data/{genModId}/amiro.multifeeds_adv/distrib/configs/ami_multifeeds/advanced_feed/locales/--modId–_list.lng
%%list_col_show_on_mainpage%en%%
Main page
%%list_col_show_on_mainpage%ru%%
На главной
Спецблок «Элементы на главной странице»
Поведение спецблока
"specblock_main" будет аналогично поведению стандартного спецблока
анонса новостей со срезкой по флагу "show_on_mainpage" с включенной
групировкой элементов по категориям, установленным лимитом количества элементов
в категории и сортировкой по дате в обратном порядке. Данные параметры, кроме
срезки по флагу, определяются опциями. Для реализации срезки понадобится
модифицираовать запросы выборки элементов.
В конструкторе
контроллера публичной части модуля добавим поддержку спецблока
"specblock_main", который будет отображать элементы на главной
странице.
_local/modules/data/{genModId}/amiro.multifeeds_adv/code/AmiMultifeeds_AdvancedFeed_Frn.php
public function __construct(AMI_Request $oRequest, AMI_Response $oResponse){
parent::__construct($oRequest, $oResponse);
if($this->isSpecblock()){
$this->addComponents(array('specblock'), array('postfix' => 'main'));
}
}
Добавим контроллер и
отображение компоненты нового спецблока.
// Контроллер спецблока
class AmiMultifeeds_AdvancedFeed_SpecblockMainFrn extends Hyper_AmiMultifeeds_SpecblockFrn{
public function getView(){
// Получение отображения
return $this->_getView('/' . $this->getType() . '_main/view/frn');
}
}
// Отображение спецблока
class AmiMultifeeds_AdvancedFeed_SpecblockMainViewFrn extends Hyper_AmiMultifeeds_SpecblockViewFrn{
public function get(){
$modId = $this->getModId();
// Регистрируем обработчик события on_list_load
AMI_Event::addHandler('on_list_load', array($this, 'handleListLoad'), $modId);
// Устанавливаем новые значения опций, сохраняя исходные значения в массив
$aReplacedOptions = AMI::replaceOptions(
$modId,
array(
'small_number_items' => 1,
'small_grp_by_cat' => true,
'small_items_sort_col' => 'date_created',
'small_items_sort_dim' => 'desc'
)
);
// Получаем html код спецблока
$result = parent::get();
// Возвращаем исходные значения опций
AMI::replaceOptions($modId, $aReplacedOptions);
// Удаляем обработчик события on_list_load
AMI_Event::dropHandler('on_list_load', array($this, 'handleEvent'));
return $result;
}
// Обработчик события on_list_load
// Добавляет срезку по полю show_on_mainpage в запросы получения списка элементов
public function handleListLoad($name, array $aEvent){
$aEvent['oList']->addSearchCondition(
array(
'show_on_mainpage' => 1
)
);
return $aEvent;
}
}
Для того, чтобы спецблок
стал доступен в менеджере сайта, его необходимо прописать в файлах декларации и
Meta-файле.
_local/modules/data/{genModId}/amiro.multifeeds_adv/code/AmiMultifeeds_AdvancedFeed_Meta.php
// ...
'specblock:main' => array(
'obligatory' => TRUE,
'type' => self::CAPTION_TYPE_STRING,
'locales' => array(
'en' => array(
'name' => 'Specblock caption for main page',
'caption' => 'Featured news',
),
'ru' => array(
'name' => 'Название спецблока для главной страницы сайта',
'caption' => 'Главные новости',
),
),
),
// ...
_local/modules/data/{genModId}/amiro.multifeeds_adv/distrib/configs/ami_multifeeds/advanced_feed/declaration/declaration.php
AMI::addResourceMapping(
array(
'##modId##/specblock_main/controller/frn' => '##classPrefix##_SpecblockMainFrn',
'##modId##/specblock_main/view/frn' => '##classPrefix##_SpecblockMainViewFrn'
)
);
_local/modules/data/{genModId}/amiro.multifeeds_adv/distrib/configs/ami_multifeeds/advanced_feed/declaration/properties.php
if($oDeclarator->isRegistered('##modId##')){
// ...
$oMod = $oDeclarator->getModule('##modId##');
$oMod->setProperty('taborder', $oDeclarator->getTabOrder('##modId##'));
$oMod->setProperty('spec_blocks', array('spec_small_##modId##', 'spec_small_##modId##_main'));
}
Добавляем файлы
изображений спецблока и иконку модуля.
_local/modules/data/{genModId}/amiro.multifeeds_adv/distrib/configs/ami_multifeeds/advanced_feed/icons/--modId–_main_specblock_ru.gif

_local/modules/data/{genModId}/amiro.multifeeds_adv/distrib/configs/ami_multifeeds/advanced_feed/icons/--modId--_specblock_ru.gif
_local/modules/data/{genModId}/amiro.multifeeds_adv/distrib/configs/ami_multifeeds/advanced_feed/icons/--modId--.gif
Остается поправить
содержимое файла manifest.xml и собрать архив дистрибутива в модуле «Генератор
решений».