Success-страница после оформления заказа

Сделал по данному мануалу:
1. добавил параметр в системные minishop2


2. создал файл customorder.class.php в /core/components/minishop2/custom/order/ и зарегистрировал по документации через console


3. Прописал в настройках


4. Проверял как указано делая опечатку, ошибка 500 есть, класс подключен. Вот код файла нового обработчика:
<?php
class customOrderInterface extends msOrderHandler {
    public function submit($data = [])
    {
        $response = $this->ms2->invokeEvent('msOnSubmitOrder', [
            'data' => $data,
            'order' => $this,
        ]);
        if (!$response['success']) {
            return $this->error($response['message']);
        }
        if (!empty($response['data']['data'])) {
            $this->set($response['data']['data']);
        }

        $response = $this->getDeliveryRequiresFields();
        if ($this->ms2->config['json_response']) {
            $response = json_decode($response, true);
        }
        if (!$response['success']) {
            return $this->error($response['message']);
        }
        $requires = $response['data']['requires'];

        $errors = [];
        foreach ($requires as $v) {
            if (!empty($v) && empty($this->order[$v])) {
                $errors[] = $v;
            }
        }
        if (!empty($errors)) {
            return $this->error('ms2_order_err_requires', $errors);
        }

        $user_id = $this->ms2->getCustomerId();
        if (empty($user_id) || !is_int($user_id)) {
            return $this->error(is_string($user_id) ? $user_id : 'ms2_err_user_nf');
        }

        $cart_status = $this->ms2->cart->status();
        if (empty($cart_status['total_count'])) {
            return $this->error('ms2_order_err_empty');
        }

        $delivery_cost = $this->getCost(false, true);
        $cart_cost = $this->getCost(true, true) - $delivery_cost;
        $num = $this->getNewOrderNum();

        /** @var msOrder $msOrder */
        $msOrder = $this->storageHandler->getForSubmit(
            compact('user_id', 'num', 'cart_cost', 'cart_status', 'delivery_cost')
        );

        $response = $this->ms2->invokeEvent('msOnBeforeCreateOrder', [
            'msOrder' => $msOrder,
            'order' => $this,
        ]);
        if (!$response['success']) {
            return $this->error($response['message']);
        }

        if ($msOrder->save()) {
            $response = $this->ms2->invokeEvent('msOnCreateOrder', [
                'msOrder' => $msOrder,
                'order' => $this,
            ]);
            if (!$response['success']) {
                return $this->error($response['message']);
            }

            if ($this->storage === 'session') {
                $this->ms2->cart->clean();
                $this->clean();
            }
            if (empty($_SESSION['minishop2']['orders'])) {
                $_SESSION['minishop2']['orders'] = [];
            }
            $_SESSION['minishop2']['orders'][] = $msOrder->get('id');

            // Trying to set status "new"
            $status_new = $this->modx->getOption('ms2_status_new', null, 1);
            $response = $this->ms2->changeOrderStatus($msOrder->get('id'), $status_new);
            if ($response !== true) {
                return $this->error($response, ['msorder' => $msOrder->get('id')]);
            }

            // Reload order object after changes in changeOrderStatus method
            /** @var msOrder $msOrder */
            $msOrder = $this->modx->getObject('msOrder', ['id' => $msOrder->get('id')]);

            /** @var msPayment $payment */
            $payment = $this->modx->getObject(
                'msPayment',
                ['id' => $msOrder->get('payment'), 'active' => 1]
            );
            if ($payment) {
                $response = $payment->send($msOrder);
                if ($this->config['json_response']) {
                    @session_write_close();
                    echo is_array($response) ? json_encode($response) : $response;
                    die();
                }
                if (!empty($response['data']['redirect'])) {
                    $this->modx->sendRedirect($response['data']['redirect']);
                }
                if (!empty($response['data']['msorder'])) {
                    $redirect = $this->modx->context->makeUrl(
                        $this->modx->resource->id,
                        ['msorder' => $response['data']['msorder']]
                    );
                    $this->modx->sendRedirect($redirect);
                }
                $this->modx->sendRedirect($this->modx->context->makeUrl($this->modx->resource->id));
            } else {
                if ($this->config['json_response']) {
                    /** Вот мои изменения ниже */
                    $success_page = $this->modx->getOption('ms2_order_success_page');
                    if(is_numeric($success_page)) {
                        if ($this->modx->getCount('modResource', array('id'=>$success_page,'published' => true,'deleted' => false))) {
                            $url = $this->modx->context->makeUrl($success_page);
                            return $this->success('', array('redirect' => $url.'?msorder='.$order->get('id')));
            	        }
                    }
                    return $this->success('', ['msorder' => $msOrder->get('id')]);
                }
                $redirect = $this->modx->context->makeUrl(
                    $this->modx->resource->id,
                    ['msorder' => $msOrder->get('id')]
                );
                $this->modx->sendRedirect($redirect);
            }
            return $this->success();
        }

        return $this->error();
    }
}
Но редиректа не происходит… Так же обновляется страница с ?msorder=ID заказа
MODX Revolution 2.8.4-pl
Minishop2 4.1.4-pl

