Esempio n. 1
0
 public static function GetProductList($ID, $minCNT, $limit, $getParentOnly = false)
 {
     global $DB;
     $ID = (int) $ID;
     if ($ID <= 0) {
         return false;
     }
     $limit = (int) $limit;
     if ($limit < 0) {
         $limit = 0;
     }
     $minCNT = (int) $minCNT;
     if ($minCNT < 0) {
         $minCNT = 0;
     }
     $getParentOnly = $getParentOnly === true;
     $elementInclude = array($ID);
     $elementExclude = array();
     if (Loader::includeModule('catalog')) {
         $intIBlockID = (int) CIBlockElement::GetIBlockByID($ID);
         if ($intIBlockID == 0) {
             return false;
         }
         $skuInfo = CCatalogSKU::GetInfoByProductIBlock($intIBlockID);
         if (!empty($skuInfo)) {
             $itemsIterator = CIBlockElement::GetList(array(), array('IBLOCK_ID' => $skuInfo['IBLOCK_ID'], 'PROPERTY_' . $skuInfo['SKU_PROPERTY_ID'] => $ID), false, false, array('ID', 'IBLOCK_ID', 'PROPERTY_' . $skuInfo['SKU_PROPERTY_ID']));
             while ($item = $itemsIterator->Fetch()) {
                 $item['ID'] = (int) $item['ID'];
                 $elementInclude[] = $item['ID'];
                 $elementExclude[] = $item['ID'];
             }
         }
     }
     if ($getParentOnly) {
         $strSql = "select PARENT_PRODUCT_ID from b_sale_product2product where PRODUCT_ID IN (" . implode(',', $elementInclude) . ")";
         if (!empty($elementExclude)) {
             $strSql .= " and PARENT_PRODUCT_ID not in (" . implode(',', $elementExclude) . ")";
         }
         if ($minCNT > 0) {
             $strSql .= " and CNT >= " . $minCNT;
         }
         $strSql .= ' group by PARENT_PRODUCT_ID';
         if ($limit > 0) {
             $strSql .= " limit " . $limit;
         }
     } else {
         $strSql = "select * from b_sale_product2product where PRODUCT_ID in (" . implode(',', $elementInclude) . ")";
         if (!empty($elementExclude)) {
             $strSql .= " and PARENT_PRODUCT_ID not in (" . implode(',', $elementExclude) . ")";
         }
         if ($minCNT > 0) {
             $strSql .= " and CNT >= " . $minCNT;
         }
         $strSql .= " order by CNT desc, PRODUCT_ID asc";
         if ($limit > 0) {
             $strSql .= " limit " . $limit;
         }
     }
     return $DB->Query($strSql, false, "File: " . __FILE__ . "<br>Line: " . __LINE__);
 }
Esempio n. 2
0
 public static function GetProductInfo($intOfferID, $intIBlockID = 0)
 {
     $intOfferID = (int) $intOfferID;
     if ($intOfferID <= 0) {
         return false;
     }
     $intIBlockID = (int) $intIBlockID;
     if ($intIBlockID <= 0) {
         $intIBlockID = (int) CIBlockElement::GetIBlockByID($intOfferID);
     }
     if ($intIBlockID <= 0) {
         return false;
     }
     if (!isset(self::$arOfferCache[$intIBlockID])) {
         $arSkuInfo = CCatalogSKU::GetInfoByOfferIBlock($intIBlockID);
     } else {
         $arSkuInfo = self::$arOfferCache[$intIBlockID];
     }
     if (empty($arSkuInfo) || empty($arSkuInfo['SKU_PROPERTY_ID'])) {
         return false;
     }
     $rsItems = CIBlockElement::GetProperty($intIBlockID, $intOfferID, array(), array('ID' => $arSkuInfo['SKU_PROPERTY_ID']));
     if ($arItem = $rsItems->Fetch()) {
         $arItem['VALUE'] = (int) $arItem['VALUE'];
         if ($arItem['VALUE'] > 0) {
             return array('ID' => $arItem['VALUE'], 'IBLOCK_ID' => $arSkuInfo['PRODUCT_IBLOCK_ID'], 'OFFER_IBLOCK_ID' => $intIBlockID, 'SKU_PROPERTY_ID' => $arSkuInfo['SKU_PROPERTY_ID']);
         }
     }
     return false;
 }
Esempio n. 3
0
 public static function GetProductInfo($intOfferID, $intIBlockID = 0)
 {
     $intOfferID = (int) $intOfferID;
     if ($intOfferID <= 0) {
         return false;
     }
     if (!isset(self::$parentCache[$intOfferID])) {
         self::$parentCache[$intOfferID] = false;
         $intIBlockID = (int) $intIBlockID;
         if ($intIBlockID <= 0) {
             $intIBlockID = (int) CIBlockElement::GetIBlockByID($intOfferID);
         }
         if ($intIBlockID <= 0) {
             return self::$parentCache[$intOfferID];
         }
         if (!isset(self::$arOfferCache[$intIBlockID])) {
             $skuInfo = CCatalogSKU::GetInfoByOfferIBlock($intIBlockID);
         } else {
             $skuInfo = self::$arOfferCache[$intIBlockID];
         }
         if (empty($skuInfo) || empty($skuInfo['SKU_PROPERTY_ID'])) {
             return self::$parentCache[$intOfferID];
         }
         $conn = Application::getConnection();
         $helper = $conn->getSqlHelper();
         if ($skuInfo['VERSION'] == 2) {
             $productField = $helper->quote('PROPERTY_' . $skuInfo['SKU_PROPERTY_ID']);
             $sqlQuery = 'select ' . $productField . ' as ID from ' . $helper->quote('b_iblock_element_prop_s' . $skuInfo['IBLOCK_ID']) . ' where ' . $helper->quote('IBLOCK_ELEMENT_ID') . ' = ' . $intOfferID;
         } else {
             $productField = $helper->quote('VALUE_NUM');
             $sqlQuery = 'select ' . $productField . ' as ID from ' . $helper->quote('b_iblock_element_property') . ' where ' . $helper->quote('IBLOCK_PROPERTY_ID') . ' = ' . $skuInfo['SKU_PROPERTY_ID'] . ' and ' . $helper->quote('IBLOCK_ELEMENT_ID') . ' = ' . $intOfferID;
         }
         unset($productField);
         $parentIterator = $conn->query($sqlQuery);
         if ($parent = $parentIterator->fetch()) {
             $parent['ID'] = (int) $parent['ID'];
             if ($parent['ID'] > 0) {
                 self::$parentCache[$intOfferID] = array('ID' => $parent['ID'], 'IBLOCK_ID' => $skuInfo['PRODUCT_IBLOCK_ID'], 'OFFER_IBLOCK_ID' => $intIBlockID, 'SKU_PROPERTY_ID' => $skuInfo['SKU_PROPERTY_ID']);
             }
         }
         unset($parent, $parentIterator, $sqlQuery, $helper, $conn, $skuInfo);
     }
     return self::$parentCache[$intOfferID];
 }
Esempio n. 4
0
	/**
	 * <p>Метод вычисляет скидку на товар с кодом productID для пользователя, принадлежащего группам пользователей arUserGroups.</p>
	 *
	 *
	 *
	 *
	 * @param int $productID = 0[ Код товара
	 *
	 *
	 *
	 * @param array $arUserGroups = array()[ 
	 *
	 *
	 *
	 * @param string $renewal = "N"[ Массив групп, которым принадлежит пользователь. Для текущего
	 * пользователя он возвращается методом $USER-&gt;GetUserGroupArray()
	 *
	 *
	 *
	 * @param array $arCatalogGroups = array()[ Флаг "Продление подписки"
	 *
	 *
	 *
	 * @param string $siteID = false]]] Массив типов цен, для которых искать скидку.
	 *
	 *
	 *
	 * @return bool <p>Метод возвращает массив ассоциативных массивов скидок или
	 * <i>false</i> в случае ошибки. В массиве содержится ассоциативный
	 * массив параметров максимальной процентной скидки (если есть) и
	 * ассоциативный массив параметров максимальной фиксированной
	 * скидки (если есть).</p><a name="examples"></a>
	 *
	 *
	 * <h4>Example</h4> 
	 * <pre>
	 * &lt;?
	 * $arDiscounts = CCatalogDiscount::GetDiscountByProduct(
	 *         150,
	 *         $USER-&gt;GetUserGroupArray(),
	 *         "N",
	 *         2,
	 *         SITE_ID
	 *     );
	 * ?&gt;
	 * </pre>
	 *
	 *
	 * @static
	 * @link http://dev.1c-bitrix.ru/api_help/catalog/classes/ccatalogdiscount/ccatalogdiscount.getdiscountbyproduct.php
	 * @author Bitrix
	 */
	static public function GetDiscountByProduct($productID = 0, $arUserGroups = array(), $renewal = "N", $arCatalogGroups = array(), $siteID = false, $arDiscountCoupons = false)
	{
		global $DB;
		global $APPLICATION;

		foreach (GetModuleEvents("catalog", "OnGetDiscountByProduct", true) as $arEvent)
		{
			$mxResult = ExecuteModuleEventEx($arEvent, array($productID, $arUserGroups, $renewal, $arCatalogGroups, $siteID, $arDiscountCoupons));
			if (true !== $mxResult)
				return $mxResult;
		}

		$productID = intval($productID);
		if (0 >= $productID)
		{
			$APPLICATION->ThrowException(str_replace("#ID#", $productID, GetMessage("BT_MOD_CATALOG_DISC_ERR_ELEMENT_ID_NOT_FOUND")), "NO_ELEMENT");
			return false;
		}

		$intIBlockID = intval(CIBlockElement::GetIBlockByID($productID));
		if (0 >= $intIBlockID)
		{
			$APPLICATION->ThrowException(str_replace("#ID#", $productID, GetMessage("BT_MOD_CATALOG_DISC_ERR_ELEMENT_ID_NOT_FOUND")), "NO_ELEMENT");
			return false;
		}

		return CCatalogDiscount::GetDiscount($productID, $intIBlockID, $arCatalogGroups, $arUserGroups, $renewal, $siteID, $arDiscountCoupons);
	}
