Источник: https://dzen-code.ru/october-cms-add-action-controller-list/
Есть список, в моем случае например товаров. Необходимо добавить какое-либо действие для обработки списка. Мне было необхдимо сделать функционал клонирования товара.
Мы идем в директорию с плагином и собственно с контроллером, который модифицируем.
У меня для примера /alex/catalog/controllers/Products.php
Так же нам понадобиться шаблон тулбара.
Тут уже кнопка у меня добавлена. Изначально шаблон был без нее.
Шаблон находим /alex/catalog/controllers/products/_list_toolbar.htm
Сам шаблон
<div data-control="toolbar">
<a href="<?= Backend::url('webfamily/catalog/products/create') ?>"
class="btn btn-primary oc-icon-plus"><?= e(trans('backend::lang.form.create')) ?></a>
<button
class="btn btn-default oc-icon-trash-o"
disabled="disabled"
onclick="$(this).data('request-data', {
checked: $('.control-list').listWidget('getChecked')
})"
data-request="onDelete"
data-request-confirm="<?= e(trans('backend::lang.list.delete_selected_confirm')) ?>"
data-trigger-action="enable"
data-trigger=".control-list input[type=checkbox]"
data-trigger-condition="checked"
data-request-success="$(this).prop('disabled', true)"
data-stripe-load-indicator>
<?= e(trans('backend::lang.list.delete_selected')) ?>
</button>
<button
class="btn btn-primary oc-icon-copy"
onclick="$(this).data('request-data', {
checked: $('.control-list').listWidget('getChecked')
})"
data-request="onCopy"
>Скопировать
</button>
<a href="<?= Backend::url('webfamily/catalog/products/import') ?>"
class="btn btn-primary"><?= e(trans('webfamily.catalog::lang.common.import')) ?></a>
</div>
Как видно в шаблоны указаны все кнопки в том числе и новая мной созданная
“Скопировать”. На нее ставим data-request=“Ваш обработчик” и фунцкию onclick, я взял с кнопки удаления. Суть js - забирать id-шники чекнутых итемов и передавать их на экшн.
Идем далее. Возвращаемся к контроллеру и прописываем обработчик.
/**
* @return
* Копирование товара
*/
public function onCopy() {
// Проверка на чекнутые товары
if (($checkedIds = post('checked')) && is_array($checkedIds) && count($checkedIds)) {
// Первый чекнутый // Делаем действия либо с одним
// $copy_id = post("checked")[0];
// Либо делаем действие со списком ID
foreach ($checkedIds as $checkedId) {
// Делаем дела ...........
}
Flash::success('Товар скопирован');
}
return $this->listRefresh();
}
Я обрабатывал только первый чекнутый. То есть у меня он в принципе должен быть выбран один. Вы можете обработать несколько. На выходе я вывожу Флэш сообщение и перезагружаю список.
Собственно все.