16 $getExt = ($getExt ===
true);
17 $arSkuProps =
array();
25 $res = CIBlockElement::GetList(
30 array(
"ID",
"IBLOCK_ID")
32 $arElement =
$res->Fetch();
35 $arElement[
'ID'] = (int)$arElement[
'ID'];
36 $arParent = CCatalogSku::GetProductInfo(
$ID, $arElement[
"IBLOCK_ID"]);
39 $arElement[
'PROPERTIES'] =
array();
40 $arElementLink =
array(
41 $arElement[
'ID'] => &$arElement
43 $arFilter =
array(
'ID' => $arElement[
'ID'],
'IBLOCK_ID' => $arElement[
"IBLOCK_ID"]);
44 CIBlockElement::GetPropertyValuesArray($arElementLink, $arElement[
"IBLOCK_ID"],
$arFilter);
45 if (!empty($arElement[
'PROPERTIES']))
47 foreach ($arElement[
'PROPERTIES'] as &$prop)
49 if ($prop[
'XML_ID'] ==
'CML2_LINK' || $prop[
'PROPERTY_TYPE'] ==
'F')
53 $boolArr = is_array($prop[
"VALUE"]);
55 ($boolArr && !empty($prop[
"VALUE"]))
56 || (!$boolArr && $prop[
"VALUE"] <>
'')
59 $displayProperty = CIBlockFormatProperties::GetDisplayValue($arElement, $prop,
'');
61 if (
'E' == $prop[
'PROPERTY_TYPE'])
63 if (!empty($displayProperty[
'LINK_ELEMENT_VALUE']))
66 foreach ($displayProperty[
'LINK_ELEMENT_VALUE'] as $arTempo)
67 $mxValues[] = $arTempo[
'NAME'].
' ['.$arTempo[
'ID'].
']';
70 elseif (
'G' == $prop[
'PROPERTY_TYPE'])
72 if (!empty($displayProperty[
'LINK_SECTION_VALUE']))
75 foreach ($displayProperty[
'LINK_SECTION_VALUE'] as $arTempo)
76 $mxValues[] = $arTempo[
'NAME'].
' ['.$arTempo[
'ID'].
']';
81 $mxValues = $displayProperty[
"DISPLAY_VALUE"];
85 $arSkuProps[$prop[
"ID"]] =
array(
87 'CODE' => $prop[
'CODE'],
88 'NAME' => $prop[
"NAME"],
89 'VALUE' => strip_tags(is_array($mxValues) ? implode(
"/ ", $mxValues) : $mxValues)
94 $arSkuProps[$prop[
"NAME"]] = strip_tags(is_array($mxValues) ? implode(
"/ ", $mxValues) : $mxValues);
119 $USER_ID = (int)$USER_ID;
121 $PRODUCT_ID = (int)$PRODUCT_ID;
122 if ($PRODUCT_ID <= 0)
129 $PRODUCT_NAME = trim($PRODUCT_NAME);
133 static $arCacheGroups =
array();
135 if (!
is_set($arCacheGroups[$USER_ID]))
136 $arCacheGroups[$USER_ID] = CUser::GetUserGroup($USER_ID);
139 if (empty($arProduct))
142 static $arOffersIblock =
array();
143 if (!
is_set($arOffersIblock[$arProduct[
"IBLOCK_ID"]]))
145 $mxResult = CCatalogSKU::GetInfoByProductIBlock($arProduct[
"IBLOCK_ID"]);
146 if (is_array($mxResult))
147 $arOffersIblock[$arProduct[
"IBLOCK_ID"]] = $mxResult[
"IBLOCK_ID"];
150 if ($arOffersIblock[$arProduct[
"IBLOCK_ID"]] > 0)
153 static $arCacheOfferProperties =
array();
154 if (!
is_set($arCacheOfferProperties[$arOffersIblock[$arProduct[
"IBLOCK_ID"]]]))
156 $dbOfferProperties = CIBlock::GetProperties($arOffersIblock[$arProduct[
"IBLOCK_ID"]],
array(),
array(
"!XML_ID" =>
"CML2_LINK"));
157 while($arOfferProperties = $dbOfferProperties->Fetch())
158 $arCacheOfferProperties[$arOffersIblock[$arProduct[
"IBLOCK_ID"]]][] = $arOfferProperties;
160 $arOfferProperties = $arCacheOfferProperties[$arOffersIblock[$arProduct[
"IBLOCK_ID"]]];
163 $arIblockOfferProps =
array();
164 $arIblockOfferPropsFilter =
array();
165 if (is_array($arOfferProperties))
167 foreach ($arOfferProperties as
$val)
169 $arIblockOfferProps[] =
array(
"CODE" =>
$val[
"CODE"],
"NAME" =>
$val[
"NAME"]);
170 $arIblockOfferPropsFilter[] =
$val[
"CODE"];
175 $arProduct[
"IBLOCK_ID"],
177 array(
"ID" =>
"DESC"),
179 $arIblockOfferPropsFilter,
189 $minItemPriceFormat =
"";
194 $arSkuId[] = $arOffer[
'ID'];
196 if (!empty($arSkuId))
198 $res = CIBlockElement::GetList(
array(),
array(
"ID" => $arSkuId),
false,
false,
array(
"ID",
"IBLOCK_ID",
"NAME",
"PREVIEW_PICTURE",
"DETAIL_PICTURE",
"DETAIL_PAGE_URL"));
199 while($arOfferImg =
$res->GetNext())
200 $arImgSku[$arOfferImg[
"ID"]] = $arOfferImg;
213 if ($arPrice[
"DISCOUNT_PRICE"] > 0)
216 $arPrice[
"PRICE"][
"CURRENCY"] =
$CURRENCY;
220 $arOffer[
"CAN_BUY"] =
"N";
222 if (!empty($arCatalogProduct))
224 if ($arCatalogProduct[
"CAN_BUY_ZERO"]!=
"Y" && ($arCatalogProduct[
"QUANTITY_TRACE"]==
"Y" && doubleval($arCatalogProduct[
"QUANTITY"])<=0))
225 $arOffer[
"CAN_BUY"] =
"N";
227 $arOffer[
"CAN_BUY"] =
"Y";
230 $arSkuTmp[
"ImageUrl"] =
'';
231 if ($arOffer[
"CAN_BUY"] ==
"Y")
234 if (isset($arImgSku[$arOffer[
'ID']]) && !empty($arImgSku[$arOffer[
'ID']]))
236 if (
'' == $PRODUCT_NAME)
237 $PRODUCT_NAME = $arImgSku[$arOffer[
'ID']][
"~NAME"];
239 if($arImgSku[$arOffer[
'ID']][
"PREVIEW_PICTURE"] !=
"")
240 $productImg = $arImgSku[$arOffer[
'ID']][
"PREVIEW_PICTURE"];
241 elseif($arImgSku[$arOffer[
'ID']][
"DETAIL_PICTURE"] !=
"")
242 $productImg = $arImgSku[$arOffer[
'ID']][
"DETAIL_PICTURE"];
244 if ($productImg ==
"")
246 if($arProduct[
"PREVIEW_PICTURE"] !=
"")
247 $productImg = $arProduct[
"PREVIEW_PICTURE"];
248 elseif($arProduct[
"DETAIL_PICTURE"] !=
"")
249 $productImg = $arProduct[
"DETAIL_PICTURE"];
252 if ($productImg !=
"")
254 $arFile = CFile::GetFileArray($productImg);
256 $arSkuTmp[
"ImageUrl"] = $productImg[
"src"];
261 if (($minItemPrice === 0) || ($arPrice[
"DISCOUNT_PRICE"] < $minItemPrice))
263 $minItemPrice = $arPrice[
"DISCOUNT_PRICE"];
264 $minItemPriceFormat =
SaleFormatCurrency($arPrice[
"DISCOUNT_PRICE"], $arPrice[
"PRICE"][
"CURRENCY"]);
267 foreach($arIblockOfferProps as $arCode)
269 if (array_key_exists($arCode[
"CODE"], $arOffer[
"PROPERTIES"]))
271 if (is_array($arOffer[
"PROPERTIES"][$arCode[
"CODE"]][
"VALUE"]))
272 $arSkuTmp[] = implode(
"/", $arOffer[
"PROPERTIES"][$arCode[
"CODE"]][
"VALUE"]);
274 $arSkuTmp[] = $arOffer[
"PROPERTIES"][$arCode[
"CODE"]][
"VALUE"];
278 if (!empty($arCatalogProduct))
280 $arSkuTmp[
"BALANCE"] = $arCatalogProduct[
"QUANTITY"];
281 $arSkuTmp[
"WEIGHT"] = $arCatalogProduct[
"WEIGHT"];
282 $arSkuTmp[
"BARCODE_MULTI"] = $arCatalogProduct[
"BARCODE_MULTI"];
286 $arSkuTmp[
"BALANCE"] = 0;
287 $arSkuTmp[
"WEIGHT"] = 0;
288 $arSkuTmp[
"BARCODE_MULTI"] =
'N';
290 $urlEdit = CIBlock::GetAdminElementEditLink(
291 $arOffer[
"IBLOCK_ID"],
294 'find_section_section' => 0,
298 $discountPercent = 0;
299 $arSkuTmp[
"USER_ID"] = $USER_ID;
300 $arSkuTmp[
"ID"] = $arOffer[
"ID"];
301 $arSkuTmp[
"NAME"] = CUtil::JSEscape($arOffer[
"NAME"]);
302 $arSkuTmp[
"PRODUCT_NAME"] = CUtil::JSEscape($PRODUCT_NAME);
303 $arSkuTmp[
"PRODUCT_ID"] = $PRODUCT_ID;
304 $arSkuTmp[
"LID"] = CUtil::JSEscape($LID);
305 $arSkuTmp[
"MIN_PRICE"] = $minItemPriceFormat;
306 $arSkuTmp[
"URL_EDIT"] = $urlEdit;
307 $arSkuTmp[
"DISCOUNT_PRICE"] =
'';
308 $arSkuTmp[
"DISCOUNT_PRICE_FORMATED"] =
'';
309 $arSkuTmp[
"PRICE"] = $arPrice[
"PRICE"][
"PRICE"];
310 $arSkuTmp[
"PRICE_FORMATED"] = CCurrencyLang::CurrencyFormat($arPrice[
"PRICE"][
"PRICE"], $arPrice[
"PRICE"][
"CURRENCY"],
false);
313 $arSkuTmp[
"PRICE_TYPE"] = $arPriceType[
"NAME_LANG"];
314 $arSkuTmp[
"VAT_RATE"] = $arPrice[
"PRICE"][
"VAT_RATE"];
316 if (
count($arPrice[
"DISCOUNT"]) > 0)
318 $discountPercent = intval($arPrice[
"DISCOUNT"][
"VALUE"]);
320 $arSkuTmp[
"DISCOUNT_PRICE"] = $arPrice[
"DISCOUNT_PRICE"];
321 $arSkuTmp[
"DISCOUNT_PRICE_FORMATED"] = CCurrencyLang::CurrencyFormat($arPrice[
"DISCOUNT_PRICE"], $arPrice[
"PRICE"][
"CURRENCY"],
false);
324 $arCurFormat = CCurrencyLang::GetCurrencyFormat($arPrice[
"PRICE"][
"CURRENCY"]);
325 $arSkuTmp[
"VALUTA_FORMAT"] = str_replace(
"#",
'',
$arCurFormat[
"FORMAT_STRING"]);
326 $arSkuTmp[
"DISCOUNT_PERCENT"] = $discountPercent;
327 $arSkuTmp[
"CURRENCY"] = $arPrice[
"PRICE"][
"CURRENCY"];
328 $arSkuTmp[
"CAN_BUY"] = $arOffer[
"CAN_BUY"];
332 if ((!is_array($arIblockOfferProps) || empty($arIblockOfferProps)) && is_array(
$arSku) && !empty(
$arSku))
334 $arIblockOfferProps[0] =
array(
"CODE" =>
"TITLE",
"NAME" =>
GetMessage(
"SKU_TITLE"));
340 $arResult[
"SKU_PROPERTIES"] = $arIblockOfferProps;
341 $arResult[
"OFFERS_IBLOCK_ID"] = $arOffersIblock[$arProduct[
"IBLOCK_ID"]];
357 if (!CModule::IncludeModule(
'iblock'))
359 $arNewProductId =
array();
362 if (!is_array($arProductId))
363 $arProductId =
array($arProductId);
365 foreach ($arProductId as $productId)
367 $productId = (int)$productId;
371 if (!isset(self::$arProductIblockInfoCache[$productId]))
372 $arNewProductId[$productId] = $productId;
375 if (!empty($arNewProductId))
377 $dbProduct = CIBlockElement::GetList(
379 array(
"ID" => $arNewProductId),
382 array(
'ID',
'IBLOCK_ID',
'IBLOCK_SECTION_ID',
'PREVIEW_PICTURE',
'DETAIL_PICTURE')
384 while ($arProduct = $dbProduct->Fetch())
385 self::$arProductIblockInfoCache[$arProduct[
"ID"]] = $arProduct;
388 foreach ($arProductId as $productId)
390 if (isset(self::$arProductIblockInfoCache[$productId]))
391 $arResult[$productId] = self::$arProductIblockInfoCache[$productId];
418 $arRecomendetResult =
array();
420 if (CModule::IncludeModule(
'catalog') && !empty($arFilterRecomendet))
422 $arRecomendet =
array();
423 if (!is_array($arFilterRecomendet))
424 $arFilterRecomendet =
array($arFilterRecomendet);
426 if (empty($arFilterRecomendet))
427 return $arRecomendetResult;
429 $iblockRecommended =
array();
431 'select' =>
array(
'ID',
'IBLOCK_ID'),
432 'filter' =>
array(
'@ID' => $arFilterRecomendet,
'=ACTIVE' =>
'Y')
434 while ($product = $productIterator->fetch())
436 $product[
'ID'] = (int)$product[
'ID'];
437 $product[
'IBLOCK_ID'] = (int)$product[
'IBLOCK_ID'];
438 if (!isset($iblockRecommended[$product[
'IBLOCK_ID']]))
439 $iblockRecommended[$product[
'IBLOCK_ID']] =
array();
440 $iblockRecommended[$product[
'IBLOCK_ID']][] = $product[
'ID'];
442 unset($product, $productIterator);
443 if (empty($iblockRecommended))
444 return $arRecomendetResult;
446 $propertyList =
array();
448 'select' =>
array(
'ID',
'IBLOCK_ID'),
451 while ($property = $propertyIterator->fetch())
453 $property[
'ID'] = (int)$property[
'ID'];
454 $property[
'IBLOCK_ID'] = (int)$property[
'IBLOCK_ID'];
455 $propertyList[$property[
'IBLOCK_ID']] = $property[
'ID'];
457 unset($property, $propertyIterator);
458 if (empty($propertyList))
459 return $arRecomendetResult;
461 foreach ($propertyList as $iblockID => $propertyID)
464 $filter =
array(
'ID' => $iblockRecommended[$iblockID],
'IBLOCK_ID' => $iblockID);
468 while ($element = $elementIterator->Fetch())
476 $recId = (int)$recId;
478 $arRecomendet[$recId] =
true;
486 $arRecomendet[$recId] =
true;
492 if (!empty($arRecomendet))
494 $arRecomendet = array_keys($arRecomendet);
495 $arBuyerGroups = CUser::GetUserGroup($USER_ID);
498 $rsElement = CIBlockElement::GetList(
503 array(
"NAME",
"ID",
"LID",
'IBLOCK_ID',
'IBLOCK_SECTION_ID',
"DETAIL_PICTURE",
"PREVIEW_PICTURE",
"DETAIL_PAGE_URL")
510 'USE_DISCOUNTS' =>
true,
511 'RESULT_WITH_VAT' =>
true
515 while ($arElement = $rsElement->GetNext())
517 if (in_array($arElement[
"ID"], $arFilterRecomendet))
519 if (($recomMore ==
"N" &&
$i < $cntProductDefault) || $recomMore ==
"Y")
521 $arElement[
"MODULE"] =
"catalog";
522 $arElement[
"PRODUCT_PROVIDER_CLASS"] =
"CCatalogProductProvider";
523 $arElement[
"PRODUCT_ID"] = $arElement[
"ID"];
527 $currentPrice = $arPrice[
'RESULT_PRICE'][
'DISCOUNT_PRICE'];
528 $arElement[
"PRICE"] = $currentPrice;
529 $arElement[
"CURRENCY"] = $arPrice[
"RESULT_PRICE"][
"CURRENCY"];
530 $arElement[
"DISCOUNT_PRICE"] = $arPrice[
'RESULT_PRICE'][
'DISCOUNT'];
532 if ($arElement[
"IBLOCK_ID"] > 0 && $arElement[
"IBLOCK_SECTION_ID"] > 0)
534 $arElement[
"EDIT_PAGE_URL"] = CIBlock::GetAdminElementEditLink($arElement[
"IBLOCK_ID"], $arElement[
"PRODUCT_ID"],
array(
535 "find_section_section" => $arElement[
"IBLOCK_SECTION_ID"],
540 $arRecomendetResult[] = $arElement;
548 return $arRecomendetResult;