Esempio n. 5
0
	/**
	 * <p>Метод возвращает параметры наименьшей цены товара productID в количестве quantity для посетителя, входящего в группы пользователей arUserGroups.</p>
	 *
	 *
	 *
	 *
	 * @param int $productID  Код товара.
	 *
	 *
	 *
	 * @param  $int  Приобретаемое количество.
	 *
	 *
	 *
	 * @param quantit $y = 1[ массив групп, которым принадлежит пользователь. Для текущего
	 * пользователя он возвращается методом $USER-&gt;GetUserGroupArray() 
	 *
	 *
	 *
	 * @param array $arUserGroups = array()[ "Y", если вычисляется для продления товара (продажа контента), "N" в
	 * остальных случаях.
	 *
	 *
	 *
	 * @param string $renewal = "N"[ Массив цен. Если он установлен, то пересчет идет не по ценам из
	 * базы данных, а по ценам из этого массива. Представляет собой
	 * массив ассоциативных массивов с ключами: <ul> <li> <b>ID</b> - код цены;</li>
	 * <li> <b>PRICE</b> - цена;</li> <li> <b>CURRENCY</b> - валюта;</li> <li> <b>CATALOG_GROUP_ID</b> - код
	 * типа цен.</li> </ul>
	 *
	 *
	 *
	 * @param array $arPrices = array()[ Сайт, для которого производится вычисление. Если парамерт равен
	 * <i>false</i>, то берется текущий сайт.
	 *
	 *
	 *
	 * @param string $siteID = false]]]]] 
	 *
	 *
	 *
	 * @return array <p>Массив вида:</p><pre class="syntax">array( "PRICE" =&gt;
	 * массив_параметров_минимальной_цены, "DISCOUNT_PRICE" =&gt;
	 * минимальная_цена_в_базовой_валюте, "DISCOUNT" =&gt;
	 * массив_параметров_максимальной_доступной_скидки )</pre><p><b>Обратите
	 * внимание, что</b> <i>DISCOUNT_PRICE</i> это минимальная цена в <b>базовой
	 * валюте</b>. Чтобы перевести эту цену в валюту товара,
	 * необходимо:</p><pre class="syntax">array( $baseCurrency = CCurrency::GetBaseCurrency();
	 * $arPrice["DISCOUNT_PRICE"] = CCurrencyRates::ConvertCurrency($arPrice['DISCOUNT_PRICE'], $baseCurrency,
	 * $arPrice["PRICE"]["CURRENCY"]); )</pre><a name="examples"></a>
	 *
	 *
	 * <h4>Example</h4> 
	 * <pre>
	 * &lt;?
	 * $arPrice = CCatalogProduct::GetOptimalPrice($productID, $quantity, $USER-&gt;GetUserGroupArray(), $renewal);
	 * if (!$arPrice || count($arPrice) &lt;= 0)
	 * {
	 *     if ($nearestQuantity = CCatalogProduct::GetNearestQuantityPrice($productID, $quantity, $USER-&gt;GetUserGroupArray()))
	 *     {
	 *         $quantity = $nearestQuantity;
	 *         $arPrice = CCatalogProduct::GetOptimalPrice($productID, $quantity, $USER-&gt;GetUserGroupArray(), $renewal);
	 *     }
	 * }
	 * echo "&lt;pre&gt;";
	 * print_r($arPrice);
	 * echo "&lt;/pre&gt;";
	 * ?&gt;
	 * </pre>
	 *
	 *
	 * @static
	 * @link http://dev.1c-bitrix.ru/api_help/catalog/classes/ccatalogproduct/ccatalogproduct__getoptimalprice.7c16046d.php
	 * @author Bitrix
	 */
	public static function GetOptimalPrice($intProductID, $quantity = 1, $arUserGroups = array(), $renewal = "N", $arPrices = array(), $siteID = false, $arDiscountCoupons = false)
	{
		global $APPLICATION;

		$mxResult = true;
		foreach (GetModuleEvents("catalog", "OnGetOptimalPrice", true) as $arEvent)
		{
			$mxResult = ExecuteModuleEventEx($arEvent, array($intProductID, $quantity, $arUserGroups, $renewal, $arPrices, $siteID, $arDiscountCoupons));
			if (true !== $mxResult)
				return $mxResult;
		}

		$intProductID = intval($intProductID);
		if (0 >= $intProductID)
		{
			$APPLICATION->ThrowException(GetMessage("BT_MOD_CATALOG_PROD_ERR_PRODUCT_ID_ABSENT"), "NO_PRODUCT_ID");
			return false;
		}

		$quantity = doubleval($quantity);
		if (0 >= $quantity)
		{
			$APPLICATION->ThrowException(GetMessage("BT_MOD_CATALOG_PROD_ERR_QUANTITY_ABSENT"), "NO_QUANTITY");
			return false;
		}

		if (!is_array($arUserGroups) && intval($arUserGroups)."|" == $arUserGroups."|")
			$arUserGroups = array(intval($arUserGroups));

		if (!is_array($arUserGroups))
			$arUserGroups = array();

		if (!in_array(2, $arUserGroups))
			$arUserGroups[] = 2;

		$rsVAT = CCatalogProduct::GetVATInfo($intProductID);
		if ($arVAT = $rsVAT->Fetch())
		{
			$arVAT['RATE'] = doubleval($arVAT['RATE'] * 0.01);
		}
		else
		{
			$arVAT = array('RATE' => 0.0, 'VAT_INCLUDED' => 'N');
		}

		$renewal = (($renewal == "N") ? "N" : "Y");

		if (false === $siteID)
			$siteID = SITE_ID;

		if (false === $arDiscountCoupons)
			$arDiscountCoupons = CCatalogDiscountCoupon::GetCoupons();

		$strBaseCurrency = CCurrency::GetBaseCurrency();
		if (empty($strBaseCurrency))
		{
			$APPLICATION->ThrowException(GetMessage("BT_MOD_CATALOG_PROD_ERR_NO_BASE_CURRENCY"), "NO_BASE_CURRENCY");
			return false;
		}

		$intIBlockID = intval(CIBlockElement::GetIBlockByID($intProductID));
		if (0 >= $intIBlockID)
		{
			$APPLICATION->ThrowException(str_replace("#ID#", $intProductID, GetMessage('BT_MOD_CATALOG_PROD_ERR_ELEMENT_ID_NOT_FOUND')), "NO_ELEMENT");
			return false;
		}

		if (!isset($arPrices) || !is_array($arPrices))
			$arPrices = array();

		if (empty($arPrices))
		{
			$arPrices = array();
			$dbPriceList = CPrice::GetListEx(
				array(),
				array(
						"PRODUCT_ID" => $intProductID,
						"GROUP_GROUP_ID" => $arUserGroups,
						"GROUP_BUY" => "Y",
						"+<=QUANTITY_FROM" => $quantity,
						"+>=QUANTITY_TO" => $quantity
					),
				false,
				false,
				array("ID", "CATALOG_GROUP_ID", "PRICE", "CURRENCY")
			);
			while ($arPriceList = $dbPriceList->Fetch())
			{
				$arPriceList['ELEMENT_IBLOCK_ID'] = $intIBlockID;
				$arPrices[] = $arPriceList;
			}
		}
		else
		{
			foreach ($arPrices as &$arOnePrice)
			{
				$arOnePrice['ELEMENT_IBLOCK_ID'] = $intIBlockID;
			}
			if (isset($arOnePrice))
				unset($arOnePrice);
		}

		if (empty($arPrices))
			return false;

//		$boolDiscountVat = ('N' != COption::GetOptionString('catalog', 'discount_vat', 'Y'));
		$boolDiscountVat = true;
		$strDiscSaveApply = COption::GetOptionString('catalog', 'discsave_apply', 'R');

		$dblMinPrice = -1;
		$arMinPrice = array();
		$arMinDiscounts = array();

		foreach ($arPrices as &$arPriceList)
		{
			$arPriceList['VAT_RATE'] = $arVAT['RATE'];
			$arPriceList['VAT_INCLUDED'] = $arVAT['VAT_INCLUDED'];
			$arPriceList['ORIG_VAT_INCLUDED'] = $arPriceList['VAT_INCLUDED'];

			if ($boolDiscountVat)
			{
				if ('N' == $arPriceList['VAT_INCLUDED'])
				{
					$arPriceList['PRICE'] *= (1 + $arPriceList['VAT_RATE']);
					$arPriceList['VAT_INCLUDED'] = 'Y';
				}
			}
			else
			{
				if ('Y' == $arPriceList['VAT_INCLUDED'])
				{
					$arPriceList['PRICE'] /= (1 + $arPriceList['VAT_RATE']);
					$arPriceList['VAT_INCLUDED'] = 'N';
				}
			}

			if ($arPriceList["CURRENCY"] == $strBaseCurrency)
				$dblCurrentPrice = $arPriceList["PRICE"];
			else
				$dblCurrentPrice = CCurrencyRates::ConvertCurrency($arPriceList["PRICE"], $arPriceList["CURRENCY"], $strBaseCurrency);

			$arDiscounts = CCatalogDiscount::GetDiscount($intProductID, $intIBlockID, $arPriceList["CATALOG_GROUP_ID"], $arUserGroups, $renewal, $siteID, $arDiscountCoupons);

			$arDiscSave = array();
			$arPriceDiscount = array();

			$arResultPrice = array(
				'PRICE' => $dblCurrentPrice,
				'CURRENCY' => $strBaseCurrency,
			);
			$arDiscountApply = array();

			if (!empty($arDiscounts))
			{
				CCatalogProduct::__PrimaryDiscountFilter($arDiscounts, $arPriceDiscount, $arDiscSave, $arResultPrice);

				if (!empty($arPriceDiscount))
				{
					foreach ($arPriceDiscount as &$arOnePriority)
					{
						$boolResultPriority = CCatalogProduct::__CalcOnePriority($arOnePriority, $arDiscountApply, $arResultPrice);
						if (!$boolResultPriority)
						{
							return false;
						}
						else
						{
							if (isset($arResultPrice['LAST_DISCOUNT']) && 'Y' == $arResultPrice['LAST_DISCOUNT'])
								break;
						}
					}
					if (isset($arOnePriority))
						unset($arOnePriority);
				}

				if (!empty($arDiscSave))
				{
					switch($strDiscSaveApply)
					{
					case 'R':
						$arDiscSaveResult = array(
							'PRICE' => $dblCurrentPrice,
							'CURRENCY' => $strBaseCurrency,
						);
						$arDiscSaveApply = array();
						$boolResultDiscSave = CCatalogProduct::__CalcDiscSave($arDiscSave, $arDiscSaveApply, $arDiscSaveResult);
						if (!$boolResultDiscSave)
						{
							return false;
						}
						else
						{
							if ($arDiscSaveResult['PRICE'] < $arResultPrice['PRICE'])
							{
								$arResultPrice = $arDiscSaveResult;
								$arDiscountApply = $arDiscSaveApply;
							}
						}
						break;
					case 'A':
						$boolResultDiscSave = CCatalogProduct::__CalcDiscSave($arDiscSave, $arDiscountApply, $arResultPrice);
						if (!$boolResultDiscSave)
						{
							return false;
						}
						break;
					case 'D':
						if (empty($arDiscountApply))
						{
							$boolResultDiscSave = CCatalogProduct::__CalcDiscSave($arDiscSave, $arDiscountApply, $arResultPrice);
							if (!$boolResultDiscSave)
							{
								return false;
							}
						}
						break;
					}
				}
			}

			if (-1 == $dblMinPrice || $dblMinPrice > $arResultPrice['PRICE'])
			{
				$dblMinPrice = $arResultPrice['PRICE'];
				$arMinPrice = $arPriceList;
				$arMinDiscounts = $arDiscountApply;
			}
		}
		if (isset($arPriceList))
			unset($arPriceList);

		if ($boolDiscountVat)
		{
			if ('N' == $arMinPrice['ORIG_VAT_INCLUDED'])
			{
				$arMinPrice['PRICE'] /= (1 + $arMinPrice['VAT_RATE']);
				$arMinPrice['VAT_INCLUDED'] = $arMinPrice['ORIG_VAT_INCLUDED'];
			}
		}
		else
		{
			if ('Y' == $arMinPrice['ORIG_VAT_INCLUDED'])
			{
				$arMinPrice['PRICE'] *= (1 + $arMinPrice['VAT_RATE']);
				$arMinPrice['VAT_INCLUDED'] = $arMinPrice['ORIG_VAT_INCLUDED'];
			}
		}
		unset($arMinPrice['ORIG_VAT_INCLUDED']);

		$dblMinPrice = roundEx($dblMinPrice, CATALOG_VALUE_PRECISION);

		$arResult = array(
			'PRICE' => $arMinPrice,
			'DISCOUNT_PRICE' => $dblMinPrice,
			'DISCOUNT' => array(),
			'DISCOUNT_LIST' => array(),
		);
		if (!empty($arMinDiscounts))
		{
			reset($arMinDiscounts);
			$arResult['DISCOUNT'] = current($arMinDiscounts);
			$arResult['DISCOUNT_LIST'] = $arMinDiscounts;
		}

		foreach (GetModuleEvents("catalog", "OnGetOptimalPriceResult", true) as $arEvent)
		{
			if (ExecuteModuleEventEx($arEvent, array(&$arResult))===false)
				return false;
		}

		return $arResult;
	}
