- Модуль: sale
- Путь к файлу: ~/bitrix/modules/sale/lib/helpers/admin/orderedit.php
- Класс: BitrixSaleHelpersAdminOrderEdit
- Вызов: OrderEdit::fillBasketItem
static function fillBasketItem(BasketItem &$item, array $productData, Order $order, Basket $basket, $needDataUpdate = false)
{
$result = new Result();
$basketCode = $item->getBasketCode();
if(isset($productData["PRODUCT_PROVIDER_CLASS"]) && $productData["PRODUCT_PROVIDER_CLASS"] <> '')
$item->setField("PRODUCT_PROVIDER_CLASS", trim($productData["PRODUCT_PROVIDER_CLASS"]));
$data = array();
/*
* Let's extract cached provider product data from field
* in case activity is through ajax.
*/
if(self::$isTrustProductFormData && !$needDataUpdate)
{
if(!empty($productData["PROVIDER_DATA"]) && CheckSerializedData($productData["PROVIDER_DATA"]))
$data[$basketCode] = unserialize($productData["PROVIDER_DATA"], ['allowed_classes' => false]);
// if quantity changed we must get fresh data from provider
if(!empty($data[$basketCode]) && $data[$basketCode] == $productData["QUANTITY"])
{
if(!empty($productData["SET_ITEMS_DATA"]) && CheckSerializedData($productData["SET_ITEMS_DATA"]))
$productData["SET_ITEMS"] = unserialize($productData["SET_ITEMS_DATA"], ['allowed_classes' => false]);
if(is_array($data[$basketCode]) && !empty($data[$basketCode]))
self::setProviderTrustData($item, $order, $data[$basketCode]);
}
else
{
unset($data[$basketCode]);
}
}
$item->setField("NAME", $productData["NAME"]);
$res = $item->setField("QUANTITY", $productData["QUANTITY"]);
if(!$res->isSuccess())
{
$result->addErrors($res->getErrors());
return $result;
}
$product = array();
/* Get actual info from provider
* cases:
* 1) add new product to basket;
* 2) saving operation;
* 3) changing quantity;
*/
if(empty($data[$basketCode]) || !self::$isTrustProductFormData || $needDataUpdate)
{
$data = Provider::getProductData($basket, array("PRICE", "AVAILABLE_QUANTITY"), $item);
if(empty($data[$basketCode]) && $productData["PRODUCT_PROVIDER_CLASS"] <> '')
{
$name = "";
if(!empty($productData["NAME"]))
$name = $productData["NAME"];
if(!empty($productData["PRODUCT_ID"]))
$name .= " (".$productData['PRODUCT_ID'].")";
$result->addError(
new Error(
Loc::getMessage(
"SALE_ORDEREDIT_PRODUCT_IS_NOT_AVAILABLE",
array(
"#NAME_ID#" => $name
)
)
)
);
return $result;
}
if(is_array($data[$basketCode]) && !empty($data[$basketCode]))
self::setProviderTrustData($item, $order, $data[$basketCode]);
}
if(isset($data[$basketCode]) && !empty($data[$basketCode]))
{
$product = $data[$basketCode];
if(isset($productData['PRICE']) && isset($productData['CUSTOM_PRICE']) && $productData['CUSTOM_PRICE'] == 'Y')
$product['PRICE'] = $productData['PRICE'];
elseif(isset($product['BASE_PRICE']))
$product['PRICE'] = $product['BASE_PRICE'] - $product['DISCOUNT_PRICE'];
}
if(!self::$isTrustProductFormData)
{
if(isset($productData["MODULE"]) && $productData["MODULE"] == "catalog")
{
$data = OrderBasket::getProductDetails(
$item->getProductId(),
$productData["QUANTITY"],
$order->getUserId(),
$order->getSiteId()
);
$product = array_merge($product, $data);
}
unset($productData["CURRENCY"]);
}
$product = array_merge($product, $productData);
if(isset($product["OFFER_ID"]) || intval($product["OFFER_ID"]) >= 0)
$product["PRODUCT_ID"] = $product["OFFER_ID"];
$product = array_intersect_key($product, array_flip($item::getAvailableFields()));
if(isset($product["MEASURE_CODE"]) && $product["MEASURE_CODE"] <> '')
{
$measures = OrderBasket::getCatalogMeasures();
if(isset($measures[$product["MEASURE_CODE"]]) && $measures[$product["MEASURE_CODE"]] <> '')
$product["MEASURE_NAME"] = $measures[$product["MEASURE_CODE"]];
}
if(!isset($product["CURRENCY"]) || $product["CURRENCY"] == '')
$product["CURRENCY"] = $order->getCurrency();
if($productData["IS_SET_PARENT"] == "Y")
$product["TYPE"] = BasketItem::TYPE_SET;
OrderEdit::setProductDetails(
$productData["OFFER_ID"],
$order->getUserId(),
$order->getSiteId(),
array_merge($product, $productData)
);
$result = self::setBasketItemFields($item, $product);
return $result;
}