Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Заказы

Заказ — запись о том, что покупатель купил, за сколько и куда это доставить. На витрине заказами занимается модель ядра checkout/order: она создаёт заказ, меняет его статус и ведёт историю. Дополнение обычно читает заказы и реагирует на смену статуса.

Где смотреть

ЧтоГде
Модельcatalog/model/checkout/order.php
Таблицыoc_order, oc_order_product, oc_order_total, oc_order_history
В панелиSales → Orders

Чтение заказа

$this->load->model('checkout/order');
 
$order = $this->model_checkout_order->getOrder(1024);
 
if ($order) {
    $email = $order['email'];
    $statusId = (int) $order['order_status_id'];
    $total = $this->currency->format($order['total'], $order['currency_code'], $order['currency_value']);
}

getOrder() возвращает массив с полями заказа или пустой массив. Сумма хранится в основной валюте магазина, поэтому при выводе передают код и курс валюты заказа — покупатель видит то же число, что при оформлении.

Товары заказа возвращает отдельный метод той же модели — getProducts($orderId).

Статусы

Статусы редактируют в System → Localisation → Order Statuses: «Pending», «Processing», «Shipped», «Complete». Их идентификаторы в коде не пишут числами — их берут из настроек магазина:

$newOrderId = (int) $this->config->get('config_order_status_id');
$processing = (array) $this->config->get('config_processing_status');
$complete = (array) $this->config->get('config_complete_status');

Первое — статус, который получает новый заказ. Два других — списки идентификаторов, которые магазин считает «в обработке» и «выполнен»; их задают в System → Settings, вкладка Option.

Смена статуса

$this->model_checkout_order->addHistory(1024, $shippedStatusId, 'Передан курьеру. Трек-номер: AB123456789', true);
АргументСмысл
ПервыйИдентификатор заказа
ВторойИдентификатор нового статуса
ТретийКомментарий
ЧетвёртыйОтправить ли письмо покупателю

Откройте заказ в Sales → Orders — на вкладке истории появилась строка с комментарием. addHistory() не только пишет эту строку: при первом настоящем статусе он уменьшает остатки и отправляет письмо о заказе.

Когда заказ считается оформленным

Заказ записывается в базу на шаге подтверждения — со статусом 0. Такие заказы в панели не видны: покупатель ещё может уйти. Оформленным заказ становится, когда способ оплаты вызывает addHistory() с настоящим статусом.

Поэтому «новый заказ» ловят событием addHistory/after, а не addOrder/after:

// триггер: catalog/model/checkout/order.addHistory/after
public function orderHistory(string &$route, array &$args): void
{
    [$orderId, $statusId] = $args;
 
    $this->log->write('Заказ ' . (int) $orderId . ' получил статус ' . (int) $statusId);
}

Оформите на витрине пробный заказ — в журнале ошибок появится строка с его номером и статусом.

Частая ошибка

Статус меняют прямым запросом: UPDATE oc_order SET order_status_id = .... История не пишется, остатки не уменьшаются, покупатель не получает письмо, события других дополнений не срабатывают. Меняйте статус только через addHistory().

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.