Новое в блогах


Техноблог Обновление цен в каталоге интернет-магазина через CSV-файл 
Техноблог Подключаем и используем модуль «SEO Шаблоны»  1
Техноблог Использование модуля «Валюты» в интернет-магазине импортных товаров 
Техноблог HTTPS и Amiro.CMS  1
Личный опыт История от «Интер Электрик», #ОбновлениеЗаРассказ 
Личный опыт История от АвтоТехЦентр Субару Медведково, #ОбновлениеЗаРассказ 

Теги



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

ЗАДАЧА: Создать решение на основе стандартной рубрицированной новостной ленты 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–_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 и собрать архив дистрибутива в модуле «Генератор решений».

[04.12.13]  
Рейтинг: 3.429 (голосов: 7)
Комментировать

Теги: интеграцияAPIhow-toпримеры
 
Вернуться к списку
Ваш комментарий