• Модуль: sale
  • Путь к файлу: ~/bitrix/modules/sale/lib/helpers/admin/orderedit.php
  • Класс: BitrixSaleHelpersAdminfor
  • Вызов: for::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;
}