Ошибка в расчете стоимости доставки и заказа

Возникает ошибка в расчете стоимости доставки и заказа

Действовал по инструкции https://docs.modx.pro/components/minishop2/development/services/connection

1) создал класс доставки
{core_path}components/minishop2/custom/delivery/cdekwidget.class.php
<?php
if(!class_exists('msDeliveryInterface')) {
    require_once dirname(dirname(dirname(__FILE__))) . '/model/minishop2/msdeliveryhandler.class.php';
}
class msDeliveryHandler_cdekwidget extends msDeliveryHandler{
    public function getCost(msOrderInterface $order, msDelivery $delivery, $cost = 0) {
        session_start();
        $cart = $this->ms2->cart->status();
        $cart_cost = $cart['total_cost'];
        $delivery_cost = $_SESSION['cdek_delivery_price'] ?? 0;
        $total_cost = $cart_cost + $delivery_cost;
        return (float) $total_cost;
    }
}
Тут изначально возвращал
$delivery_cost
, но тогда неверно считалось, действия в корзине идут именно с
return (float) $total_cost;


2) Зарегистрируем службу через console

if ($miniShop2 = $modx->getService('miniShop2')) {
  $miniShop2->addService('delivery', 'CDEKwidget',
      '{core_path}components/minishop2/custom/delivery/cdekwidget.class.php');
}

3) Выбрал обработчик в способе доставки msDeliveryHandler_cdekwidget

Теперь действия в корзине

При выборе способа доставки и расчетов, корректно обновляется общая стоимость заказа, с учетом доставки (через минишоповский скрипт), далее если в консоли посмотреть запросы, то
/assets/components/minishop2/action.php
возвращает все верно
{
	"success": true,
	"message": "",
	"data": {
		"cost": 255,
		"cart_cost": 10,
		"discount_cost": 0,
		"delivery_cost": 245
	}
}
Но после оформления заказа в админке отображается как стоимость товаров 0, а стоимость доставки 245.
Никаких сторонних плагинов нет.

MODX Revo 2.8.4
Minishop2 3.0.7-pl
PHP Version 7.4.33

Скрин с заказом в админке
Dima
10 апреля 2025, 17:27
modx.pro
1 377
0

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

Dima
11 апреля 2025, 14:26
0
Была моя же проблема в неправильном расчете.
Я получал моментальный/текущий расчет, но не учитывал дальнейшую обработку уже, скорее, в момент заказа.

Немного подправил класс доставки и использовал не текущую стоимость $cart, а именно передаваемую $cost
<?php

if(!class_exists('msDeliveryInterface')) {
    require_once dirname(dirname(dirname(__FILE__))) . '/model/minishop2/msdeliveryhandler.class.php';
}
class msDeliveryHandler_cdekwidget extends msDeliveryHandler implements msDeliveryInterface {
    public function getCost(msOrderInterface $order, msDelivery $delivery, $cost = 0.0) {
        session_start();
        $delivery_cost = $_SESSION['cdek_delivery_price'] ?? 0; 
        return $cost + $delivery_cost;
    }
}
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    1