Esempio n. 6
0
function getProductDataToFillBasket($productId, $quantity, $userId, $LID, $userColumns, $tmpId = "")
{
	if (!\Bitrix\Main\Loader::includeModule("catalog"))
		return array();

	$arParams = array();

	$productId = (int)$productId;
	if ($productId <= 0)
	{
		return $arParams;
	}
	$iblockId = (int)CIBlockElement::GetIBlockByID($productId);
	if ($iblockId <= 0)
	{
		return $arParams;
	}

	$arSku2Parent = array();
	$arElementId = array();

	$arElementId[] = $productId;
	$arParent = CCatalogSku::GetProductInfo($productId, $iblockId);
	if ($arParent)
	{
		$arElementId[] = $arParent["ID"];
		$arSku2Parent[$productId] = $arParent["ID"];
	}

	$arPropertyInfo = array();
	$userColumns = (string)$userColumns;
	$arUserColumns = ($userColumns != '') ? explode(",", $userColumns) : array();
	foreach ($arUserColumns as $key => $column)
	{
		if (strncmp($column, 'PROPERTY_', 9) != 0)
		{
			unset($arUserColumns[$key]);
		}
		else
		{
			$propertyCode = substr($column, 9);
			if ($propertyCode == '')
			{
				unset($arUserColumns[$key]);
				continue;
			}
			$dbres = CIBlockProperty::GetList(array(), array("CODE" => $propertyCode));
			if ($arPropData = $dbres->GetNext())
				$arPropertyInfo[$column] = $arPropData;
		}
	}

	$arSelect = array_merge(
		array("ID", "NAME", "LID", "IBLOCK_ID", "IBLOCK_SECTION_ID", "DETAIL_PICTURE", "PREVIEW_PICTURE", "DETAIL_PAGE_URL", "XML_ID", "IBLOCK_XML_ID"),
		$arUserColumns
	);

	$arProductData = getProductProps($arElementId, $arSelect);

	$defaultMeasure = CCatalogMeasure::getDefaultMeasure(true, true);

	if (!empty($arProductData))
	{
		$arElementInfo = array();
		foreach ($arProductData as $elemId => &$arElement)
		{
			foreach ($arElement as $key => $value)
			{
				if (strncmp($key, 'PROPERTY_', 9) == 0 && substr($key, -6) == "_VALUE")
				{
					$columnCode = str_replace("_VALUE", "", $key);
					$arElement[$key] = getIblockPropInfo($value, $arPropertyInfo[$columnCode], array("WIDTH" => 90, "HEIGHT" => 90));
				}
			}
		}
		unset($arElement);

		if (isset($arProductData[$productId]))
			$arElementInfo = $arProductData[$productId];

		if (isset( $arSku2Parent[$productId]))
			$arParent = $arProductData[$arSku2Parent[$productId]];

		if (!empty($arSku2Parent)) // if sku element doesn't have value of some property - we'll show parent element value instead
		{
			foreach ($arUserColumns as $field)
			{
				$fieldVal = $field."_VALUE";
				$parentId = $arSku2Parent[$productId];

				if ((!isset($arElementInfo[$fieldVal]) || (isset($arElementInfo[$fieldVal]) && strlen($arElementInfo[$fieldVal]) == 0))
					&& (isset($arProductData[$parentId][$fieldVal]) && !empty($arProductData[$parentId][$fieldVal]))) // can be array or string
				{
					$arElementInfo[$fieldVal] = $arProductData[$parentId][$fieldVal];
				}
			}
			if (strpos($arElementInfo["~XML_ID"], '#') === false)
			{
				$arElementInfo["~XML_ID"] = $arParent['~XML_ID'].'#'.$arElementInfo["~XML_ID"];
			}
		}

		$arElementInfo["MODULE"] = "catalog";
		$arElementInfo["PRODUCT_PROVIDER_CLASS"] = "CCatalogProductProvider";

		$arElementInfo["PRODUCT_ID"] = $arElementInfo["ID"];

		if ($arElementInfo["IBLOCK_ID"] > 0)
		{
			$arElementInfo["EDIT_PAGE_URL"] = CIBlock::GetAdminElementEditLink($arElementInfo["IBLOCK_ID"], $arElementInfo["PRODUCT_ID"], array(
				"find_section_section" => $arElementInfo["IBLOCK_SECTION_ID"],
				'WF' => 'Y',
			));
		}

		$arBuyerGroups = CUser::GetUserGroup($userId);

		// price
		$arPrice = CCatalogProduct::GetOptimalPrice($arElementInfo["ID"], 1, $arBuyerGroups, "N", array(), $LID);
		$currentPrice = $arPrice["DISCOUNT_PRICE"];
		$arElementInfo["PRICE"] = $currentPrice;
		$arElementInfo["CURRENCY"] = $arPrice["PRICE"]["CURRENCY"];
		$arElementInfo["DISCOUNT_PRICE"] = $arPrice["PRICE"]["PRICE"] - $arPrice["DISCOUNT_PRICE"];
		$currentTotalPrice = ($arElementInfo["PRICE"] + $arElementInfo["DISCOUNT_PRICE"]);
		$discountPercent = 0;
		if ($arElementInfo["DISCOUNT_PRICE"] > 0)
			$discountPercent = intval(($arElementInfo["DISCOUNT_PRICE"] * 100) / $currentTotalPrice);

		$rsProducts = CCatalogProduct::GetList(
			array(),
			array('ID' => $productId),
			false,
			false,
			array('ID', 'QUANTITY', 'WEIGHT', 'MEASURE', 'TYPE', 'BARCODE_MULTI')
		);
		if (!($arProduct = $rsProducts->Fetch()))
		{
			return array();
		}
		$balance = floatval($arProduct["QUANTITY"]);

		// sku props
		$arSkuData = array();
		$arProps[] = array(
			"NAME" => "Catalog XML_ID",
			"CODE" => "CATALOG.XML_ID",
			"VALUE" => $arElementInfo['~IBLOCK_XML_ID']
		);
		$arSkuProperty = CSaleProduct::GetProductSkuProps($productId, '', true);
		if (!empty($arSkuProperty))
		{
			foreach ($arSkuProperty as &$val)
			{
				$arSkuData[] = array(
					'NAME' => $val['NAME'],
					'VALUE' => $val['VALUE'],
					'CODE' => $val['CODE']
				);
			}
			unset($val);
		}
		$arSkuData[] = array(
			"NAME" => "Product XML_ID",
			"CODE" => "PRODUCT.XML_ID",
			"VALUE" => $arElementInfo["~XML_ID"]
		);

		// currency
		$arCurFormat = CCurrencyLang::GetCurrencyFormat($arElementInfo["CURRENCY"]);
		$priceValutaFormat = str_replace("#", "", $arCurFormat["FORMAT_STRING"]);

		$arElementInfo["WEIGHT"] = $arProduct["WEIGHT"];

		// measure
		$arElementInfo["MEASURE_TEXT"] = "";
		if ((int)$arProduct["MEASURE"] > 0)
		{
			$dbMeasure = CCatalogMeasure::GetList(array(), array("ID" => intval($arProduct["MEASURE"])), false, false, array("ID", "SYMBOL_RUS", "SYMBOL_INTL"));
			if ($arMeasure = $dbMeasure->Fetch())
				$arElementInfo["MEASURE_TEXT"] = ($arMeasure["SYMBOL_RUS"] != '' ? $arMeasure["SYMBOL_RUS"] : $arMeasure["SYMBOL_INTL"]);
		}
		if ($arElementInfo["MEASURE_TEXT"] == '')
		{
			$arElementInfo["MEASURE_TEXT"] = ($defaultMeasure["SYMBOL_RUS"] != '' ? $defaultMeasure["SYMBOL_RUS"] : $defaultMeasure["SYMBOL_INTL"]);
		}


		// ratio
		$arElementInfo["RATIO"] = 1;
		$dbratio = CCatalogMeasureRatio::GetList(array(), array("PRODUCT_ID" => $productId));
		if ($arRatio = $dbratio->Fetch())
			$arElementInfo["RATIO"] = $arRatio["RATIO"];

		// image
		if ($arElementInfo["PREVIEW_PICTURE"] > 0)
			$imgCode = $arElementInfo["PREVIEW_PICTURE"];
		elseif ($arElementInfo["DETAIL_PICTURE"] > 0)
			$imgCode = $arElementInfo["DETAIL_PICTURE"];

		if ($imgCode == "" && count($arParent) > 0)
		{
			if ($arParent["PREVIEW_PICTURE"] > 0)
				$imgCode = $arParent["PREVIEW_PICTURE"];
			elseif ($arParent["DETAIL_PICTURE"] > 0)
				$imgCode = $arParent["DETAIL_PICTURE"];
		}

		if ($imgCode > 0)
		{
			$arFile = CFile::GetFileArray($imgCode);
			$arImgProduct = CFile::ResizeImageGet($arFile, array('width'=>80, 'height'=>80), BX_RESIZE_IMAGE_PROPORTIONAL, false, false);
			if (is_array($arImgProduct))
				$imgUrl = $arImgProduct["src"];
		}

		$arSetInfo = array();
		$arStores = array();

		/** @var $productProvider IBXSaleProductProvider */
		if ($productProvider = CSaleBasket::GetProductProvider(array("MODULE" => $arElementInfo["MODULE"], "PRODUCT_PROVIDER_CLASS" => $arElementInfo["PRODUCT_PROVIDER_CLASS"])))
		{
			// get set items if it is set
			if ($arProduct["TYPE"] == CCatalogProduct::TYPE_SET)
			{
				if (method_exists($productProvider, "GetSetItems"))
				{
					$arSets = $productProvider::GetSetItems($productId, CSaleBasket::TYPE_SET);

					if ($tmpId == "")
						$tmpId = randString(7);

					if (!empty($arSets))
					{
						foreach ($arSets as $arSetData)
						{
							foreach ($arSetData["ITEMS"] as $setItem)
							{
								$arSetItemParams = getProductDataToFillBasket($setItem["PRODUCT_ID"], $setItem["QUANTITY"], $userId, $LID, $userColumns, $tmpId); // recursive call

								// re-define some fields with set data values
								$arSetItemParams["id"] = $setItem["PRODUCT_ID"];
								$arSetItemParams["name"] = $setItem["NAME"];
								$arSetItemParams["module"] = $setItem["MODULE"];
								$arSetItemParams["productProviderClass"] = $setItem["PRODUCT_PROVIDER_CLASS"];
								$arSetItemParams["url"] = $setItem["DETAIL_PAGE_URL"];
								$arSetItemParams["quantity"] = $setItem["QUANTITY"] * $quantity;
								$arSetItemParams["barcodeMulti"] = $setItem["BARCODE_MULTI"];
								$arSetItemParams["productType"] = $setItem["TYPE"];
								$arSetItemParams["weight"] = $setItem["WEIGHT"];
								$arSetItemParams["vatRate"] = $setItem["VAT_RATE"];
								$arSetItemParams["setItems"] = "";

								$arSetItemParams["setParentId"] = $productId."_tmp".$tmpId;
								$arSetItemParams["isSetItem"] = "Y";
								$arSetItemParams["isSetParent"] = "N";

								$arSetInfo[] = $arSetItemParams;
							}
						}
					}
				}
			}

			// get stores
			$storeCount = $productProvider::GetStoresCount(array("SITE_ID" => $LID)); // with exact SITE_ID or SITE_ID = NULL

			if ($storeCount > 0)
			{
				if ($arProductStore = $productProvider::GetProductStores(array("PRODUCT_ID" => $productId, "SITE_ID" => $LID)))
					$arStores = $arProductStore;
			}
		}

		$currentTotalPrice = (float)$currentTotalPrice;
		// params array
		$arParams["id"] = $productId;
		$arParams["name"] = $arElementInfo["~NAME"];
		$arParams["url"] = htmlspecialcharsex($arElementInfo["~DETAIL_PAGE_URL"]);
		$arParams["urlEdit"] = $arElementInfo["EDIT_PAGE_URL"];
		$arParams["urlImg"] = $imgUrl;
		$arParams["price"] = floatval($arElementInfo["PRICE"]);
		$arParams["priceBase"] = $currentTotalPrice;
		$arParams["priceBaseFormat"] = CCurrencyLang::CurrencyFormat($currentTotalPrice, $arElementInfo["CURRENCY"], false);
		$arParams["priceFormated"] = CCurrencyLang::CurrencyFormat(floatval($arElementInfo["PRICE"]), $arElementInfo["CURRENCY"], false);
		$arParams["valutaFormat"] = $priceValutaFormat;
		$arParams["dimensions"] = serialize(array("WIDTH" => $arElementInfo["WIDTH"], "HEIGHT" => $arElementInfo["HEIGHT"], "LENGTH" => $arElementInfo["LENGTH"]));
		$arParams["priceDiscount"] = floatval($arElementInfo["DISCOUNT_PRICE"]);
		$arParams["priceTotalFormated"] = CCurrencyLang::CurrencyFormat($currentTotalPrice, $arElementInfo["CURRENCY"], true);
		$arParams["discountPercent"] = $discountPercent;
		$arParams["summaFormated"] = CCurrencyLang::CurrencyFormat($arElementInfo["PRICE"], $arElementInfo["CURRENCY"], false);
		$arParams["quantity"] = $quantity;
		$arParams["module"] = $arElementInfo["MODULE"];
		$arParams["currency"] = $arElementInfo["CURRENCY"];
		$arParams["weight"] = $arElementInfo["WEIGHT"];
		$arParams["vatRate"] = $arPrice["PRICE"]["VAT_RATE"];
		$arParams["priceType"] = $arPrice["PRICE"]["CATALOG_GROUP_NAME"];
		$arParams["balance"] = $balance;
		$arParams["notes"] = (is_array($arPrice["PRICE"]) && array_key_exists("CATALOG_GROUP_NAME", $arPrice["PRICE"])) ? $arPrice["PRICE"]["CATALOG_GROUP_NAME"] : "";
		$arParams["catalogXmlID"] = $arElementInfo["~IBLOCK_XML_ID"];
		$arParams["productXmlID"] = $arElementInfo["~XML_ID"];
		$arParams["callback"] = "";
		$arParams["orderCallback"] = "";
		$arParams["cancelCallback"] = "";
		$arParams["payCallback"] = "";
		$arParams["productProviderClass"] = $arElementInfo["PRODUCT_PROVIDER_CLASS"];
		$arParams["skuProps"] = $arSkuData;
		$arParams["measureText"] = $arElementInfo["MEASURE_TEXT"];
		$arParams["ratio"] = $arElementInfo["RATIO"];
		$arParams["barcodeMulti"] = $arProduct["BARCODE_MULTI"];

		$arParams["productType"] = empty($arSetInfo) ? "" : CSaleBasket::TYPE_SET;
		$arParams["setParentId"] = empty($arSetInfo) ? "" : $productId."_tmp".$tmpId;

		$arParams["setItems"] = $arSetInfo;
		$arParams["isSetItem"] = "N";
		$arParams["isSetParent"] = empty($arSetInfo) ? "N" : "Y";

		$arParams["stores"] = empty($arSetInfo) ? $arStores : array();
		$arParams["productPropsValues"] = $arElementInfo; // along with other information also contains values of properties with correct keys (after getProductProps)
	}

	return $arParams;
}
/**
 * @param $userId
 * @param $lid
 * @param $productId
 * @param string $productName
 * @param string $currency
 * @param array $arProduct
 * @return array|bool
 */
