Версия: 4.x
Добавляем фильтр по произвольному полю товара в административной панели

Что делать, если нужно добавить фильтрацию по собственным полям в административной панели? Ответ вы найдете в данной статье.

Реализовывать данную задачу мы будем из нашего кастомного модуля ModuleName. Как обычно исходим из того, что простейший модуль создан и установлен в вашем магазине.

Предположим, у нашего товара есть несколько произвольных полей, созданных в стороннем модуле с помощтю обработки события orm.init.catalog-product.

Файл config/handlers.inc.php

<?php
namespace ModuleName\Config;
use \RS\Orm\Type;
/**
* Класс предназначен для объявления событий, которые будет прослушивать данный модуль и обработчиков этих событий.
*/
class Handlers extends \RS\Event\HandlerAbstract
{
function init()
{
//Подписываемся на обработку события
$this->bind('orm.init.catalog-product');
}
/**
* Добавляет поля в объект заказа
*
* @param \Shop\Model\Orm\Order $order
*/
public static function ormInitCatalogProduct(\Catalog\Model\Orm\Product $product)
{
$product->getPropertyIterator()->append(array(
t('Произвольные поля'),
'custom_date' => new Type\Datetime(array(
'description' => t('Произвольное поле - дата и время')
)),
'custom_string' => new Type\Varchar(array(
'description' => t('Произвольное поле - строка')
)),
'custom_integer' => new Type\Integer(array(
'description' => t('Произвольное поле - число')
)),
'custom_list' => new Type\Enum(array(
'value1',
'value2',
'value3'
), array(
'description' => t('Произвольное поле - список'),
'listFromArray' => array(array(
'value1' => 'Значение 1',
'value2' => 'Значение 2',
'value3' => 'Значение 3'
))
))
));
}
}

В дминистративной панели это будет выглядеть так:

demo3_customfields.jpg
Поля, добавленные к товару через сторонний модуль

Важно: После изменения состава полей ORM Объекта, необходимо сбросить кэш и перейти в раздел Управление -> Настройка системы и нажать на ссылку справа "Исправить структуру БД".

Далее, нам необходимо получить объект визуального помощника CrudCollection контроллера Catalog::Controller::Admin::Ctrl, чтобы откорректировать поля фильтра. Делаем это с помощью перехвата события controller.exec.catalog-admin-ctrl.index.

<?php
namespace ModuleName\Config;
use \RS\Orm\Type;
/**
* Класс предназначен для объявления событий, которые будет прослушивать данный модуль и обработчиков этих событий.
*/
class Handlers extends \RS\Event\HandlerAbstract
{
function init()
{
//Подписываемся на обработку события
$this
->bind('orm.init.catalog-product')
->bind('controller.exec.catalog-admin-ctrl.index');
}
/**
* Добавляем собственные фильтры
*
* @param $helper
*/
public static function controllerExecCatalogAdminCtrlIndex(\RS\Controller\Admin\Helper\CrudCollection $helper)
{
$filter_date = new \RS\Html\Filter\Type\DateRange('custom_date', t('Фильтр по дате'));
$filter_string = new \RS\Html\Filter\Type\DateRange('custom_string', t('Фильтр по строке'));
$filter_integer = new \RS\Html\Filter\Type\Text('custom_integer', t('Фильтр по числу'));
$filter_integer->setShowType(); //Отобразим выбор < = >, перед значением
$filter_list = new \RS\Html\Filter\Type\Select('custom_list', t('Фильтр по списку'), array(
'' => t('Не выбрано'),
'value1' => 'Значение 1',
'value2' => 'Значение 2',
'value3' => 'Значение 3'
));
$line = new \RS\Html\Filter\Line(); //Создадим объект - строка фильтров(или группа фильтров)
$line->addItem($filter_date);
$line->addItem($filter_string);
$line->addItem($filter_integer);
$line->addItem($filter_list);
$helper
->getFilter() //Получим объект фильтра \RS\Html\Filter\Control
->getContainer() //Получим главный контейнер со строками фильтров
->addLine($line); //Добавим в него строку с фильтрами
}
/**
* Добавляет поля в объект заказа
*
* @param \Shop\Model\Orm\Order $order
*/
public static function ormInitCatalogProduct(\Catalog\Model\Orm\Product $product)
{
//....
}
}

После корректировки состава полей для фильтрации необходимо очистить кэш и посмотреть на результат в административной панели.

demo3_filter.jpg
Добавленные в фильтр поля