Однако, несмотря на, код становится чище и структурированнее, платформа дорабатывается и растёт.
Сегодняшняя задача такая: получить Отгрузки указанного Заказа и понять, какие Товары в каждой из этих Отгрузок.
Как известно, у одного Заказа может быть несколько Отгрузок. То есть, если заказ целиком не готов, то можно его разделить на парочку посылок и отправлять частями и даже например разными службами доставки или вообще - оплачивать по частям.
Для тестов создаём заказ с несколькими товарами. В админке радостно делим заказ на парочку отгрузок (у меня получились с айдишками 169 и 172), в одну из которых пихаем часть товаров, а в другую - оставшиеся.

Получить список отгрузок можно разными способами, но если мы хотим получить Отгрузки какого-то непосредственного Заказа, то легче всего спросить сам Заказ:
1 //заводим объект заказа 2 $order = \Bitrix\Sale\Order::load($order_id); 3 4 //и получаем Коллекцию Отгрузок текущего Заказа 5 $shipmentCollection = $order->getShipmentCollection(); |
Коллекция Отгрузок - по факту это список объектов Отгрузок, у неё есть свой итератор, поэтому можно к ней обратиться с помощью foreach.
Для каждого объекта Отгрузки нам надо получить Коллекцию Товаров в ней.
Коллекция Товаров - это список объектов Товаров, который также можно просто перебрать, получая их свойства.
То есть для нашего случая получаем вот такую картинку:
* Да, у меня в офисе есть цветные фломастеры и карандаши!
И например вот такой код:
1 foreach($shipmentCollection as $shipment)
2 {
3 $shipment_id = $shipment->getId();
4
5 //пропускаем системные
6 if ($shipment->isSystem())
7 continue;
8
9 $arShipments[$shipment_id] = array(
10 'ID' => $shipment_id,
11 'ACCOUNT_NUMBER' => $shipment->getField('ACCOUNT_NUMBER'),
12 'ORDER_ID' => $shipment->getField('ORDER_ID'),
13 'DELIVERY_ID' => $shipment->getField('DELIVERY_ID'),
14 'PRICE_DELIVERY' => (float)$shipment->getField('PRICE_DELIVERY'),
15 'BASKET' => array(),
16 );
17
18 //получаем Коллекцию Товаров в Корзине каждой Отгрузки
19 $shipmentItemCollection = $shipment->getShipmentItemCollection();
20 foreach($shipmentItemCollection as $item)
21 {
22 //объект Товара в корзине Отгрузки
23 $basketItem = $item->getBasketItem();
24
25 //не учитываем товары, которые нельзя купить или которые отложены
26 if (!$basketItem->canBuy() || $basketItem->isDelay())
27 continue;
28
29 $arItem = array(
30 'PRODUCT_ID' => $basketItem->getProductId(),
31 'NAME' => $basketItem->getField('NAME'),
32 'PRICE' => $basketItem->getPrice(), // за единицу
33 'FINAL_PRICE' => $basketItem->getFinalPrice(), // сумма
34 'QUANTITY' => $basketItem->getQuantity(),
35 'WEIGHT' => $basketItem->getWeight(),
36 );
37
38 $arShipments[$shipment_id]['BASKET'][$arItem['PRODUCT_ID']] = $arItem;
39 }
40 }
|