function GetProductSku($userId, $lid, $productId, $productName = '', $currency = '', $arProduct = array())
{
    $userId = intval($userId);
    $productId = intval($productId);
    if ($productId <= 0) {
        return false;
    }
    $lid = trim($lid);
    if (strlen($lid) <= 0) {
        return false;
    }
    $productName = trim($productName);
    $arResult = array();
    static $arCacheGroups = array();
    if (!isset($arCacheGroups[$userId])) {
        $arCacheGroups[$userId] = CUser::GetUserGroup($userId);
    }
    $arGroups = $arCacheGroups[$userId];
    if (!isset($arProduct["IBLOCK_ID"]) || 0 >= intval($arProduct["IBLOCK_ID"])) {
        $arProduct["IBLOCK_ID"] = CIBlockElement::GetIBlockByID($arProduct["IBLOCK_ID"]);
    }
    static $arOffersIblock = array();
    if (!isset($arOffersIblock[$arProduct["IBLOCK_ID"]])) {
        $mxResult = CCatalogSKU::GetInfoByProductIBlock($arProduct["IBLOCK_ID"]);
        if (is_array($mxResult)) {
            $arOffersIblock[$arProduct["IBLOCK_ID"]] = $mxResult["IBLOCK_ID"];
        }
    }
    if ($arOffersIblock[$arProduct["IBLOCK_ID"]] > 0) {
        static $arCacheOfferProperties = array();
        if (!is_set($arCacheOfferProperties[$arOffersIblock[$arProduct["IBLOCK_ID"]]])) {
            $dbOfferProperties = CIBlockProperty::GetList(array('SORT' => 'ASC', 'ID' => 'ASC'), array('IBLOCK_ID' => $arOffersIblock[$arProduct["IBLOCK_ID"]], 'ACTIVE' => 'Y', "!XML_ID" => "CML2_LINK"));
            while ($arOfferProperties = $dbOfferProperties->Fetch()) {
                if ('F' == $arOfferProperties['PROPERTY_TYPE']) {
                    continue;
                }
                $arCacheOfferProperties[$arOffersIblock[$arProduct["IBLOCK_ID"]]][] = $arOfferProperties;
            }
        }
        $arOfferProperties = $arCacheOfferProperties[$arOffersIblock[$arProduct["IBLOCK_ID"]]];
        $arIblockOfferProps = array();
        $arIblockOfferPropsFilter = array();
        if (is_array($arOfferProperties)) {
            foreach ($arOfferProperties as $val) {
                $arIblockOfferProps[] = array("CODE" => $val["CODE"], "NAME" => $val["NAME"]);
                $arIblockOfferPropsFilter[] = $val["CODE"];
            }
        }
        $arOffers = CIBlockPriceTools::GetOffersArray($arProduct["IBLOCK_ID"], $productId, array("ID" => "DESC"), array("NAME", "EXTERNAL_ID"), $arIblockOfferPropsFilter, 0, array(), 1, array(), $userId, $lid);
        $arSku = array();
        $arSkuId = array();
        $arImgSku = array();
        foreach ($arOffers as $arOffer) {
            $arSkuId[] = $arOffer['ID'];
        }
        if (!empty($arSkuId)) {
            $res = CIBlockElement::GetList(array(), array("ID" => $arSkuId), false, false, array("ID", "IBLOCK_ID", "NAME", "PREVIEW_PICTURE", "DETAIL_PICTURE", "DETAIL_PAGE_URL", "ACTIVE"));
            while ($arOfferImg = $res->GetNext()) {
                $arImgSku[$arOfferImg["ID"]] = $arOfferImg;
            }
        }
        $arOffersId = array();
        foreach ($arOffers as $arOffer) {
            $arOffersId[] = $arOffer['ID'];
        }
        $dbCatalogProduct = CCatalogProduct::GetList(array(), array("ID" => $arOffersId));
        while ($arCatalogProduct = $dbCatalogProduct->fetch()) {
            $arCatalogProductResult[$arCatalogProduct["ID"]] = $arCatalogProduct;
        }
        foreach ($arOffers as $arOffer) {
            $arSkuTmp = array();
            $active = '';
            $arOffer["CAN_BUY"] = "N";
            $arCatalogProduct = $arCatalogProductResult[$arOffer["ID"]];
            if (!empty($arCatalogProduct)) {
                if ($arCatalogProduct["CAN_BUY_ZERO"] != "Y" && ($arCatalogProduct["QUANTITY_TRACE"] == "Y" && doubleval($arCatalogProduct["QUANTITY"]) <= 0)) {
                    $arOffer["CAN_BUY"] = "N";
                } else {
                    $arOffer["CAN_BUY"] = "Y";
                }
            }
            $arSkuTmp["ImageUrl"] = '';
            if ($arOffer["CAN_BUY"] == "Y") {
                if (isset($arImgSku[$arOffer['ID']]) && !empty($arImgSku[$arOffer['ID']])) {
                    if ('' == $productName) {
                        $productName = $arImgSku[$arOffer['ID']]["~NAME"];
                    }
                    $active = $arImgSku[$arOffer['ID']]["ACTIVE"];
                    if ($arImgSku[$arOffer['ID']]["PREVIEW_PICTURE"] != "") {
                        $arSkuTmp["PREVIEW_PICTURE"] = $arImgSku[$arOffer['ID']]["PREVIEW_PICTURE"];
                    }
                    if ($arImgSku[$arOffer['ID']]["DETAIL_PICTURE"] != "") {
                        $arSkuTmp["DETAIL_PICTURE"] = $arImgSku[$arOffer['ID']]["DETAIL_PICTURE"];
                    }
                }
            }
            foreach ($arIblockOfferProps as $arCode) {
                if (is_array($arCode) && isset($arOffer["PROPERTIES"][$arCode["CODE"]])) {
                    if (isset($arOffer["DISPLAY_PROPERTIES"][$arCode["CODE"]])) {
                        $mxValues = '';
                        if ('E' == $arOffer["DISPLAY_PROPERTIES"][$arCode["CODE"]]['PROPERTY_TYPE']) {
                            if (!empty($arOffer["DISPLAY_PROPERTIES"][$arCode["CODE"]]['LINK_ELEMENT_VALUE'])) {
                                $mxValues = array();
                                foreach ($arOffer["DISPLAY_PROPERTIES"][$arCode["CODE"]]['LINK_ELEMENT_VALUE'] as $arTempo) {
                                    $mxValues[] = $arTempo['NAME'] . ' [' . $arTempo['ID'] . ']';
                                }
                            }
                        } elseif ('G' == $arOffer["DISPLAY_PROPERTIES"][$arCode["CODE"]]['PROPERTY_TYPE']) {
                            if (!empty($arOffer["DISPLAY_PROPERTIES"][$arCode["CODE"]]['LINK_SECTION_VALUE'])) {
                                $mxValues = array();
                                foreach ($arOffer["DISPLAY_PROPERTIES"][$arCode["CODE"]]['LINK_SECTION_VALUE'] as $arTempo) {
                                    $mxValues[] = $arTempo['NAME'] . ' [' . $arTempo['ID'] . ']';
                                }
                            }
                        }
                        if (empty($mxValues)) {
                            $mxValues = $arOffer["DISPLAY_PROPERTIES"][$arCode["CODE"]]["DISPLAY_VALUE"];
                        }
                        $arSkuTmp[] = strip_tags(is_array($mxValues) ? implode("/ ", $mxValues) : $mxValues);
                    } else {
                        $arSkuTmp[] = '';
                    }
                }
            }
            if (!empty($arCatalogProduct)) {
                $arSkuTmp["BALANCE"] = $arCatalogProduct["QUANTITY"];
                $arSkuTmp["WEIGHT"] = $arCatalogProduct["WEIGHT"];
                $arSkuTmp["BARCODE_MULTI"] = $arCatalogProduct["BARCODE_MULTI"];
            } else {
                $arSkuTmp["BALANCE"] = 0;
                $arSkuTmp["WEIGHT"] = 0;
                $arSkuTmp["BARCODE_MULTI"] = 'N';
            }
            $arSkuTmp["USER_ID"] = $userId;
            $arSkuTmp["ID"] = $arOffer["ID"];
            $arSkuTmp["TYPE"] = $arOffer["CATALOG_TYPE"];
            $arSkuTmp["NAME"] = CUtil::JSEscape($arOffer["NAME"]);
            $arSkuTmp["PRODUCT_NAME"] = CUtil::JSEscape(htmlspecialcharsbx($productName));
            $arSkuTmp["PRODUCT_ID"] = $productId;
            $arSkuTmp["LID"] = CUtil::JSEscape($lid);
            $arSkuTmp["CAN_BUY"] = $arOffer["CAN_BUY"];
            $arSkuTmp["ACTIVE"] = $active;
            $arSkuTmp["EXTERNAL_ID"] = $arOffer['EXTERNAL_ID'];
            $arSku[] = $arSkuTmp;
        }
        if ((!is_array($arIblockOfferProps) || empty($arIblockOfferProps)) && is_array($arSku) && !empty($arSku)) {
            $arIblockOfferProps[0] = array("CODE" => "TITLE", "NAME" => GetMessage("SKU_TITLE"));
            foreach ($arSku as $key => $val) {
                $arSku[$key][0] = $val["NAME"];
            }
        }
        $arResult["SKU_ELEMENTS"] = $arSku;
        $arResult["SKU_PROPERTIES"] = $arIblockOfferProps;
        $arResult["OFFERS_IBLOCK_ID"] = $arOffersIblock[$arProduct["IBLOCK_ID"]];
    }
    return $arResult;
}
Esempio n. 8
0
				'ID' => $arProp["ID"],
				'URL' => $storeURL,
				'TITLE' => $storeName,
				'PHONE' => $storePhone,
				'SCHEDULE' => $storeSchedule,
				'AMOUNT' => $amount,
				'ELEMENT_ID' => $arProp["ELEMENT_ID"],
			),$numAmount);
	}

	$isProductExistSKU = CCatalogSKU::IsExistOffers($arParams["ELEMENT_ID"]);
	$arResult["IS_SKU"] = false;
	if($isProductExistSKU)
	{
		$arSkuElements = $arSkuInfo = $arResultSkuId = array();
		$intIBlockID = (int)CIBlockElement::GetIBlockByID($arParams["ELEMENT_ID"]);
		if($intIBlockID > 0)
			$arSkuInfo = CCatalogSKU::GetInfoByProductIBlock($intIBlockID);
		if(!empty($arSkuInfo) && is_array($arSkuInfo))
		{
			$dbAllSkuElements = CIBlockElement::GetList(
				array(),
				array('IBLOCK_ID' => $arSkuInfo['IBLOCK_ID'], '=PROPERTY_'.$arSkuInfo['SKU_PROPERTY_ID'] => $arParams["ELEMENT_ID"]),
				false,
				false,
				array('ID')
			);
			while($arAllSkuElements = $dbAllSkuElements->fetch())
			{
				$arSkuElements[] = $arAllSkuElements;
			}
Esempio n. 9
0
function CatalogGetPriceTableEx($ID, $filterQauntity = 0, $arFilterType = array(), $VAT_INCLUDE = 'Y', $arCurrencyParams = array())
{
    global $USER;
    static $arPriceTypes = array();
    $ID = (int) $ID;
    if ($ID <= 0) {
        return false;
    }
    $filterQauntity = (int) $filterQauntity;
    if (!is_array($arFilterType)) {
        $arFilterType = array($arFilterType);
    }
    $boolConvert = false;
    $strCurrencyID = '';
    $arCurrencyList = array();
    if (!empty($arCurrencyParams) && is_array($arCurrencyParams) && !empty($arCurrencyParams['CURRENCY_ID'])) {
        $boolConvert = true;
        $strCurrencyID = $arCurrencyParams['CURRENCY_ID'];
    }
    $arResult = array();
    $arResult["ROWS"] = array();
    $arResult["COLS"] = array();
    $arResult["MATRIX"] = array();
    $arResult["CAN_BUY"] = array();
    $arResult["AVAILABLE"] = "N";
    $cacheTime = CATALOG_CACHE_DEFAULT_TIME;
    if (defined("CATALOG_CACHE_TIME")) {
        $cacheTime = intval(CATALOG_CACHE_TIME);
    }
    $arUserGroups = $USER->GetUserGroupArray();
    CatalogClearArray($arUserGroups, true);
    $strCacheID = 'UG_' . implode('_', $arUserGroups);
    if (isset($arPriceTypes[$strCacheID])) {
        $arPriceGroups = $arPriceTypes[$strCacheID];
    } else {
        $arPriceGroups = CCatalogGroup::GetGroupsPerms($arUserGroups, array());
        $arPriceTypes[$strCacheID] = $arPriceGroups;
    }
    if (empty($arPriceGroups["view"])) {
        return $arResult;
    }
    $currentQuantity = -1;
    $rowsCnt = -1;
    $arFilter = array("PRODUCT_ID" => $ID);
    if ($filterQauntity > 0) {
        $arFilter["+<=QUANTITY_FROM"] = $filterQauntity;
        $arFilter["+>=QUANTITY_TO"] = $filterQauntity;
    }
    if (!empty($arFilterType)) {
        $arTmp = array();
        foreach ($arPriceGroups["view"] as &$intOneGroup) {
            if (in_array($intOneGroup, $arFilterType)) {
                $arTmp[] = $intOneGroup;
            }
        }
        if (isset($intOneGroup)) {
            unset($intOneGroup);
        }
        if (empty($arTmp)) {
            return $arResult;
        }
        $arFilter["CATALOG_GROUP_ID"] = $arTmp;
    } else {
        $arFilter["CATALOG_GROUP_ID"] = $arPriceGroups["view"];
    }
    $productQuantity = 0;
    $productQuantityTrace = "N";
    $dbRes = CCatalogProduct::GetVATInfo($ID);
    if ($arVatInfo = $dbRes->Fetch()) {
        $fVatRate = floatval($arVatInfo['RATE'] * 0.01);
        $bVatIncluded = $arVatInfo['VAT_INCLUDED'] == 'Y';
    } else {
        $fVatRate = 0.0;
        $bVatIncluded = false;
    }
    $rsProducts = CCatalogProduct::GetList(array(), array('ID' => $ID), false, false, array('ID', 'CAN_BUY_ZERO', 'QUANTITY_TRACE', 'QUANTITY'));
    if ($arProduct = $rsProducts->Fetch()) {
        $intIBlockID = CIBlockElement::GetIBlockByID($arProduct['ID']);
        if (!$intIBlockID) {
            return false;
        }
        $arProduct['IBLOCK_ID'] = $intIBlockID;
    } else {
        return false;
    }
    $dbPrice = CPrice::GetListEx(array("QUANTITY_FROM" => "ASC", "QUANTITY_TO" => "ASC"), $arFilter, false, false, array("ID", "CATALOG_GROUP_ID", "PRICE", "CURRENCY", "QUANTITY_FROM", "QUANTITY_TO"));
    while ($arPrice = $dbPrice->Fetch()) {
        if ($VAT_INCLUDE == 'N') {
            if ($bVatIncluded) {
                $arPrice['PRICE'] /= 1 + $fVatRate;
            }
        } else {
            if (!$bVatIncluded) {
                $arPrice['PRICE'] *= 1 + $fVatRate;
            }
        }
        $arPrice['VAT_RATE'] = $fVatRate;
        CCatalogDiscountSave::Disable();
        $arDiscounts = CCatalogDiscount::GetDiscount($ID, $arProduct["IBLOCK_ID"], $arPrice["CATALOG_GROUP_ID"], $arUserGroups, "N", SITE_ID, array());
        CCatalogDiscountSave::Enable();
        $discountPrice = CCatalogProduct::CountPriceWithDiscount($arPrice["PRICE"], $arPrice["CURRENCY"], $arDiscounts);
        $arPrice["DISCOUNT_PRICE"] = $discountPrice;
        $arPrice["QUANTITY_FROM"] = doubleval($arPrice["QUANTITY_FROM"]);
        if ($currentQuantity != $arPrice["QUANTITY_FROM"]) {
            $rowsCnt++;
            $arResult["ROWS"][$rowsCnt]["QUANTITY_FROM"] = $arPrice["QUANTITY_FROM"];
            $arResult["ROWS"][$rowsCnt]["QUANTITY_TO"] = doubleval($arPrice["QUANTITY_TO"]);
            $currentQuantity = $arPrice["QUANTITY_FROM"];
        }
        if ($boolConvert && $strCurrencyID != $arPrice["CURRENCY"]) {
            $arResult["MATRIX"][intval($arPrice["CATALOG_GROUP_ID"])][$rowsCnt] = array("ID" => $arPrice["ID"], "ORIG_PRICE" => $arPrice["PRICE"], "ORIG_DISCOUNT_PRICE" => $arPrice["DISCOUNT_PRICE"], "ORIG_CURRENCY" => $arPrice["CURRENCY"], "ORIG_VAT_RATE" => $arPrice["VAT_RATE"], 'PRICE' => CCurrencyRates::ConvertCurrency($arPrice["PRICE"], $arPrice["CURRENCY"], $strCurrencyID), 'DISCOUNT_PRICE' => CCurrencyRates::ConvertCurrency($arPrice["DISCOUNT_PRICE"], $arPrice["CURRENCY"], $strCurrencyID), 'CURRENCY' => $strCurrencyID, 'VAT_RATE' => CCurrencyRates::ConvertCurrency($arPrice["VAT_RATE"], $arPrice["CURRENCY"], $strCurrencyID));
            $arCurrencyList[] = $arPrice["CURRENCY"];
        } else {
            $arResult["MATRIX"][intval($arPrice["CATALOG_GROUP_ID"])][$rowsCnt] = array("ID" => $arPrice["ID"], "PRICE" => $arPrice["PRICE"], "DISCOUNT_PRICE" => $arPrice["DISCOUNT_PRICE"], "CURRENCY" => $arPrice["CURRENCY"], "VAT_RATE" => $arPrice["VAT_RATE"]);
        }
    }
    $arCatalogGroups = CCatalogGroup::GetListArray();
    foreach ($arCatalogGroups as $key => $value) {
        if (isset($arResult["MATRIX"][$key])) {
            $arResult["COLS"][$value["ID"]] = $value;
        }
    }
    $arResult["CAN_BUY"] = $arPriceGroups["buy"];
    $arResult["AVAILABLE"] = 0 >= $arProduct['QUANTITY'] && 'Y' == $arProduct['QUANTITY_TRACE'] && 'N' == $arProduct['CAN_BUY_ZERO'] ? 'N' : 'Y';
    if ($boolConvert) {
        if (!empty($arCurrencyList)) {
            $arCurrencyList[] = $strCurrencyID;
        }
        $arResult['CURRENCY_LIST'] = $arCurrencyList;
    }
    return $arResult;
}
Esempio n. 10
0
     } else {
         $result["err_code"] = -3;
         //wID doesn't exists, can't delete 0;
     }
     break;
 case 'ADD':
     $param1 = $_REQUEST["PARAM1"];
     $param2 = intval($_REQUEST["PARAM2"]) ?: false;
     $param3 = intval($_REQUEST["PARAM3"]);
     if ($param3 <= 0) {
         $result["err_code"] = -4;
         /*unknow element*/
         break;
     }
     if (!$param2) {
         $param2 = CIBlockElement::GetIBlockByID($param3);
         if (!$param2) {
             $result["err_code"] = -5;
             /*unknown iblock_id*/
             break;
         }
     }
     $dbWishlistElement = CBrWishlist::GetList(array(), array("WL_USER_ID" => $WL_USER_ID, "PARAM1" => $param1, "PARAM2" => $param2, "PARAM3" => $param3), array("ID"));
     if ($arWishlistElement = $dbWishlistElement->GetNext()) {
         //element already exists
         $result["WID"] = $arWishlistElement["ID"];
     } else {
         //add element to wishlist
         $result["WID"] = CBrWishlist::Add(array("WL_USER_ID" => $WL_USER_ID, "PARAM1" => $param1, "PARAM2" => $param2, "PARAM3" => $param3));
     }
     $result["result"] = true;
Esempio n. 11
0
 /**
  * <p>Метод возвращает параметры наименьшей цены товара productID в количестве quantity для посетителя, входящего в группы пользователей arUserGroups. Метод динамичный.</p>
  *
  *
  * @param int $intProductID  Код товара.<br><br> До версии <b>12.0.0</b> параметр назывался <b>productID</b>.
  *
  * @param  $int  Приобретаемое количество.
  *
  * @param quantit $y = 1[ массив групп, которым принадлежит пользователь. Для текущего
  * пользователя он возвращается методом $USER-&gt;GetUserGroupArray() 
  *
  * @param array $arUserGroups = array()[ "Y", если вычисляется для продления товара (продажа контента), "N" в
  * остальных случаях.
  *
  * @param string $renewal = "N"[ Массив цен. Если он установлен, то пересчет идет не по ценам из
  * базы данных, а по ценам из этого массива. Представляет собой
  * массив ассоциативных массивов с ключами: <ul> <li> <b>ID</b> - код цены;</li>
  * <li> <b>PRICE</b> - цена;</li> <li> <b>CURRENCY</b> - валюта;</li> <li> <b>CATALOG_GROUP_ID</b> - код
  * типа цен.</li> </ul>
  *
  * @param array $arPrices = array()[ Сайт, для которого производится вычисление. Если парамерт равен
  * <i>false</i>, то берется текущий сайт.
  *
  * @param string $siteID = false[ Массив купонов, которые влияют на выборку скидок. Если задано
  * значение <i>false</i>, то массив купонов будет взят из
  * <b>CCatalogDiscountCoupon::GetCoupons</b>
  *
  * @param array $arDiscountCoupons = false]]]]]] 
  *
  * @return array <p>Массив вида:</p> <pre class="syntax">array( "PRICE" =&gt;
  * массив_параметров_минимальной_цены, "DISCOUNT_PRICE" =&gt;
  * минимальная_цена_в_базовой_валюте, "DISCOUNT" =&gt;
  * массив_параметров_первой_из_примененных_скидок_торгового_каталога,
  * "DISCOUNT_LIST" =&gt;
  * массив_скидок_действующих_на_товар_в_порядке_применения, "RESULT_PRICE"
  * =&gt; array( "BASE_PRICE" =&gt; полная (без скидок) цена товара, "DISCOUNT_PRICE" =&gt;
  * цена со скидками, "DISCOUNT" =&gt; итоговая скидка (разница между BASE_PRICE и
  * DISCOUNT_PRICE) "PERCENT" =&gt; итоговая скидка в процентах "CURRENCY" =&gt; валюта
  * результата ) )</pre> <p></p><div class="note"> <b>Примечание</b>. С версии 15.0.6 ключ
  * RESULT_PRICE заполняется данными и в том случае, когда использованы
  * обработчики события <a
  * href="http://dev.1c-bitrix.ru/api_help/catalog/events/ongetoptimalprice.php">OnGetOptimalPrice</a>. Параметры
  * заданные методами <a
  * href="http://dev.1c-bitrix.ru/api_help/catalog/classes/ccatalogproduct/setusedcurrency.php">CCatalogProduct::setUsedCurrency</a>
  * и <a
  * href="http://dev.1c-bitrix.ru/api_help/catalog/classes/ccatalogproduct/setpricevatincludemode.php">CCatalogProduct::setPriceVatIncludeMode</a>
  * при этом учитываются, параметры заданные методом <a
  * href="http://dev.1c-bitrix.ru/api_help/catalog/classes/ccatalogproduct/setusediscount.php">CCatalogProduct::setUseDiscount</a>
  * - нет. </div> <p></p><div class="note"> <b>Обратите внимание, что</b> <i>DISCOUNT_PRICE</i> это
  * минимальная цена в <b>базовой валюте</b>. Чтобы перевести эту цену в
  * валюту товара, необходимо: <pre class="syntax">array( $baseCurrency =
  * CCurrency::GetBaseCurrency(); $arPrice["DISCOUNT_PRICE"] = CCurrencyRates::ConvertCurrency($arPrice['DISCOUNT_PRICE'],
  * $baseCurrency, $arPrice["PRICE"]["CURRENCY"]); )</pre> </div> <a name="examples"></a>
  *
  * <h4>Example</h4> 
  * <pre>
  * &lt;?
  * $arPrice = CCatalogProduct::GetOptimalPrice($productID, $quantity, $USER-&gt;GetUserGroupArray(), $renewal);
  * if (!$arPrice || count($arPrice) &lt;= 0)
  * {
  *     if ($nearestQuantity = CCatalogProduct::GetNearestQuantityPrice($productID, $quantity, $USER-&gt;GetUserGroupArray()))
  *     {
  *         $quantity = $nearestQuantity;
  *         $arPrice = CCatalogProduct::GetOptimalPrice($productID, $quantity, $USER-&gt;GetUserGroupArray(), $renewal);
  *     }
  * }
  * echo "&lt;pre&gt;";
  * print_r($arPrice);
  * echo "&lt;/pre&gt;";
  * ?&gt;
  * </pre>
  *
  *
  * @static
  * @link http://dev.1c-bitrix.ru/api_help/catalog/classes/ccatalogproduct/ccatalogproduct__getoptimalprice.7c16046d.php
  * @author Bitrix
  */
 public static function GetOptimalPrice($intProductID, $quantity = 1, $arUserGroups = array(), $renewal = "N", $arPrices = array(), $siteID = false, $arDiscountCoupons = false)
 {
     static $eventOnGetExists = null;
     static $eventOnResultExists = null;
     global $APPLICATION;
     if ($eventOnGetExists === true || $eventOnGetExists === null) {
         foreach (GetModuleEvents('catalog', 'OnGetOptimalPrice', true) as $arEvent) {
             $eventOnGetExists = true;
             $mxResult = ExecuteModuleEventEx($arEvent, array($intProductID, $quantity, $arUserGroups, $renewal, $arPrices, $siteID, $arDiscountCoupons));
             if ($mxResult !== true) {
                 self::updateUserHandlerOptimalPrice($mxResult);
                 return $mxResult;
             }
         }
         if ($eventOnGetExists === null) {
             $eventOnGetExists = false;
         }
     }
     $intProductID = (int) $intProductID;
     if ($intProductID <= 0) {
         $APPLICATION->ThrowException(Loc::getMessage("BT_MOD_CATALOG_PROD_ERR_PRODUCT_ID_ABSENT"), "NO_PRODUCT_ID");
         return false;
     }
     $quantity = (double) $quantity;
     if ($quantity <= 0) {
         $APPLICATION->ThrowException(Loc::getMessage("BT_MOD_CATALOG_PROD_ERR_QUANTITY_ABSENT"), "NO_QUANTITY");
         return false;
     }
     if (!is_array($arUserGroups) && (int) $arUserGroups . '|' == (string) $arUserGroups . '|') {
         $arUserGroups = array((int) $arUserGroups);
     }
     if (!is_array($arUserGroups)) {
         $arUserGroups = array();
     }
     if (!in_array(2, $arUserGroups)) {
         $arUserGroups[] = 2;
     }
     $renewal = $renewal == 'Y' ? 'Y' : 'N';
     if ($siteID === false) {
         $siteID = SITE_ID;
     }
     $resultCurrency = CCurrency::GetBaseCurrency();
     if (empty($resultCurrency)) {
         $APPLICATION->ThrowException(Loc::getMessage("BT_MOD_CATALOG_PROD_ERR_NO_BASE_CURRENCY"), "NO_BASE_CURRENCY");
         return false;
     }
     if (self::$usedCurrency !== null) {
         $resultCurrency = self::$usedCurrency;
     }
     $intIBlockID = (int) CIBlockElement::GetIBlockByID($intProductID);
     if ($intIBlockID <= 0) {
         $APPLICATION->ThrowException(Loc::getMessage('BT_MOD_CATALOG_PROD_ERR_ELEMENT_ID_NOT_FOUND', array('#ID#' => $intProductID)), 'NO_ELEMENT');
         return false;
     }
     if (!isset($arPrices) || !is_array($arPrices)) {
         $arPrices = array();
     }
     if (empty($arPrices)) {
         $arPrices = array();
         $dbPriceList = CPrice::GetListEx(array(), array("PRODUCT_ID" => $intProductID, "GROUP_GROUP_ID" => $arUserGroups, "GROUP_BUY" => "Y", "+<=QUANTITY_FROM" => $quantity, "+>=QUANTITY_TO" => $quantity), false, false, array("ID", "CATALOG_GROUP_ID", "PRICE", "CURRENCY"));
         while ($arPriceList = $dbPriceList->Fetch()) {
             $arPriceList['ELEMENT_IBLOCK_ID'] = $intIBlockID;
             $arPrices[] = $arPriceList;
         }
         unset($arPriceList, $dbPriceList);
     } else {
         foreach ($arPrices as &$arOnePrice) {
             $arOnePrice['ELEMENT_IBLOCK_ID'] = $intIBlockID;
         }
         unset($arOnePrice);
     }
     if (empty($arPrices)) {
         return false;
     }
     $rsVAT = CCatalogProduct::GetVATInfo($intProductID);
     if ($arVAT = $rsVAT->Fetch()) {
         $arVAT['RATE'] = (double) $arVAT['RATE'] * 0.01;
     } else {
         $arVAT = array('RATE' => 0.0, 'VAT_INCLUDED' => 'N');
     }
     unset($rsVAT);
     if (self::getUseDiscount()) {
         if ($arDiscountCoupons === false) {
             $arDiscountCoupons = CCatalogDiscountCoupon::GetCoupons();
         }
     }
     //		$boolDiscountVat = ('N' != COption::GetOptionString('catalog', 'discount_vat', 'Y'));
     $boolDiscountVat = true;
     $minPrice = false;
     $basePrice = false;
     $arMinPrice = array();
     $arMinDiscounts = array();
     foreach ($arPrices as &$arPriceList) {
         $arPriceList['VAT_RATE'] = $arVAT['RATE'];
         $arPriceList['VAT_INCLUDED'] = $arVAT['VAT_INCLUDED'];
         $dblCurrentPrice = $arPriceList['PRICE'];
         if ($boolDiscountVat) {
             if ('N' == $arPriceList['VAT_INCLUDED']) {
                 $dblCurrentPrice *= 1 + $arPriceList['VAT_RATE'];
             }
         } else {
             if ('Y' == $arPriceList['VAT_INCLUDED']) {
                 $dblCurrentPrice /= 1 + $arPriceList['VAT_RATE'];
             }
         }
         if ($arPriceList['CURRENCY'] != $resultCurrency) {
             $dblCurrentPrice = CCurrencyRates::ConvertCurrency($arPriceList['PRICE'], $arPriceList['CURRENCY'], $resultCurrency);
         }
         $dblCurrentPrice = roundEx($dblCurrentPrice, CATALOG_VALUE_PRECISION);
         $arDiscounts = array();
         if (self::getUseDiscount()) {
             $arDiscounts = CCatalogDiscount::GetDiscount($intProductID, $intIBlockID, $arPriceList["CATALOG_GROUP_ID"], $arUserGroups, $renewal, $siteID, $arDiscountCoupons);
         }
         $result = CCatalogDiscount::applyDiscountList($dblCurrentPrice, $resultCurrency, $arDiscounts);
         if ($result === false) {
             return false;
         }
         if ($minPrice === false || $minPrice > $result['PRICE']) {
             $basePrice = $dblCurrentPrice;
             $minPrice = $result['PRICE'];
             $arMinPrice = $arPriceList;
             $arMinDiscounts = $result['DISCOUNT_LIST'];
         }
     }
     unset($arPriceList);
     if ($boolDiscountVat) {
         if (!self::$optimalPriceWithVat) {
             $minPrice /= 1 + $arMinPrice['VAT_RATE'];
             $basePrice /= 1 + $arMinPrice['VAT_RATE'];
             $minPrice = roundEx($minPrice, CATALOG_VALUE_PRECISION);
             $basePrice = roundEx($basePrice, CATALOG_VALUE_PRECISION);
         }
     } else {
         if (self::$optimalPriceWithVat) {
             $minPrice *= 1 + $arMinPrice['VAT_RATE'];
             $basePrice *= 1 + $arMinPrice['VAT_RATE'];
             $minPrice = roundEx($minPrice, CATALOG_VALUE_PRECISION);
             $basePrice = roundEx($basePrice, CATALOG_VALUE_PRECISION);
         }
     }
     $arResult = array('PRICE' => $arMinPrice, 'RESULT_PRICE' => array('BASE_PRICE' => $basePrice, 'DISCOUNT_PRICE' => $minPrice, 'DISCOUNT' => $basePrice - $minPrice, 'PERCENT' => $basePrice > 0 ? 100 * ($basePrice - $minPrice) / $basePrice : 0, 'CURRENCY' => $resultCurrency, 'VAT_RATE' => $arMinPrice['VAT_RATE'], 'VAT_INCLUDED' => self::$optimalPriceWithVat ? 'Y' : 'N'), 'DISCOUNT_PRICE' => $minPrice, 'DISCOUNT' => array(), 'DISCOUNT_LIST' => array());
     if (!empty($arMinDiscounts)) {
         reset($arMinDiscounts);
         $arResult['DISCOUNT'] = current($arMinDiscounts);
         $arResult['DISCOUNT_LIST'] = $arMinDiscounts;
     }
     if ($eventOnResultExists === true || $eventOnResultExists === null) {
         foreach (GetModuleEvents('catalog', 'OnGetOptimalPriceResult', true) as $arEvent) {
             $eventOnResultExists = true;
             if (ExecuteModuleEventEx($arEvent, array(&$arResult)) === false) {
                 return false;
             }
         }
         if ($eventOnResultExists === null) {
             $eventOnResultExists = false;
         }
     }
     return $arResult;
 }
Esempio n. 12
0
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) {
    die;
}
if (isset($arParams["COMPONENT_ENABLE"]) && $arParams["COMPONENT_ENABLE"] === false) {
    return;
}
if (!CModule::IncludeModule("brsoft.wishlist")) {
    return;
}
//Обработка $arParams
$arParams["PARAM1"] = "iblock";
///TODO: for all modules
$arParams["PARAM2"] = intval($arParams["PARAM2"]) ?: false;
$arParams["PARAM3"] = intval($arParams["PARAM3"]);
if (!$arParams["PARAM2"]) {
    $arParams["PARAM2"] = CIBlockElement::GetIBlockByID($arParams["PARAM3"]);
    if (!$arParams["PARAM2"]) {
        return;
    }
}
if (empty($arParams["PARAM3"])) {
    return;
}
//не показывать компонент если не указаны к чему он подкреплен (ИД ИБ, ИД елемента ИБ)
//Выбор данных для $arResult
$arResult = array();
$arResult["WL_USER_ID"] = intval(CBrWishlist::GetWLUserID());
$arResult["USER_ID"] = CBrWishlistUser::GetBXUserID($arResult["WL_USER_ID"]);
if ($arResult["WL_USER_ID"] <= 0) {
    return;
}
Esempio n. 13
0
	protected static function clearPublicCache($productID, $productInfo = array())
	{
		$productID = (int)$productID;
		if ($productID <= 0)
			return;
		$iblockID = (int)(isset($productInfo['IBLOCK_ID']) ? $productInfo['IBLOCK_ID'] : CIBlockElement::GetIBlockByID($productID));
		if ($iblockID <= 0)
			return;
		if (defined('BX_COMP_MANAGED_CACHE') && !isset(self::$clearAutoCache[$iblockID]))
		{
			$taggedCache = \Bitrix\Main\Application::getInstance()->getTaggedCache();
			$taggedCache->clearByTag('iblock_id_'.$iblockID);
			self::$clearAutoCache[$iblockID] = true;
		}

		$productInfo['ID'] = $productID;
		$productInfo['ELEMENT_IBLOCK_ID'] = $iblockID;
		$productInfo['IBLOCK_ID'] = $iblockID;
		foreach (GetModuleEvents('catalog', 'OnProductQuantityTrace', true) as $arEvent)
			ExecuteModuleEventEx($arEvent, array($productID, $productInfo));
	}
