Центр документации
Карта сайта

Создай визитку сам!


Самоучитель по интеграции дизайна и настройке Amiro.CMS на примере демонстрационной версии пакета Визитка »


Новостная лента с расширенными возможностями

Задача

Создать решение на основе стандартной рубрицированной новостной ленты Amiro.CMS c поддержкой категорийности.
Добавить возможность в панели управления любому элементу в ленте выставить свойство "Показывать на главной".
Создать дополнительный спецблок, который будет отображать список категорий, в каждой из которых выводится наиболее свежий элемент, отмеченный флагом "Показывать на главной". Если в категории нет ни одного элемента, отмеченного данным флагом, то категория в спецблоке не выводится.

Суть решения

Задача будет реализована следующим образом:

1. Добавим в модель новое поле-флаг show_on_mainpage.
Для этого модифицируем в дистрибутиве sql-файл содержащий запрос создания таблицы в БД.

2. Добавим на форму редактирования элемента панели управления флажок "Показывать на главной", который будет управлять флагом show_on_mainpage.
Для этого в методе инициализации отображения компоненты формы добавим новое поле и определим языковые переменные в файле локализаций.

3. Добавим в список элементов панели управления столбец "На главной", который будет выделять элементы, с установленным флагом.
Для этого в методе инициализации отображения компоненты списка добавим новый столбец и определим языковые переменные в файле локализаций. 

4. Создадим новый спецблок на основе стандартного и модифицируем его поведение согласно поставленной задаче.
Этот этап будет решен через подмену настроек спецблока и перехват события загрузки модели списка с модификацией запроса.

5. Зарегистрируем спецблок и дадим возможность указать его заголовок для Менеджера Сайта.
Сделаем это через определение ресурсов спецблока в файле деклараций и добавление в 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–_form.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 и собрать архив дистрибутива в модуле "Генератор решений".

Установка и настройка Руководство пользователя Интеграция дизайна Разработчикам (API)
 2000 – 2021 © Amiro.CMS Все права защищены.