Делаем стоимость доставки у заказа в админке редактируемым полем

Всем привет!
Возникла задача, сделать поле стоимости доставки у заказа в админке редактируемым вручную.
Я, честно говоря, до сих пор не понимаю почему это не сделано из коробки — просто нет никакой возможности поменять стоимость доставки уже сделанного заказа из админки. Я не говорю про авто-пересчет через все нужные классы доставки, понятно, что трудно повторить их логику в рамках админки, но просто сделать поле вручную редактируемым не такая уж сложная задача.
Проблема следующая: если клиент при согласовании заказа решил сменить способ доставки, например с «Курьером» на «Самовывоз», как выставить стоимость доставки в 0 и пересчитать стоимость заказа? Вот и начинаются танцы с бубном, менеджеру надо пойти сделать ещё один заказ через фронт сайта, ну в общем, думаю, знакомая тема многим.

Итак решение, которое ничего не меняет в исходниках, а лишь делает ровно то, что должно:
В первую очередь нужно изменить тип поля «Стоимость доставки» в интерфейсе админки.
Файл отвечающий за отрисовку этого куска интерфейса лежит по следующему пути:
/assets/components/minishop2/js/mgr/orders/orders.window.js
Менять в нём что-то, мы разумеется не будем, но важно понять, что нужно будет переопределить.
Нам понадобится кусок кода начинающийся вот отсюда и до конца этого метода:


Также в этом файле ориентировочно на строке 111 как раз и описано наше поле «Стоимость доставки»

Видим, что тип поля displayfield(не редактируемое) и ширина 100% — это мы будем менять.

Теперь создаем плагин на событие msOnManagerCustomCssJs
<?php
/** @var modX $modx */
switch ($modx->event->name) {
  case 'msOnManagerCustomCssJs':
    $modx->controller->addHtml(
            "<script type='text/javascript'>
        Ext.override(miniShop2.window.UpdateOrder,{});</script>"
    );
    break;
}
Это основа плагина из которой нужно понять следующее:
Мы переопределяем с помощью метода Ext.override() кусок интерфейса, отвечающего за редактирование заказа в админке. Как видно первым параметром передается цель перезаписи, а вторым объект со всеми параметрами.
В коде выше я намеренно оставил его пустым, чтобы не копировать туда огромную портянку кода из файла, упомянутого выше. Поэтому просто копируем весь объект, который в файле передан третьим параметром, в наш плагин вместо пустого объекта.
Теперь в этом скопированном куске когда осталось лишь поменять тип поля «Стоимость доставки» с displayfield на textfield, ну и чтобы поле не было слишком длинным меняем параметр anchor со 100% на 30% этого более чем хватит.
Вот, что должно получится в итоге:


Сохраняем плагин (Не забываем повесить его на нужное событие) и проверяем результат:
Было:

Стало:

Теперь поле редактируемое и изменения стоимости доставки в нем будут сохраняться в заказе при нажатии на сохранить. Но стоимость заказа при это не будет пересчитываться, для этого мы в наш плагин, добавим ещё одно событие msOnBeforeUpdateOrder и обработаем его как нам нужно:
<?php
/** @var modX $modx */
switch ($modx->event->name) {
  case 'msOnManagerCustomCssJs':
    $modx->controller->addHtml(
            "<script type='text/javascript'>
        Ext.override(miniShop2.window.UpdateOrder,{});</script>"
    );
    break;
  case 'msOnBeforeUpdateOrder':
    $msOrder->set('cost', (int)$msOrder->get('cart_cost') + (int)$msOrder->get('delivery_cost'));
    break;
}
В этом событии нам доступен объект заказа, поэтому мы можем творить здесь что угодно.
В моем случае я пересчитал стоимость заказа простейшим способом сложив стоимость доставки и стоимость корзины. (int) я использовал чисто для моего случая, так как у меня все цены округлены до целых чисел, в Вашем случае там может быть (float) или что-то ещё.
На этом всё, сохраняем плагин (не забыв повесить ещё одно событие) и теперь при изменении стоимости доставки и нажатии кнопки сохранить будет пересчитываться стоимость заказа.
Семён Кудрявцев
31 марта 2021, 17:38
modx.pro
4
1 301
+10

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

Евгений Webinmd
31 марта 2021, 18:26
0
Отличная инструкция, спасибо, что-то подобное было раньше.
modx.pro/howto/15248
    Семён Кудрявцев
    31 марта 2021, 18:34
    0
    О, спасибо, как мне не хватало этой статьи, целый день искал решение, но эта статья не попадалась почему-то.
    В ней даже более элегантно сделано переопределение типа поля.
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    2