Заказы
Заказ — запись о том, что покупатель купил, за сколько и куда это доставить. На витрине заказами занимается модель ядра 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().