Esempio n. 14
0
function getIBlockCodeByElement($elementId)
{
    $arIblock = \CIBlock::GetArrayByID(\CIBlockElement::GetIBlockByID($elementId));
    if (!empty($arIblock)) {
        return $arIblock['CODE'];
    }
    return false;
}
Esempio n. 15
0
 public function GetDiscountByProduct($productID = 0, $arUserGroups = array(), $renewal = "N", $arCatalogGroups = array(), $siteID = false, $arDiscountCoupons = false)
 {
     global $APPLICATION;
     foreach (GetModuleEvents("catalog", "OnGetDiscountByProduct", true) as $arEvent) {
         $mxResult = ExecuteModuleEventEx($arEvent, array($productID, $arUserGroups, $renewal, $arCatalogGroups, $siteID, $arDiscountCoupons));
         if (true !== $mxResult) {
             return $mxResult;
         }
     }
     $productID = (int) $productID;
     if ($productID <= 0) {
         $APPLICATION->ThrowException(Loc::getMessage('BT_MOD_CATALOG_DISC_ERR_ELEMENT_ID_NOT_FOUND', array('#ID' => $productID)), 'NO_ELEMENT');
         return false;
     }
     $intIBlockID = CIBlockElement::GetIBlockByID($productID);
     if ($intIBlockID === false) {
         $APPLICATION->ThrowException(Loc::getMessage('BT_MOD_CATALOG_DISC_ERR_ELEMENT_ID_NOT_FOUND', array('#ID#' => $productID)), 'NO_ELEMENT');
         return false;
     }
     return CCatalogDiscount::GetDiscount($productID, $intIBlockID, $arCatalogGroups, $arUserGroups, $renewal, $siteID, $arDiscountCoupons);
 }
