Блог Горошко Андрея 1C-Битрикс Групповые действия в main.ui.grid: Обработка чекбоксов и панели действий

Групповые действия в main.ui.grid: Обработка чекбоксов и панели действий

Средний рейтинг
Еще нет оценок

Мы уже создавали грид. Теперь добавим возможность выделить несколько строк галочками и применить к ним действие (например, «Удалить» или «Активировать»).

Шаг 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;
            }
        }
    }
}

Важные нюансы:

  1. Grid.sendSelected(): Этот JS-метод (где Grid — это JS-объект грида) собирает все отмеченные чекбоксы и отправляет их POST-запросом.
  2. Обработка «Для всех»: Это самый сложный момент. Грид не передает ID всех 1000 элементов. Он передает флаг action_all_rows_GRID_ID = Y. Вам нужно самостоятельно повторить запрос к БД с текущим фильтром, чтобы узнать, к каким именно элементам применять действие.

Вывод:
Групповые действия делают работу с данными эффективной.

Реализация требует аккуратной работы с request и понимания того, как грид передает данные о «выбранных всех» записях.


main.ui.grid групповые действия, action_button, processAction, удаление в гриде, чекбоксы битрикс грид, панель действий, apply_filter.

Мой рейтинг:

Добавить комментарий

Related Post

Современная работа с разделами инфоблоков: SectionTable::getList в Bitrix D7 ORMСовременная работа с разделами инфоблоков: SectionTable::getList в Bitrix D7 ORM

Средний рейтинг Еще нет оценок Продолжая осваивать D7 ORM, перейдем от элементов к разделам. Для работы с разделами инфоблоков в современном API предназначен класс \Bitrix\Iblock\SectionTable. Он предоставляет тот же мощный и

Правильное использование BB кода в 1С-БитриксПравильное использование BB кода в 1С-Битрикс

Средний рейтинг Еще нет оценок В 1С-Битрикс BB код используется для форматирования текста в различных модулях, таких как форумы, задачи, блоги и комментарии. Для его обработки используется класс CTextParser. Вот

Оптимизация Highload-блоков: Кэширование скомпилированных сущностейОптимизация Highload-блоков: Кэширование скомпилированных сущностей

Средний рейтинг Еще нет оценок При работе с HL-блоками мы постоянно пишем: Метод compileEntity «на лету» собирает класс сущности, анализируя пользовательские поля. Это требует ресурсов. Если вы вызываете этот код в цикле