Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
Если честно, к Д7 у меня несколько неоднозначное отношение. В некоторых местах я попискиваю от восторга, а в некоторых хочется топать ногами и ругаться неприличными словами.Однако, несмотря на, код становится чище и структурированнее, платформа дорабатывается и растёт.
Сегодняшняя задача такая: получить Отгрузки указанного Заказа и понять, какие Товары в каждой из этих Отгрузок.
Как известно, у одного Заказа может быть несколько Отгрузок. То есть, если заказ целиком не готов, то можно его разделить на парочку посылок и отправлять частями и даже например разными службами доставки или вообще - оплачивать по частям.
Для тестов создаём заказ с несколькими товарами. В админке радостно делим заказ на парочку отгрузок (у меня получились с айдишками 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 } |