В данном материале мы расскажем, как создать свой собственный обработчик для выполнения определенных действий с выбранными товарами. Например, если вы желаете сделать разовый экспорт выбранных администратором товаров на стороннюю площадку, или желаете установить какой-то флаг выбранным товарам, то данный материал будет вам полезен.
В общем виде задача состоит в том, что необходимо в нашем участке кода получить ID выбранных товаров. Для примера, в данной статье мы будем устанавливать выбранным товарам флаг публичности в положение "видим".
Реализовывать данную задачу мы будем из нашего кастомного модуля ModuleName. Исходим из того, что простейший модуль создан и установлен в вашем магазине.
Сперва необходимо добавить кнопку действия в панель действий с товарами, для этого перехватим событие controller.exec.catalog-admin-ctrl.index. Это событие происходит сразу после формирования визуального хелпера RS::Controller::Admin::Helper::CrudCollection. В нем уже сформирована структура будущего раздела административной панели, в котором уже присутствует описание структуры дерева категорий слева, колонок таблицы справа, кнопок в верхней и нижней панелей инструментов. Наша задача добраться до нижней панели и добавить в неё кнопку.
Создаем обработчик события в файле config/handlers.inc.php
Как видно из примера выше, мы добавили произвольную кнопку в нижнюю панель инструментов и с помощью классов микроразметки наделили её способностью передавать POST запросом выбранные ID элементов в таблице.
Далее необходимо создать контроллер, который будет обрабатывать входящий запрос. Создаем файл controller/admin/tools.inc.php.
Так как на странице со списком товаров в административной панели можно не просто выбрать товары, а выбрать еще флажок "Выбрать товары на всех страницах", нам необходимо обработать такую ситуацию. Технически это будет выглядеть так: будет передан дополнительный параметр selectAll=on в POST запросе.
Если мы получаем такой параметр, то нужно связаться с контроллером, который выводил товары. Только он знает какие были установлены в тот момент фильтры, и только он может корректно вернуть все ID товаров. Соответственно мы связываемся с контроллером Catalog::Controller::Admin::Ctrl и вызываем у него метод modifySelectAll, который вернет нам готовый результат в виде ID всех выбранных товаров.
Придерживаемся принципа минималистичности контроллера и не пишем непосредственно логику действий здесь. Вместо этого вызываем метод setAllVisible у созданного нами класса ProcessProductApi. Рассмотрим его подробнее.
Создадим класс модели, в котором реализуем непосредственную логику обновления поля рublic у товаров, для этого создадим файл /model/processproductapi.inc.php со следующим содержимым:
Все готово. Проверяем работу. Выбираем два товара непубличных товара, нажимаем на кнопку "Сделать публичными", видим успешный стикер.
В случае выполнения повторной попытки выполнить команду, видим красный стикер с ошибкой