Мы уже создавали грид. Теперь добавим возможность выделить несколько строк галочками и применить к ним действие (например, «Удалить» или «Активировать»).
Шаг 1: Настройка компонента
В параметрах bitrix:main.ui.grid нужно включить чекбоксы и описать доступные действия.
'SHOW_ROW_CHECKBOXES' => true,
'SHOW_CHECK_ALL_CHECKBOXES' => true,
'SHOW_ACTION_PANEL' => true,
'ACTION_PANEL' => [
'GROUPS' => [
'TYPE' => [
'ITEMS' => [
[
'TYPE' => \Bitrix\Main\Grid\Panel\Types::BUTTON,
'ID' => 'apply_button',
'CLASS' => 'apply',
'TEXT' => 'Применить',
'ONCHANGE' => [
[
'ACTION' => \Bitrix\Main\Grid\Panel\Actions::CALLBACK,
'DATA' => [
['JS' => "Grid.sendSelected()"] // Отправка формы грида
]
]
]
],
[
'TYPE' => \Bitrix\Main\Grid\Panel\Types::DROPDOWN,
'ID' => 'action_button_my_grid', // ID селекта действий
'NAME' => 'action_button_my_grid',
'ITEMS' => [
['NAME' => '(выберите действие)', 'VALUE' => 'none'],
['NAME' => 'Активировать', 'VALUE' => 'activate'],
['NAME' => 'Удалить', 'VALUE' => 'delete'],
]
],
],
]
],
],Шаг 2: Обработка запроса (PHP)
Когда пользователь нажимает «Применить», грид отправляет POST-запрос на текущую страницу (или на ту, что указана в форме).
Нам нужно перехватить этот запрос, получить список ID и выполнить действие.
$request = \Bitrix\Main\Context::getCurrent()->getRequest();
if ($request->isPost() && check_bitrix_sessid() && $request->get('grid_id') == $gridId) {
// Получаем выбранное действие
$action = $request->get('action_button_' . $gridId);
// Получаем ID отмеченных строк
$ids = $request->get('ID');
// Обработка "Для всех" (если нажата галочка "Для всех")
$actionAll = $request->get('action_all_rows_' . $gridId);
if ($actionAll == 'Y') {
// Если выбраны "Все", то $ids может быть пустым.
// Нужно сделать выборку из БД с текущим фильтром (см. статью про Filter)
// и получить все ID.
$ids = \My\Table::getList(['select' => ['ID'], 'filter' => $currentFilter])->fetchAll();
$ids = array_column($ids, 'ID');
}
if (!empty($ids) && $action) {
foreach ($ids as $id) {
switch ($action) {
case 'delete':
\My\Table::delete($id);
break;
case 'activate':
\My\Table::update($id, ['ACTIVE' => 'Y']);
break;
}
}
}
}Важные нюансы:
- Grid.sendSelected(): Этот JS-метод (где Grid — это JS-объект грида) собирает все отмеченные чекбоксы и отправляет их POST-запросом.
- Обработка «Для всех»: Это самый сложный момент. Грид не передает ID всех 1000 элементов. Он передает флаг action_all_rows_GRID_ID = Y. Вам нужно самостоятельно повторить запрос к БД с текущим фильтром, чтобы узнать, к каким именно элементам применять действие.
Вывод:
Групповые действия делают работу с данными эффективной.
Реализация требует аккуратной работы с request и понимания того, как грид передает данные о «выбранных всех» записях.
main.ui.grid групповые действия, action_button, processAction, удаление в гриде, чекбоксы битрикс грид, панель действий, apply_filter.