Может кто подсказать в чем ошибка?
steve.kon
05 апреля 2023, 17:11
modx.pro
587
0

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

Артур Шевченко
05 апреля 2023, 20:38
0
Вот же у тебя условие написано по которому твой код должен отрабатывать
if ($this->config['json_response']) {}
По умолчанию оно false, ты где-то меняешь параметр json_response?
    steve.kon
    05 апреля 2023, 23:07
    0
    Нет, всё остальное стандартно
      Артур Шевченко
      06 апреля 2023, 16:32
      0
      Так значит надо либо условие убрать или установить значение true.
    Константин Ильин
    06 апреля 2023, 05:58
    0
    Залоггируйте каждый if используя
    $this->modx->log(1, print_r('переменная или строка/этап',1))
    Чтобы посмотреть куда заходит код и что он получает

    //Например этот участок кода
    
    if ($this->config['json_response']) {
        /** Вот мои изменения ниже */
        $success_page = $this->modx->getOption('ms2_order_success_page');
        $this->modx->log(1, print_r($success_page,1))
        if(is_numeric($success_page)) {
            if ($this->modx->getCount('modResource', array('id'=>$success_page,'published' => true,'deleted' => false))) {
                $this->modx->log(1, print_r('1-1',1))
                $url = $this->modx->context->makeUrl($success_page);
                return $this->success('', array('redirect' => $url.'?msorder='.$order->get('id')));
    	}
        }
        $this->modx->log(1, print_r('1-2',1))
        return $this->success('', ['msorder' => $msOrder->get('id')]);
    }
    $this->modx->log(1, print_r('2-1',1))
    $redirect = $this->modx->context->makeUrl(
        $this->modx->resource->id,
        ['msorder' => $msOrder->get('id')]
    );
    $this->modx->log(1, print_r('2-2'.$redirect,1))
    $this->modx->sendRedirect($redirect);
    А так у меня недавно была проблема с редиректом, но пока отложилась эта проблема, может что-то поменялось в обновлениях нынче раз не у меня одного проблема появилась.
      steve.kon
      06 апреля 2023, 13:23
      0
      Что-то у меня уже с 1ой такой записью (
      $this->modx->log(1, print_r($success_page,1))
      ) ошибка 500
        Константин Ильин
        06 апреля 2023, 16:28
        0
        Странно, видимо как-то надо еще подключать
        // попробовать так вызывать, указать явно PDO::LOG_LEVEL_ERROR
        $this->modx->log(xPDO::LOG_LEVEL_ERROR, '1-1');
        
        // тут я пальцем в небо, какие из этих строчек может помогут, но сначала то что выше написал попробуйте
        $this->modx->getService('error','error.modError');
        $this->modx->setLogLevel(xPDO::LOG_LEVEL_ERROR);

        ну как вариант еще в файл сохранять
        <?
        file_put_contents(MODX_ASSETS_PATH.'log.txt', print_r('1-1',1), FILE_APPEND | LOCK_EX);
          Александр Туниеков
          07 апреля 2023, 06:11
          0
          Точки с запятой нет после инструкии $this->modx->log(1, print_r($success_page,1))
          надо
          $this->modx->log(1, print_r($success_page,1));
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      8