Редирект на свою страницу после оформления заказа
        Для 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:
Чтобы удостовериться, что работает именно ваш новый класс, можете сделать в нём опечатку, получите 500 ошибку в консоли :)
4. Изменяем метод submit:
Получаем свою страницу подтверждения заказа, которую можно менять в настройках админки. На самой странице, соответственно, вызов msGetOrder.
В принципе, я думаю можно сделать редирект js-колбэком или плагином (хотя я не вижу подходящего события, на которое можно повесить редирект без обрушения логики обработки заказа), но в данном случае мне нужна возможность изменения ресурса подтверждения заказа, что и привело к такому решению задачи.
    
    
                                                        После долгого перерыва вспоминая работу с 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-колбэком или плагином (хотя я не вижу подходящего события, на которое можно повесить редирект без обрушения логики обработки заказа), но в данном случае мне нужна возможность изменения ресурса подтверждения заказа, что и привело к такому решению задачи.
            
                Поблагодарить автора            
            
                 Отправить деньги            
        
        
            Комментарии: 7
Напомню верный способ редиректа на старых версиях MS2: modx.pro/help/7462/. В новой версии такое не получится.а почему не получится? у меня этот метод работает и на 2.4.12
                спасибо, все работает замечательно
Единственный момент, если у вас есть вариант оплаты Наличными при получении, нужно вот здесь
                    Единственный момент, если у вас есть вариант оплаты Наличными при получении, нужно вот здесь
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 оплаты Наличными при получении            
                А как редиректить пользователя при выборе онлайн-оплаты? Чтобы он уходил не на платёжную систему, а эту самую страницу ms2_order_success_page            
                    
                Это зависит от модуля оплаты, который вы используете.
Рецепта на все случаи нет )
                    Рецепта на все случаи нет )
                Добрый день! 
Подскажите, где промахнулся…
1. Создал файл
path — > components/minishop2/custom/order/myOrderHandler.class.php
2. Вложил
class myOrderHandler extends msOrderHandler
…
3. Создал парметр: ms2_order_success_page => id-ресурса на который хочу редиректнуть
4. Открыл консоль, вписал
…
5. В парметр ms2_order_handler_class => myOrderHandler
6. Зашел в настройки MS2-Самовывоз-Моего класса нет.
7. Загрустил…
                    Подскажите, где промахнулся…
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. Загрустил…
                Добрый!
1. не очень понятно, при чём тут Самовывоз — это не order, а delivery
Ты подключаешь кастомный класс заказа, не доставки.
2. проверь, что в системной настройке ms2_services
И ещё важный момент — этот пост старый, что в текущих версиях MS2 — я не скажу сейчас, возможно, что всё уже немного иначе )
Думаю, вот тут вся информация по расширению класса доставки.
                    1. не очень понятно, при чём тут Самовывоз — это не order, а delivery
Ты подключаешь кастомный класс заказа, не доставки.
2. проверь, что в системной настройке ms2_services
И ещё важный момент — этот пост старый, что в текущих версиях MS2 — я не скажу сейчас, возможно, что всё уже немного иначе )
Думаю, вот тут вся информация по расширению класса доставки.
                Благодарю за быстрый ответ! 
Я сделал стандартным методом, а тут решил попробовать поработать с классами. )
Да, я находил информацию, что в новых версиях MS2 ребята хотят внести функционал в коробку.
Если правильно понял, конечно же.
Еще раз, благодарю! Пошел обучаться! )
                    Я сделал стандартным методом, а тут решил попробовать поработать с классами. )
Да, я находил информацию, что в новых версиях MS2 ребята хотят внести функционал в коробку.
Если правильно понял, конечно же.
Еще раз, благодарю! Пошел обучаться! )
                            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.