четверг, 24 ноября 2016 г.

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

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

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

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


Получить список отгрузок можно разными способами, но если мы хотим получить Отгрузки какого-то непосредственного Заказа, то легче всего спросить сам Заказ:
//заводим объект заказа
$order = \Bitrix\Sale\Order::load($order_id);

//и получаем Коллекцию Отгрузок текущего Заказа
$shipmentCollection = $order->getShipmentCollection();

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


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

И например вот такой код:
foreach($shipmentCollection as $shipment)
{
    $shipment_id = $shipment->getId();

    //пропускаем системные
    if ($shipment->isSystem())
        continue;
    
    $arShipments[$shipment_id] = array(
     'ID' => $shipment_id,
     'ACCOUNT_NUMBER' => $shipment->getField('ACCOUNT_NUMBER'),
     'ORDER_ID' => $shipment->getField('ORDER_ID'),
        'DELIVERY_ID' => $shipment->getField('DELIVERY_ID'),
     'PRICE_DELIVERY' => (float)$shipment->getField('PRICE_DELIVERY'),
     'BASKET' => array(),
    );

    //получаем Коллекцию Товаров в Корзине каждой Отгрузки
    $shipmentItemCollection = $shipment->getShipmentItemCollection();
    foreach($shipmentItemCollection as $item)
    {
     //объект Товара в корзине Отгрузки
     $basketItem = $item->getBasketItem();

     //не учитываем товары, которые нельзя купить или которые отложены
 if (!$basketItem->canBuy() || $basketItem->isDelay())
     continue;

     $arItem = array(
         'PRODUCT_ID' => $basketItem->getProductId(),
  'NAME' => $basketItem->getField('NAME'),
  'PRICE' => $basketItem->getPrice(),    // за единицу
  'FINAL_PRICE' => $basketItem->getFinalPrice(),  // сумма
  'QUANTITY' => $basketItem->getQuantity(),
  'WEIGHT' => $basketItem->getWeight(),
 );

 $arShipments[$shipment_id]['BASKET'][$arItem['PRODUCT_ID']] = $arItem;
    }
}


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

Комментариев нет:

Отправить комментарий