Оглавление
sale
, подключите пространство имён модуля интернет-магазин чтобы заработали примеры ниже.
use Bitrix\Sale;
Заказ (Sale\Order)
Заказ представляет собой объект класса Bitrix\Sale\Order
. Нужно запомнить, что пока не вызван метод save()
этот объект необязательно связан с сохранённым заказом. Также пока вы не вызовете save()
, изменения в заказе не будут сохранены в базе данных.
Существующий заказ можно получить по ID или номеру заказа (они могут отличаться):
/** int $orderId идентификатор заказа */
$order = Sale\Order::load($orderId);
/** mixed $orderNumber номер заказа */
$order = Sale\Order::loadByAccountNumber($orderNumber);
Доступ к полям заказа
Ключевые поля заказа можно получить используя следующие методы:
$order->getId(); // ID заказа
$order->getSiteId(); // ID сайта
$order->getDateInsert(); // объект Bitrix\Main\Type\DateTime
$order->getPersonTypeId(); // ID типа покупателя
$order->getUserId(); // ID пользователя
$order->getPrice(); // Сумма заказа
$order->getDiscountPrice(); // Размер скидки
$order->getDeliveryPrice(); // Стоимость доставки
$order->getSumPaid(); // Оплаченная сумма
$order->getCurrency(); // Валюта заказа
$order->isPaid(); // true, если оплачен
$order->isAllowDelivery(); // true, если разрешена доставка
$order->isShipped(); // true, если отправлен
$order->isCanceled(); // true, если отменен
Так же есть универсальный метод getField() при помощи которого поле заказа можно получить по имени:
$order->getField("ORDER_WEIGHT"); // Вес заказа
$order->getField('PRICE'); // Сумма заказа
Для изменения поля, применяется "обратный" метод setField()
://Задаём пользовательский комментарий к заказу
$order->setField('USER_DESCRIPTION', 'Комментарий к текущему заказу заказу');
//Обязательно сохраняем все изменения заказа
$order->save();
Список всех доступных полей можно получить методом getAvailableFields()
.
Связь заказа с другим сущностями
Заказ имеет связь один-ко-многим с несколькими объектами в виде коллекций - коллекция товаров в корзине (Sale\Basket
), коллекция отгрузок (Sale\ShipmentCollection
), коллекция оплат (Sale\PaymentCollection
) и коллекция свойств заказа (Sale\PropertyValueCollection
).Следовательно есть набор методов чтобы получить способы доставки и оплаты указанные в заказе. Вызов:
$paymentIds = $order->getPaymentSystemId();
вернёт массив идентификаторов способов оплаты заказа. Вызов:
$deliveryIds = $order->getDeliverySystemId();
вернёт массив идентификаторов способов доставки. Работу со свойствами заказа следует рассмотреть подробнее.Свойства заказа (Sale\PropertyValueCollection)
Свойства заказа представляют собой объекты классаBitrix\Sale\PropertyValue
, собранные в коллекции propertyCollection
объекта заказ. Получить коллекцию можно следующим образом:
$propertyCollection = $order->getPropertyCollection();
Чтобы получить значения всех свойств и групп свойств в коллекции доступны метод:
$commonArray = $propertyCollection->getArray(); // массив ['properties' => [..], 'groups' => [..] ];
$groupArray = $propertyCollection->getGroups(); // массив групп свойства
$arPropertyByGroup = $propertyCollection->getGroupProperties($groupId); // массив свойств, относящихся к определённой группе
Часть свойств заказа в 1С Битрикс имеет предопределённое значение. Например email пользователя, адрес доставки и т.п. в мастере создания свойств, такие специальные свойства помечаются соответствующими атрибутами (вкладка Магазин -> Настройки -> Свойства заказа -> Список свойств):На уровне данных, это атрибуты IS_EMAIL, IS_PAYER, IS_LOCATION, IS_LOCATION4TAX, IS_PROFILE_NAME, IS_ZIP, IS_PHONE, IS_ADDRESS. Для получения таких свойств заказа, предусмотренны специальные методы:
$email = $propertyCollection->getUserEmail();
$name = $propertyCollection->getPayerName();
$loc = $propertyCollection->getDeliveryLocation();
$taxLoc = $propertyCollection->getTaxLocation();
$profName = $propertyCollection->getProfileName();
$zip = $propertyCollection->getDeliveryLocationZip();
$phone = $propertyCollection->getPhone();
$addr = $propertyCollection->getAddress();
Если вы знаете идентификатор свойства, вы можете получить его значение общим методом:
$somePropValue = $propertyCollection->getItemByOrderPropertyId($orderPropertyId);
Значение свойства, это экземпляр класса Bitrix\Sale\PropertyValue, так же имеет набор полезных методов для работы:
$somePropValue->getValue(); // значение свойства
$somePropValue->getViewHtml(); // представление значения в читаемом виде
И метаданные свойства:
$arProp = $somePropValue->getProperty(); // массив данных о самом свойстве
$propId = $somePropValue->getPropertyId(); // ID свойства
$propName = $somePropValue->getName(); // Название
$isRequired = $somePropValue->isRequired(); // true, если свойство обязательное
$propPerson = $somePropValue->getPersonTypeId(); // Тип плательщика
$propGroup = $somePropValue->getGroupId(); // ID группы
Если вам нужно изменить значение какого-либо свойства, воспользуйтесь методом setValue()
$somePropValue->setValue("some value");
$somePropValue->save();
После манипуляций со свойствами заказа, обязательно нужно сохранить сам заказ иначе он не будет перерассчитан.
$order->save();
Рассмотрим возможности оплаты заказа.Оплаты заказа (Sale\PaymentCollection)
Получить коллекцию можно следующим образом:
$paymentCollection = $order->getPaymentCollection();
Из полученного объекта коллекции мы можете получить информацию об оплатах и объекте заказа. А именно:
$paymentCollection->isPaid(); // true, если все оплаты оплачены
$paymentCollection->hasPaidPayment(); // true, если хотя бы одна оплата оплачена
$paymentCollection->getPaidSum(); // оплаченная сумма
$paymentCollection->isExistsInnerPayment(); // true, если осуществлена оплата с внутреннего счета
Коллекция состоит из объектов оплаты
Sale\Payment
и содержит информацию об оплатах, получить доступ к объектам можно перебрав объект коллекции циклом или по индексу массива://Перебираем объект коллекции
foreach ($paymentCollection as $payment) {
$sum = $payment->getSum(); // сумма к оплате
$isPaid = $payment->isPaid(); // true, если оплачена
$isReturned = $payment->isReturn(); // true, если возвращена
$ps = $payment->getPaySystem(); // платежная система (объект Sale\PaySystem\Service)
$psID = $payment->getPaymentSystemId(); // ID платежной системы
$psName = $payment->getPaymentSystemName(); // название платежной системы
$isInnerPs = $payment->isInner(); // true, если это оплата с внутреннего счета
}
//Получение объекта оплаты по индексу
$onePayment = $paymentCollection[0];
Изменить оплату или сделать возврат можно следующими методами:
$onePayment->setPaid("N"); // отмена оплаты
$onePayment->setPaid("Y"); // оплата
/*возврат (деньги возвращаются на внутренний счет или в платежную
систему, если обработчик реализует интерфейс Sale\PaySystem\IRefund)*/
$onePayment->setReturn("Y");
После всех манипуляций нужно сохранять сущность заказа:
$order->save();
Если в вашем компоненте нужно вывести форму оплаты (информацию об оплате и кнопку «Оплатить»), можно воспользоваться следующим способом:/* $onePayment объект класса Sale\Payment */
$service = Sale\PaySystem\Manager::getObjectById($onePayment->getPaymentSystemId());
$context = \Bitrix\Main\Application::getInstance()->getContext();
$service->initiatePay($onePayment, $context->getRequest());