Esempio n. 16
0
 /**
  * <p>Метод определяет имеются ли у товара торговые предложения.</p>
  *
  *
  *
  *
  * @param int $intProductID  ID товара.
  *
  *
  *
  * @param int $intIBlockID = 0 ID инфоблока товаров (может отсутствовать, в этом случае будет
  * лишний запрос к базе) .
  *
  *
  *
  * @return boolean <p>Метод возвращает <i>true</i> в случае наличия торговых предложений и
  * <i>false</i> в случае отсутствия или ошибки (некорректных
  * параметров).</p> <br><br>
  *
  * @static
  * @link http://dev.1c-bitrix.ru/api_help/catalog/classes/catalogsku/isexistoffers.php
  * @author Bitrix
  */
 public static function IsExistOffers($intProductID, $intIBlockID = 0)
 {
     $intProductID = (int) $intProductID;
     if ($intProductID == 0) {
         return false;
     }
     $intIBlockID = (int) $intIBlockID;
     if ($intIBlockID <= 0 && $intProductID > 0) {
         $intIBlockID = (int) CIBlockElement::GetIBlockByID($intProductID);
     }
     if ($intIBlockID <= 0) {
         return false;
     }
     if (!isset(self::$arProductCache[$intIBlockID])) {
         $arSkuInfo = CCatalogSKU::GetInfoByProductIBlock($intIBlockID);
     } else {
         $arSkuInfo = self::$arProductCache[$intIBlockID];
     }
     if (empty($arSkuInfo)) {
         return false;
     }
     $intCount = CIBlockElement::GetList(array(), array('IBLOCK_ID' => $arSkuInfo['IBLOCK_ID'], '=PROPERTY_' . $arSkuInfo['SKU_PROPERTY_ID'] => $intProductID), array());
     return $intCount > 0;
 }
