Как вывести ссылку на оплату на странице успешного заказа?
Здравствуйте. Хочу немного переделать логику оформления заказа. Мне нужно чтобы при выборе онлайн-оплаты не происходил редирект на платежный сервис сразу, а сначала был переход на страницу Спасибо за заказ. И уже на этой странице я бы выводил пользователю линк для оплаты.
Я так понимаю, что нужно расширить класс msOrderHandler для того, чтобы убрать редирект. Но вот каким образом в чанке tpl.msGetOrder вывести ссылку на оплату? Подскажете?
Решение:
Для того, чтобы при выборе любого способа оплаты не было редиректа на платёжную систему необходимо расширить класс заказа . Код нового класса:
Я так понимаю, что нужно расширить класс msOrderHandler для того, чтобы убрать редирект. Но вот каким образом в чанке tpl.msGetOrder вывести ссылку на оплату? Подскажете?
Решение:
Для того, чтобы при выборе любого способа оплаты не было редиректа на платёжную систему необходимо расширить класс заказа . Код нового класса:
<?php
if (!class_exists('msOrderInterface')) {
require_once MODX_CORE_PATH . 'components/minishop2/model/minishop2/msorderhandler.class.php';
}
class appOrderHandler extends msOrderHandler implements msOrderInterface
{
/** @var modX $modx */
public $modx;
/** @var miniShop2 $ms2 */
public $ms2;
/** @var array $config */
public $config;
/** @var array $order */
protected $order;
function __construct(miniShop2 & $ms2, array $config = [])
{
parent::__construct($ms2, $config);
//$this->modx->log(1, print_r('__construct', 1));
}
/**
* @param array $data
*
* @return array|string
*/
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();
$delivery_cost = $this->getCost(false, true);
$cart_cost = $this->getCost(true, true) - $delivery_cost;
$createdon = date('Y-m-d H:i:s');
/** @var msOrder $order */
$order = $this->modx->newObject('msOrder');
$order->fromArray([
'user_id' => $user_id,
'createdon' => $createdon,
'num' => $this->getNum(),
'delivery' => $this->order['delivery'],
'payment' => $this->order['payment'],
'cart_cost' => $cart_cost,
'weight' => $cart_status['total_weight'],
'delivery_cost' => $delivery_cost,
'cost' => $cart_cost + $delivery_cost,
'status' => 0,
'context' => $this->ms2->config['ctx'],
]);
// Adding address
/** @var msOrderAddress $address */
$address = $this->modx->newObject('msOrderAddress');
$address->fromArray(array_merge($this->order, [
'user_id' => $user_id,
'createdon' => $createdon,
]));
$order->addOne($address);
// Adding products
$cart = $this->ms2->cart->get();
$products = [];
foreach ($cart as $v) {
if ($tmp = $this->modx->getObject('msProduct', ['id' => $v['id']])) {
$name = $tmp->get('pagetitle');
} else {
$name = '';
}
/** @var msOrderProduct $product */
$product = $this->modx->newObject('msOrderProduct');
$product->fromArray(array_merge($v, [
'product_id' => $v['id'],
'name' => $name,
'cost' => $v['price'] * $v['count'],
]));
$products[] = $product;
}
$order->addMany($products);
$response = $this->ms2->invokeEvent('msOnBeforeCreateOrder', [
'msOrder' => $order,
'order' => $this,
]);
if (!$response['success']) {
return $this->error($response['message']);
}
if ($order->save()) {
$response = $this->ms2->invokeEvent('msOnCreateOrder', [
'msOrder' => $order,
'order' => $this,
]);
if (!$response['success']) {
return $this->error($response['message']);
}
$this->ms2->cart->clean();
$this->clean();
if (empty($_SESSION['minishop2']['orders'])) {
$_SESSION['minishop2']['orders'] = [];
}
$_SESSION['minishop2']['orders'][] = $order->get('id');
// Trying to set status "new"
$response = $this->ms2->changeOrderStatus($order->get('id'), 1);
if ($response !== true) {
return $this->error($response, ['msorder' => $order->get('id')]);
} else {
if ($this->ms2->config['json_response']) {
return $this->success('', ['msorder' => $order->get('id')]);
} else {
$this->modx->sendRedirect(
$this->modx->context->makeUrl($this->modx->resource->id, ['msorder' => $response['data']['msorder']])
);
return $this->success();
}
}
}
return $this->error();
}
}
Комментарии: 4
Я так понимаю, что нужно расширить класс msOrderHandler для того, чтобы убрать редиректНет, достаточно подправить js
Но вот каким образом в чанке tpl.msGetOrder вывести ссылку на оплатутаким же, каким она выводится в письме
Добавил редирект на страницу Спасибо за покупку в колбэк успешного создания заказа на страницы Корзины:
С выводом ссылки разобрался. По идее этот код должен корректно отработать:
miniShop2.Callbacks.add('Order.submit.response.success', 'orders_add_ok', function(response) {
yaCounter23103907.reachGoal('SUCORD');
<strong>location.href('[[~233]]');</strong>
});
Но всё равно при выборе оплаты происходит переход на платёжную систему. Что делаю неправильно?С выводом ссылки разобрался. По идее этот код должен корректно отработать:
{if $payment_link?}
<p>{'ms2_payment_link' | lexicon : ['link' => $payment_link]}</p>
{/if}
Я не разработчик, поэтому могумне некоторые вещи даются тяяжело, прошу отнестить с пониманием) в колбэк успешного создания заказа на страницыПопробуй из колбэка возвращать false
return false;
Если не поможет, то надо именно default.js изменять минишоповский, там где то есть условие по типу:if (response.link) {window.location.href = link}
Дописал решение в первый пост.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.