[Расширяем 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;
}Итого
Собственно, это всё. Код постарался закомментировать, чтобы вам было понятнее в нём ориентироваться.
Комментарии: 6
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Затрагивается куча важных моментов по работе с modx в целом и с ms2 в частности. Благодаря подробным комментариям фактически получился отличный урок. Однозначно поможет не наступить на кучу грабель.
Павел, спасибо!