Редирект на свою страницу после оформления заказа
Для 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 ребята хотят внести функционал в коробку.
Если правильно понял, конечно же.
Еще раз, благодарю! Пошел обучаться! )
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.