Редирект на свою страницу после оформления заказа

Для Minishop2 версий >= 2.4.* Думаю, информация будет полезна начинающим разработчикам: можно на простой задаче заодно и немного разобраться в логике работы магазина.

После долгого перерыва вспоминая работу с MS2, наткнулся на отсутствие возможности использовать параметр «tplSuccess» msOrder. Напомню верный способ редиректа на старых версиях MS2: modx.pro/help/7462/. В новой версии такое не получится.

Однако можно чуть изменить логику работы класса msOrderHandler.

1. Создаём ресурс а-ля «Спасибо за заказ!»
2. Добавляем системную настройку «ms2_order_success_page» («ID ресурса подтверждения заказа») = id созданного в п.1 ресурса
2. Расширяем класс msOrderHandler, как описано в документации и копируем в него метод submit из msOrderHandler:
class customOrderInterface extends msOrderHandler {
    public function submit($data = array()) {
        ...
    }
}
3. Выбираем класс-обработчик в настройках, параметр ms2_order_handler_class, значение «customOrderInterface». Сохраняем и проверяем работу сайта: сохраняем заказ, всё должно быть нормально.
Чтобы удостовериться, что работает именно ваш новый класс, можете сделать в нём опечатку, получите 500 ошибку в консоли :)
4. Изменяем метод submit:
public function submit($data = array()) 
...
    if ($this->ms2->config['json_response']) {
         return $this->success('', array('msorder' => $order->get('id')));
     } 
...
}
изменяем на:
public function submit($data = array()) 
    ...
    if ($this->ms2->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('', array('msorder' => $order->get('id')));
      }
... 
}

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

В принципе, я думаю можно сделать редирект js-колбэком или плагином (хотя я не вижу подходящего события, на которое можно повесить редирект без обрушения логики обработки заказа), но в данном случае мне нужна возможность изменения ресурса подтверждения заказа, что и привело к такому решению задачи.
Алексей Шумаев
02 июня 2017, 22:06
modx.pro
20
5 262
+7
Поблагодарить автора Отправить деньги

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

Vladimir Glukhov
28 марта 2018, 12:39
0
Напомню верный способ редиректа на старых версиях MS2: modx.pro/help/7462/. В новой версии такое не получится.
а почему не получится? у меня этот метод работает и на 2.4.12
    Владимир
    05 июня 2018, 12:01
    1
    0
    спасибо, все работает замечательно

    Единственный момент, если у вас есть вариант оплаты Наличными при получении, нужно вот здесь

    elseif ($payment = $this->modx->getObject('msPayment',
    	array('id' => $order->get('payment'), 'active' => 1))
    )
    заменить на

    elseif ($payment = $this->modx->getObject('msPayment',
    	array('id' => $order->get('payment'), 'active' => 1) && $order->get('payment') != 1)
    			)
    где 1 — ID оплаты Наличными при получении
      mekirile
      18 декабря 2018, 12:24
      0
      А как редиректить пользователя при выборе онлайн-оплаты? Чтобы он уходил не на платёжную систему, а эту самую страницу ms2_order_success_page
        Алексей Шумаев
        18 декабря 2018, 13:14
        0
        Это зависит от модуля оплаты, который вы используете.
        Рецепта на все случаи нет )
        Andrew
        15 февраля 2021, 11:22
        0
        Добрый день!
        Подскажите, где промахнулся…

        1. Создал файл
        path — > components/minishop2/custom/order/myOrderHandler.class.php

        2. Вложил
        class myOrderHandler extends msOrderHandler

        public function submit($data = array())
            {
                if ($this->ms2->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('', array('msorder' => $order->get('id')));


        3. Создал парметр: ms2_order_success_page => id-ресурса на который хочу редиректнуть

        4. Открыл консоль, вписал

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


        5. В парметр ms2_order_handler_class => myOrderHandler

        6. Зашел в настройки MS2-Самовывоз-Моего класса нет.

        7. Загрустил…
          Алексей Шумаев
          15 февраля 2021, 11:43
          +1
          Добрый!

          1. не очень понятно, при чём тут Самовывоз — это не order, а delivery
          Ты подключаешь кастомный класс заказа, не доставки.
          2. проверь, что в системной настройке ms2_services

          И ещё важный момент — этот пост старый, что в текущих версиях MS2 — я не скажу сейчас, возможно, что всё уже немного иначе )

          Думаю, вот тут вся информация по расширению класса доставки.
            Andrew
            15 февраля 2021, 11:58
            0
            Благодарю за быстрый ответ!
            Я сделал стандартным методом, а тут решил попробовать поработать с классами. )

            Да, я находил информацию, что в новых версиях MS2 ребята хотят внести функционал в коробку.
            Если правильно понял, конечно же.

            Еще раз, благодарю! Пошел обучаться! )
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          7