Success-страница после оформления заказа
Сделал по данному мануалу:
1. добавил параметр в системные minishop2
2. создал файл customorder.class.php в /core/components/minishop2/custom/order/ и зарегистрировал по документации через console
3. Прописал в настройках
4. Проверял как указано делая опечатку, ошибка 500 есть, класс подключен. Вот код файла нового обработчика:
MODX Revolution 2.8.4-pl
Minishop2 4.1.4-pl
Может кто подсказать в чем ошибка?
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
Может кто подсказать в чем ошибка?
Комментарии: 8
Вот же у тебя условие написано по которому твой код должен отрабатывать
if ($this->config['json_response']) {}
По умолчанию оно false, ты где-то меняешь параметр json_response?
Нет, всё остальное стандартно
Так значит надо либо условие убрать или установить значение true.
Залоггируйте каждый if используя
$this->modx->log(1, print_r('переменная или строка/этап',1))
Чтобы посмотреть куда заходит код и что он получает
$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);
А так у меня недавно была проблема с редиректом, но пока отложилась эта проблема, может что-то поменялось в обновлениях нынче раз не у меня одного проблема появилась.
Что-то у меня уже с 1ой такой записью (
$this->modx->log(1, print_r($success_page,1))
) ошибка 500
Странно, видимо как-то надо еще подключать
ну как вариант еще в файл сохранять
// попробовать так вызывать, указать явно 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);
Точки с запятой нет после инструкии $this->modx->log(1, print_r($success_page,1))
надо
надо
$this->modx->log(1, print_r($success_page,1));
:)
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.