[Расширяем miniShop2] Быстрая смена статуса заказа через контекстное меню


Заказчика запарило для смены статуса лазать в полное редактирование заказа, попросил сделать что-то быстрое и простое. На скриншоте выше конечный результат. Чтобы получить такой же, файлы из этого репозитория закиньте себе в папку /assets/ и создайте плагин, который описан в конце статьи. Однако, я настоятельно рекомендую почитать статью, чтобы понимать принцип расширения всего этого дела.

Был вариант сделать быстрое редактирование при двойном клике на колонку «Статус». Ну, как это обычно бывает – у гриды параметры autosave, save_action, save_callback, а у колонки editor. Заказчик сказал, что ему не удобно. А вот вариант смены статуса через контекстное меню его полностью устроил, говорит что это «максимально быстро».

Оговорочки


Вот здесь я уже отвечал, почему я не сделал это компонентом.
– В miniShop2 такое внедрять не хочу, вряд ли это много кому потребуется.

JavaScript


/assets/xminishop/js/extends/ms2.orders.grid.js

Здесь происходит расширение таблицы заказов.
Закомментировал, чтобы было понятнее ориентироваться в коде.

PHP


/assets/xminishop/connector.php

Коннектор, который пробрасывает все действия в наши процессоры.

/assets/xminishop/processors/mgr/orders/getlist.class.php

Процессор, расширяющий msOrderGetListProcessor. Нужен для того, чтобы добавить кнопку «Статус» и список статусов (в виде сабменю), которые может принять конкретный заказ.

/assets/xminishop/processors/mgr/orders/status.class.php

Процессор, в котором происходит обновление статуса заказа, в момент клика на нужный статус в контекстном меню.

Остальные процессоры нужны постольку-поскольку. Дело в том, что доступ к ним запрашивается через коннектор, который используется в гриде заказов. А т.к. мы туда подставили свой, то и процессоры, которые используются по-умолчанию, мы должны заменить (а точнее просто сослаться на них в своей файловой системе).

Плагин


Создаём плагин на событие msOnManagerCustomCssJs для подключения всех скриптов на странице таблицы с заказами. Назовём его, например xMiniShop:
<?php
switch ($modx->event->name) {
    case 'msOnManagerCustomCssJs':
        $assets_url = $modx->getOption('assets_url');
        if ($page === 'orders') {
            $config = [
                'connector_url' => $assets_url . 'xminishop/connector.php',
            ];
            $controller->head['js'][] = $assets_url . 'xminishop/js/xminishop.js';
            $controller->addHtml("<script type='text/javascript'>
                xMiniShop['config'] = {$modx->toJSON($config)};
            </script>");
            $controller->head['lastjs'][] = $assets_url . 'xminishop/js/extends/ms2.utils.js';
            $controller->head['lastjs'][] = $assets_url . 'xminishop/js/extends/ms2.orders.grid.js';
        }
        break;
}

Итого


Собственно, это всё. Код постарался закомментировать, чтобы вам было понятнее в нём ориентироваться.
Павел Гвоздь
12 января 2021, 20:54
modx.pro
14
261
+25
Поблагодарить автора Отправить деньги

Комментарии: 4

Sergey
18 января 2021, 11:27
+1
Паш супер! Спасибо что поделился!
    Павел Гвоздь
    18 января 2021, 11:31
    +1
    Благодарю за отзыв! Мне это очень ценно!
    Дмитрий Танцирев
    18 января 2021, 16:31
    +1
    Спасибо большое! Полезная фича =) Плюс объясняет как работать с контекстным меню в минишопе.
      Павел Гвоздь
      19 января 2021, 08:51
      +1
      👌 Позже может ещё одну прикольную фишечку опишу.
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      4