Esempio n. 17
0
<?php

require $_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php";
if (!CModule::IncludeModule("iblock") || !$USER->IsAuthorized()) {
    exit;
}
global $USER;
$elId = intval($_REQUEST['id']);
$userId = $USER->GetID();
$iblockId = CIBlockElement::GetIBlockByID($elId);
if ($elId > 0) {
    $db_props = CIBlockElement::GetProperty($iblockId, $elId, array("id" => "asc"), array("CODE" => "LIKE"));
    $propLikeValue = array();
    while ($prop = $db_props->GetNext()) {
        $propLikeValue[] = $prop['VALUE'];
    }
    $key = array_search($userId, $propLikeValue);
    if ($key !== false) {
        unset($propLikeValue[$key]);
        echo 0;
    } else {
        $propLikeValue[] = $userId;
        echo 1;
    }
    if (count($propLikeValue) <= 0) {
        $propLikeValue = '';
    }
    CIBlockElement::SetPropertyValuesEx($elId, $iblockId, array('LIKE' => $propLikeValue));
}
Esempio n. 18
0
 public function OnBeforeIBlockElementDelete($ID)
 {
     global $APPLICATION;
     $ID = (int) $ID;
     if (0 < $ID) {
         $intIBlockID = (int) CIBlockElement::GetIBlockByID($ID);
         if (0 < $intIBlockID) {
             $arCatalog = CCatalogSKU::GetInfoByProductIBlock($intIBlockID);
             if (!empty($arCatalog) && is_array($arCatalog) && 0 < $arCatalog['IBLOCK_ID'] && 0 < $arCatalog['SKU_PROPERTY_ID']) {
                 $arFilter = array('IBLOCK_ID' => $arCatalog['IBLOCK_ID'], '=PROPERTY_' . $arCatalog['SKU_PROPERTY_ID'] => $ID);
                 $rsOffers = CIBlockElement::GetList(array(), $arFilter, false, false, array('ID', 'IBLOCK_ID'));
                 while ($arOffer = $rsOffers->Fetch()) {
                     foreach (GetModuleEvents("iblock", "OnBeforeIBlockElementDelete", true) as $arEvent) {
                         if (ExecuteModuleEventEx($arEvent, array($arOffer['ID'])) === false) {
                             $err = Loc::getMessage("BT_MOD_CATALOG_ERR_BEFORE_DEL_TITLE") . ' ' . $arEvent['TO_NAME'];
                             $err_id = false;
                             if ($ex = $APPLICATION->GetException()) {
                                 $err .= ': ' . $ex->GetString();
                                 $err_id = $ex->GetID();
                             }
                             $APPLICATION->ThrowException($err, $err_id);
                             return false;
                         }
                     }
                     if (!CIBlockElement::Delete($arOffer['ID'])) {
                         $APPLICATION->ThrowException(Loc::getMessage('BT_MOD_CATALOG_ERR_CANNOT_DELETE_OFFERS'));
                         return false;
                     }
                 }
             }
         }
     }
     return true;
 }
Esempio n. 19
0
 protected static function clearPublicCache($productID, $productInfo = array())
 {
     $productID = (int) $productID;
     if ($productID <= 0) {
         return;
     }
     $iblockID = (int) (isset($productInfo['IBLOCK_ID']) ? $productInfo['IBLOCK_ID'] : CIBlockElement::GetIBlockByID($productID));
     if ($iblockID <= 0) {
         return;
     }
     if (!isset(self::$clearAutoCache[$iblockID])) {
         CIBlock::clearIblockTagCache($iblockID);
         self::$clearAutoCache[$iblockID] = true;
     }
     $productInfo['ID'] = $productID;
     $productInfo['ELEMENT_IBLOCK_ID'] = $iblockID;
     $productInfo['IBLOCK_ID'] = $iblockID;
     if (isset($productInfo['CAN_BUY_ZERO'])) {
         $productInfo['NEGATIVE_AMOUNT_TRACE'] = $productInfo['CAN_BUY_ZERO'];
     }
     foreach (GetModuleEvents('catalog', 'OnProductQuantityTrace', true) as $arEvent) {
         ExecuteModuleEventEx($arEvent, array($productID, $productInfo));
     }
 }
<?php

if ($arResult["ITEMS"]) {
    foreach ($arResult["ITEMS"] as &$arItem) {
        if ($arItem["DELAY"] == "N" && $arItem["CAN_BUY"] == "Y") {
            $id = $arItem['PRODUCT_ID'];
            $arSelect = array("ID", "CATALOG_GROUP_1", "PROPERTY_ARTNUMBER");
            $arFilter = array("IBLOCK_ID" => CIBlockElement::GetIBlockByID($id), "ID" => $id, "ACTIVE" => "Y");
            $res = CIBlockElement::GetList(array(), $arFilter, false, array("nPageSize" => 50), $arSelect);
            if ($arFields = $res->GetNext()) {
                $arItem['CATALOG'] = $arFields;
                $arItem['ARTNUMBER'] = $arFields['PROPERTY_ARTNUMBER_VALUE'];
            }
        }
    }
}
Esempio n. 21
0
 /**
  * @param int $ELEMENT_ID
  * @param string|int $PROPERTY_CODE
  * @param mixed $PROPERTY_VALUE
  * @return bool
  */
 function SetPropertyValueCode($ELEMENT_ID, $PROPERTY_CODE, $PROPERTY_VALUE)
 {
     $IBLOCK_ID = CIBlockElement::GetIBlockByID($ELEMENT_ID);
     if (!$IBLOCK_ID) {
         return false;
     }
     CIBlockElement::SetPropertyValues($ELEMENT_ID, $IBLOCK_ID, $PROPERTY_VALUE, $PROPERTY_CODE);
     return true;
 }
Esempio n. 22
0
 protected static function clearPublicCache($productID, $productInfo = array())
 {
     global $CACHE_MANAGER;
     $productID = (int) $productID;
     if ($productID <= 0) {
         return;
     }
     $iblockID = (int) (isset($productInfo['IBLOCK_ID']) ? $productInfo['IBLOCK_ID'] : CIBlockElement::GetIBlockByID($productID));
     if ($iblockID <= 0) {
         return;
     }
     if (defined('BX_COMP_MANAGED_CACHE') && !isset(self::$clearAutoCache[$iblockID])) {
         $CACHE_MANAGER->ClearByTag('iblock_id_' . $iblockID);
         self::$clearAutoCache[$iblockID] = true;
     }
     $productInfo['ID'] = $productID;
     $productInfo['ELEMENT_IBLOCK_ID'] = $iblockID;
     $productInfo['IBLOCK_ID'] = $iblockID;
     foreach (GetModuleEvents('catalog', 'OnProductQuantityTrace', true) as $arEvent) {
         ExecuteModuleEventEx($arEvent, array($productID, $productInfo));
     }
 }
