Основы работы с заказами в D7
У заметки есть аналог:
Заказы с корзинами, свойствами, доставками и оплатами
В Bitrix D7 все операции с заказами выполняются через класс Bitrix\Sale\Order. Важно помнить: изменения сохраняются только после вызова метода save().
use Bitrix\Sale;
// Загружаем существующий заказ по ID
$orderId = 123;
$order = Sale\Order::load($orderId);
// Или по номеру заказа
$orderNumber = "ORDER-2024-001";
$order = Sale\Order::loadByAccountNumber($orderNumber);
if ($order) {
// Основные методы получения данных заказа
echo "ID заказа: " . $order->getId();
echo "Сумма: " . $order->getPrice();
echo "Валюта: " . $order->getCurrency();
echo "ID пользователя: " . $order->getUserId();
echo "Дата создания: " . $order->getDateInsert()->format('d.m.Y H:i:s');
// Проверка статусов заказа
if ($order->isPaid()) {
echo "Заказ оплачен";
}
if ($order->isAllowDelivery()) {
echo "Доставка разрешена";
}
if ($order->isShipped()) {
echo "Заказ отправлен";
}
}
Работа со свойствами заказа
Свойства заказа содержат контактную информацию покупателя и другие важные данные. Получить их можно через коллекцию свойств.
// Получаем коллекцию свойств заказа
$propertyCollection = $order->getPropertyCollection();
// Получение стандартных свойств по их типу
$email = $propertyCollection->getUserEmail();
$phone = $propertyCollection->getPhone();
$name = $propertyCollection->getPayerName();
$address = $propertyCollection->getAddress();
if ($email) {
echo "Email покупателя: " . $email->getValue();
}
if ($phone) {
echo "Телефон: " . $phone->getValue();
}
// Получение свойства по ID
$propertyId = 15;
$customProperty = $propertyCollection->getItemByOrderPropertyId($propertyId);
if ($customProperty) {
echo "Значение: " . $customProperty->getValue();
echo "Название свойства: " . $customProperty->getName();
echo "Обязательное: " . ($customProperty->isRequired() ? 'Да' : 'Нет');
}
// Изменение значения свойства
$customProperty->setValue("Новое значение");
$order->save(); // Обязательно сохраняем изменения
Получение информации о корзине заказа
Корзина заказа содержит все товары. Через неё можно получить детальную информацию о каждом товаре в заказе.
// Получаем корзину заказа
$basket = $order->getBasket();
// Проходим по всем товарам в корзине
foreach ($basket as $basketItem) {
echo "ID товара: " . $basketItem->getProductId();
echo "Название: " . $basketItem->getField('NAME');
echo "Цена за единицу: " . $basketItem->getPrice();
echo "Количество: " . $basketItem->getQuantity();
echo "Общая стоимость: " . $basketItem->getFinalPrice();
// Получение дополнительных свойств товара
$props = $basketItem->getPropertyCollection();
foreach ($props as $prop) {
echo $prop->getField('NAME') . ": " . $prop->getValue();
}
}
Работа с оплатами и отгрузками
Каждый заказ может иметь несколько оплат и отгрузок. Для работы с ними используются соответствующие коллекции.
// Получение информации об оплатах
$paymentCollection = $order->getPaymentCollection();
foreach ($paymentCollection as $payment) {
echo "ID оплаты: " . $payment->getId();
echo "Сумма к оплате: " . $payment->getSum();
echo "Система оплаты: " . $payment->getPaymentSystemName();
echo "Оплачено: " . ($payment->isPaid() ? 'Да' : 'Нет');
if ($payment->isPaid()) {
echo "Дата оплаты: " . $payment->getField('DATE_PAID')->format('d.m.Y H:i:s');
}
}
// Получение информации об отгрузках
$shipmentCollection = $order->getShipmentCollection();
foreach ($shipmentCollection as $shipment) {
if ($shipment->isSystem()) {
continue; // Пропускаем системную отгрузку
}
echo "ID отгрузки: " . $shipment->getId();
echo "Служба доставки: " . $shipment->getDeliveryName();
echo "Стоимость доставки: " . $shipment->getPrice();
echo "Отгружено: " . ($shipment->isShipped() ? 'Да' : 'Нет');
// Получение товаров в отгрузке
$shipmentItemCollection = $shipment->getShipmentItemCollection();
foreach ($shipmentItemCollection as $shipmentItem) {
if ($shipmentItem->isSystem()) {
continue;
}
echo "Товар: " . $shipmentItem->getBasketItem()->getField('NAME');
echo "Количество в отгрузке: " . $shipmentItem->getQuantity();
}
}
// Получение скидок, примененных к заказу
$discountData = $order->getDiscount()->getApplyResult();
if (!empty($discountData['DISCOUNT_LIST'])) {
foreach ($discountData['DISCOUNT_LIST'] as $discount) {
if ($discount['APPLY'] == 'Y') {
echo "Скидка: " . $discount['NAME'];
echo "Размер скидки: " . $discount['DISCOUNT_VALUE'];
}
}
}
Полный пример, данные о заказе пользователя
Пример из cамописного компонента оформления заказа. Базовое содержимое файла component.php (или можно завернуть в методы class.php)
use Bitrix\Main\Engine\CurrentUser,
Bitrix\Main\Loader,
Bitrix\Sale\Order;
Loader::includeModule('sale');
Loader::includeModule('catalog');
Loader::includeModule('iblock');
$arResult['USER_ID'] = CurrentUser::get()->getId();;
$arResult['ORDER_ID'] = $_GET['ORDER_ID'];
// Загружаем заказ ========================================================
$order = Order::load($arResult['ORDER_ID']);
//echo '';
//print_r($order);
//echo '
';
// Проверяем существование заказа и принадлежность пользователю
if (!$order || $order->getUserId() != $arResult['USER_ID']) {
LocalRedirect('/');
}
// Получаем все поля заказа
$arResult['ORDER'] = [
'ID' => $order->getId(),
'USER_ID' => $order->getUserId(),
'DATE_INSERT' => $order->getField('DATE_INSERT'),
'DATE_STATUS' => $order->getField('DATE_STATUS'),
'PAYED' => $order->getField('PAYED'),
'STATUS_ID' => $order->getField('STATUS_ID'),
'PRICE' => $order->getPrice(),
'CURRENCY' => $order->getCurrency(),
'DISCOUNT_VALUE' => $order->getDiscountPrice(),
'TAX_VALUE' => $order->getTaxValue(),
'DELIVERY_ID' => $order->getField('DELIVERY_ID'),
'PRICE_DELIVERY' => $order->getField('PRICE_DELIVERY'),
'PAY_SYSTEM_ID' => $order->getField('PAY_SYSTEM_ID'),
'CANCELED' => $order->getField('CANCELED'),
'DATE_CANCELED' => $order->getField('DATE_CANCELED'),
'REASON_CANCELED' => $order->getField('REASON_CANCELED'),
'COMMENTS' => $order->getField('COMMENTS'),
];
echo '';
print_r($arResult['ORDER']);
echo '
';
// Получаем корзину заказа
$basket = $order->getBasket();
$arResult['BASKET_ITEMS'] = [];
if ($basket) {
foreach ($basket as $basketItem) {
$arResult['BASKET_ITEMS'][] = [
'ID' => $basketItem->getId(),
'PRODUCT_ID' => $basketItem->getProductId(),
'NAME' => $basketItem->getField('NAME'),
'PRICE' => $basketItem->getPrice(),
'BASE_PRICE' => $basketItem->getBasePrice(),
'QUANTITY' => $basketItem->getQuantity(),
'CURRENCY' => $basketItem->getCurrency(),
'DISCOUNT_PRICE' => $basketItem->getDiscountPrice(),
];
}
}
// Получаем свойства заказа
$propertyCollection = $order->getPropertyCollection();
$arResult['ORDER_PROPS'] = [];
foreach ($propertyCollection as $property) {
$arResult['ORDER_PROPS'][$property->getField('CODE')] = [
'CODE' => $property->getField('CODE'),
'NAME' => $property->getField('NAME'),
'VALUE' => $property->getValue(),
'ORDER_PROPS_ID' => $property->getPropertyId(),
];
}
//echo '';
//print_r($arResult['ORDER_PROPS']);
//echo '
';
// Получаем информацию о доставке
$shipmentCollection = $order->getShipmentCollection();
$arResult['DELIVERY'] = [];
foreach ($shipmentCollection as $shipment) {
// Пропускаем системную отгрузку
if ($shipment->isSystem()) {
continue;
}
$arResult['DELIVERY'] = [
'ID' => $shipment->getId(),
'DELIVERY_ID' => $shipment->getDeliveryId(),
'DELIVERY_NAME' => $shipment->getDeliveryName(),
'PRICE_DELIVERY' => $shipment->getPrice(),
'CURRENCY' => $shipment->getCurrency(),
'ALLOW_DELIVERY' => $shipment->getField('ALLOW_DELIVERY'),
'DATE_ALLOW_DELIVERY' => $shipment->getField('DATE_ALLOW_DELIVERY'),
'DEDUCTED' => $shipment->getField('DEDUCTED'),
'DATE_DEDUCTED' => $shipment->getField('DATE_DEDUCTED'),
'STATUS_ID' => $shipment->getField('STATUS_ID'),
'TRACKING_NUMBER' => $shipment->getField('TRACKING_NUMBER'),
'COMMENTS' => $shipment->getField('COMMENTS'),
];
}
//echo '';
//print_r($arResult['DELIVERY']);
//echo '
';
// Получаем информацию о платежной системе
$paymentCollection = $order->getPaymentCollection();
$arResult['PAYMENT'] = [];
foreach ($paymentCollection as $payment) {
$arResult['PAYMENT'] = [
'ID' => $payment->getId(),
'PAY_SYSTEM_ID' => $payment->getPaymentSystemId(),
'PAY_SYSTEM_NAME' => $payment->getPaymentSystemName(),
'SUM' => $payment->getSum(),
'CURRENCY' => $payment->getField('CURRENCY'),
'PAID' => $payment->isPaid(),
'DATE_PAID' => $payment->getField('DATE_PAID'),
'DATE_BILL' => $payment->getField('DATE_BILL'),
'IS_RETURN' => $payment->getField('IS_RETURN'),
'DATE_RETURN' => $payment->getField('DATE_RETURN'),
'COMMENTS' => $payment->getField('COMMENTS'),
];
}
//echo '';
//print_r($arResult['PAYMENT']);
//echo '
';
Объяснение структуры работы
Система работы с заказами в D7 построена на нескольких ключевых принципах:
Объектно-ориентированный подход:
- Заказ представлен объектом класса
Sale\Order - Все связанные данные (свойства, корзина, оплаты) доступны через методы объекта
- Изменения применяются только после явного вызова
save()
Коллекции данных:
PropertyValueCollection— коллекция свойств заказаBasket— коллекция товаров в заказеPaymentCollection— коллекция платежейShipmentCollection— коллекция отгрузок
Преимущества нового API:
- Типизированные методы для получения данных
- Встроенная валидация данных
- Удобная работа с датами через объекты DateTime
- Централизованное управление транзакциями