Битрикс и D7. Товары в Отгрузке


1.jpg

Если честно, к Д7 у меня несколько неоднозначное отношение. В некоторых местах я попискиваю от восторга, а в некоторых хочется топать ногами и ругаться неприличными словами.

Однако, несмотря на, код становится чище и структурированнее, платформа дорабатывается и растёт.
Сегодняшняя задача такая: получить Отгрузки указанного Заказа и понять, какие Товары в каждой из этих Отгрузок.

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

2.png

Получить список отгрузок можно разными способами, но если мы хотим получить Отгрузки какого-то непосредственного Заказа, то легче всего спросить сам Заказ:
1 //заводим объект заказа
2 $order = \Bitrix\Sale\Order::load($order_id);
3  
4 //и получаем Коллекцию Отгрузок текущего Заказа
5 $shipmentCollection = $order->getShipmentCollection();

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

3.jpg 

* Да, у меня в офисе есть цветные фломастеры и карандаши!

И например вот такой код:
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 }

Кстати, по Д7 много полезного можно почерпнуть из статей mr.cappuccino
Битрикс D7


Просмотров: 3787