Esempio n. 23
0
$result = array("result" => false, "ERROR_CODE" => 0);
$element_id = intval($_REQUEST["element_id"]);
$vote_value = intval($_REQUEST["value"]);
if ($element_id > 0) {
    //unset($_SESSION["iblock.comments"][$element_id]);
    if (!isset($_SESSION["iblock.comments"][$element_id])) {
        $_SESSION["iblock.comments"][$element_id] = true;
        if (abs($vote_value) > 1) {
            if ($vote_value > 0) {
                $vote_value = 1;
            } else {
                $vote_value = -1;
            }
        }
        if (CModule::IncludeModule("iblock")) {
            $iblock_id = CIBlockElement::GetIBlockByID($element_id);
            if ($iblock_id !== FALSE) {
                $arOrder = array("ID" => "ASC");
                $arFilter = array("ID" => $element_id);
                $arSelect = array("ID", "PROPERTY_VOTE_PLUS", "PROPERTY_VOTE_MINUS");
                $dbElement = CIBlockElement::GetList($arOrder, $arFilter, $arSelect);
                if ($arElement = $dbElement->GetNext()) {
                    $property_code = $vote_value > 0 ? "VOTE_PLUS" : "VOTE_MINUS";
                    $arElement["PROPERTY_" . $property_code . "_VALUE"] += $vote_value;
                    $property_value = $arElement["PROPERTY_" . $property_code . "_VALUE"];
                    CIBlockElement::SetPropertyValues($element_id, $iblock_id, $property_value, $property_code);
                    $result["result"] = true;
                    $result["VOTE_PLUS"] = $arElement["PROPERTY_VOTE_PLUS_VALUE"];
                    $result["VOTE_MINUS"] = $arElement["PROPERTY_VOTE_MINUS_VALUE"];
                } else {
                    $result["ERROR_CODE"] = -4;
Esempio n. 24
0
 /**
  * Process Puy Product.
  *
  * @param int $productID
  * @param float $quantity
  * @param array $values
  * @param array $arRewriteFields
  * @throws void|Bitrix\Main\SystemException
  */
 protected function addProductToBasket($productID, $quantity, $values = array(), $arRewriteFields = array())
 {
     $productProperties = array();
     $productID = (int) $productID;
     $intProductIBlockID = (int) CIBlockElement::GetIBlockByID($productID);
     if ($intProductIBlockID > 0) {
         $productCatalogInfo = CCatalogSKU::getInfoByIblock($intProductIBlockID);
         $isOffer = CCatalogSKU::TYPE_OFFERS == $productCatalogInfo['CATALOG_TYPE'];
         if ($this->arParams['ADD_PROPERTIES_TO_BASKET'] == 'Y') {
             // Is not offer
             if (!$isOffer) {
                 // Props not empty
                 if (!empty($this->arParams['CART_PROPERTIES'][$intProductIBlockID])) {
                     $productProperties = CIBlockPriceTools::CheckProductProperties($intProductIBlockID, $productID, $this->arParams['CART_PROPERTIES'][$intProductIBlockID], $values, $this->arParams['PARTIAL_PRODUCT_PROPERTIES'] == 'Y');
                     if (!is_array($productProperties)) {
                         throw new SystemException(Loc::getMessage("CVP_PARTIAL_BASKET_PROPERTIES_ERROR"));
                     }
                 }
             } else {
                 if (!empty($this->arParams['CART_PROPERTIES'][$intProductIBlockID])) {
                     $productProperties = CIBlockPriceTools::GetOfferProperties($productID, $productCatalogInfo['PRODUCT_IBLOCK_ID'], $this->arParams['CART_PROPERTIES'][$intProductIBlockID]);
                 }
             }
         }
         if (0 >= $quantity) {
             $rsRatios = CCatalogMeasureRatio::getList(array(), array('PRODUCT_ID' => $productID), false, false, array('PRODUCT_ID', 'RATIO'));
             if ($arRatio = $rsRatios->Fetch()) {
                 $intRatio = (int) $arRatio['RATIO'];
                 $dblRatio = (double) $arRatio['RATIO'];
                 $quantity = $dblRatio > $intRatio ? $dblRatio : $intRatio;
             }
         }
         if (0 >= $quantity) {
             $quantity = 1;
         }
     } else {
         throw new SystemException(Loc::getMessage('CVP_CATALOG_PRODUCT_NOT_FOUND') . ".");
     }
     if (!Add2BasketByProductID($productID, $quantity, $arRewriteFields, $productProperties)) {
         throw new SystemException(Loc::getMessage("CVP_CATALOG_ERROR2BASKET") . ".");
     }
 }
Esempio n. 25
0
	if(isset($_REQUEST[$arParams["ACTION_VARIABLE"]."BUY"]))
		$action = "BUY";
	elseif(isset($_REQUEST[$arParams["ACTION_VARIABLE"]."ADD2BASKET"]))
		$action = "ADD2BASKET";
	else
		$action = strtoupper($_REQUEST[$arParams["ACTION_VARIABLE"]]);

	$productID = intval($_REQUEST[$arParams["PRODUCT_ID_VARIABLE"]]);
	if (($action == "ADD2BASKET" || $action == "BUY") && $productID > 0)
	{
		if (Loader::includeModule("sale") && Loader::includeModule("catalog"))
		{
			$addByAjax = isset($_REQUEST['ajax_basket']) && 'Y' == $_REQUEST['ajax_basket'];
			$QUANTITY = 0;
			$product_properties = array();
			$intProductIBlockID = intval(CIBlockElement::GetIBlockByID($productID));
			if (0 < $intProductIBlockID)
			{
				if ($arParams['ADD_PROPERTIES_TO_BASKET'] == 'Y')
				{
					if ($intProductIBlockID == $arParams["IBLOCK_ID"])
					{
						if (!empty($arParams["PRODUCT_PROPERTIES"]))
						{
							if (
								isset($_REQUEST[$arParams["PRODUCT_PROPS_VARIABLE"]])
								&& is_array($_REQUEST[$arParams["PRODUCT_PROPS_VARIABLE"]])
							)
							{
								$product_properties = CIBlockPriceTools::CheckProductProperties(
									$arParams["IBLOCK_ID"],
Esempio n. 26
0
                     break;
                 default:
                     $arEventFields["PARAMS"] .= $f["NAME"] . ": " . $_REQUEST[$f['CODE']] . "\n";
                     $arIBlockFields["PROPERTY_VALUES"][$f['CODE']] = prepareIBlockPropertyValue($_REQUEST[$f["CODE"]], $f);
                     break;
             }
             break;
         default:
             break;
     }
 }
 $el = new CIBlockElement();
 if (!($result = $el->Add($arIBlockFields))) {
     $arResult["ERROR_MESSAGE"][] = $el->LAST_ERROR;
 } else {
     if (($rsIBlock = CIBlockElement::GetIBlockByID($result)) !== FALSE) {
         $dbIBlock = CIBlock::GetByID($rsIBlock);
         if ($arIBlock = $dbIBlock->GetNext()) {
             $rsIBlockType = $arIBlock["IBLOCK_TYPE_ID"];
             $arEventFields["EDIT_LINK"] = "http://" . $_SERVER["HTTP_HOST"] . "/bitrix/admin/iblock_element_edit.php?IBLOCK_ID=" . $rsIBlock . "&type=" . $rsIBlockType . "&ID=" . $result . "&lang=ru&find_section_section=-1&WF=Y";
         }
     }
 }
 if (empty($arResult["ERROR_MESSAGE"])) {
     if ($arParams["SEND_EMAIL"] == "Y") {
         if (!empty($arParams["EVENT_MESSAGE_ID"])) {
             foreach ($arParams["EVENT_MESSAGE_ID"] as $v) {
                 if (IntVal($v) > 0) {
                     CEvent::Send($arParams["EVENT_NAME"], SITE_ID, $arEventFields, "N", IntVal($v));
                 }
             }
Esempio n. 27
0
$successfulAdd = true;
if (isset($_REQUEST[$arParams["ACTION_VARIABLE"]]) && isset($_REQUEST[$arParams["PRODUCT_ID_VARIABLE"]])) {
    if (isset($_REQUEST[$arParams["ACTION_VARIABLE"] . "BUY"])) {
        $action = "BUY";
    } elseif (isset($_REQUEST[$arParams["ACTION_VARIABLE"] . "ADD2BASKET"])) {
        $action = "ADD2BASKET";
    } else {
        $action = strtoupper($_REQUEST[$arParams["ACTION_VARIABLE"]]);
    }
    $productID = (int) $_REQUEST[$arParams["PRODUCT_ID_VARIABLE"]];
    if (($action == "ADD2BASKET" || $action == "BUY" || $action == "SUBSCRIBE_PRODUCT") && $productID > 0) {
        if (Loader::includeModule("sale") && Loader::includeModule("catalog")) {
            $addByAjax = isset($_REQUEST['ajax_basket']) && 'Y' == $_REQUEST['ajax_basket'];
            $QUANTITY = 0;
            $product_properties = array();
            $intProductIBlockID = (int) CIBlockElement::GetIBlockByID($productID);
            if (0 < $intProductIBlockID) {
                if ($arParams['ADD_PROPERTIES_TO_BASKET'] == 'Y') {
                    if ($intProductIBlockID == $arParams["IBLOCK_ID"]) {
                        if (!empty($arParams["PRODUCT_PROPERTIES"])) {
                            if (isset($_REQUEST[$arParams["PRODUCT_PROPS_VARIABLE"]]) && is_array($_REQUEST[$arParams["PRODUCT_PROPS_VARIABLE"]])) {
                                $product_properties = CIBlockPriceTools::CheckProductProperties($arParams["IBLOCK_ID"], $productID, $arParams["PRODUCT_PROPERTIES"], $_REQUEST[$arParams["PRODUCT_PROPS_VARIABLE"]], $arParams['PARTIAL_PRODUCT_PROPERTIES'] == 'Y');
                                if (!is_array($product_properties)) {
                                    $strError = GetMessage("CATALOG_PARTIAL_BASKET_PROPERTIES_ERROR");
                                    $successfulAdd = false;
                                }
                            } else {
                                $strError = GetMessage("CATALOG_EMPTY_BASKET_PROPERTIES_ERROR");
                                $successfulAdd = false;
                            }
                        }
Esempio n. 28
0
}
if ($_REQUEST['action'] && in_array($_REQUEST['action'], $arrayActions)) {
    if (intval($_REQUEST['id']) > 0) {
        $id = $_REQUEST['id'];
    }
    if (strlen($arParams["COMPARE_URL"]) <= 0) {
        $arParams["COMPARE_URL"] = "compare.php";
    }
    if (!$arParams["IBLOCK_ID"]) {
        $mxResult = CCatalogSku::GetProductInfo($_REQUEST['id']);
        if (is_array($mxResult)) {
            $parentid = $mxResult['ID'];
        } else {
            $parentid = $_REQUEST['id'];
        }
        $arParams["IBLOCK_ID"] = CIBlockElement::GetIBlockByID($parentid);
    }
    if (!isset($_SESSION[$arParams["NAME"]]) || !is_array($_SESSION[$arParams["NAME"]])) {
        $_SESSION[$arParams["NAME"]] = array();
    }
    if (!isset($_SESSION[$arParams["NAME"]][$arParams["IBLOCK_ID"]]) || !is_array($_SESSION[$arParams["NAME"]][$arParams["IBLOCK_ID"]])) {
        $_SESSION[$arParams["NAME"]][$arParams["IBLOCK_ID"]] = array();
    }
    if (!isset($_SESSION[$arParams["NAME"]][$arParams["IBLOCK_ID"]]["ITEMS"]) || !is_array($_SESSION[$arParams["NAME"]][$arParams["IBLOCK_ID"]]["ITEMS"])) {
        $_SESSION[$arParams["NAME"]][$arParams["IBLOCK_ID"]]["ITEMS"] = array();
    }
    $action = $_REQUEST['action'];
    if ($_REQUEST["action"] == "ADD_TO_COMPARE_LIST" && $id > 0) {
        if (!array_key_exists($id, $_SESSION[$arParams["NAME"]][$arParams["IBLOCK_ID"]]["ITEMS"])) {
            // die();
            //SELECT