21 private $multiIblockMode =
false;
22 private $paginationMode =
false;
35 $this->multiIblockMode = (bool)$state;
47 return (
bool)$this->multiIblockMode;
59 $this->paginationMode = (bool)$state;
71 return (
bool)$this->paginationMode;
76 $params = parent::onPrepareComponentParams($params);
77 $this->makeMagicWithPageNavigation();
80 if (isset($params[
'ELEMENT_COUNT']))
82 $params[
'PAGE_ELEMENT_COUNT'] = $params[
'ELEMENT_COUNT'];
86 if (isset($params[
'PREDICT_ELEMENT_COUNT']) && $params[
'PREDICT_ELEMENT_COUNT'] ===
'Y' && !empty($params[
'PRODUCT_ROW_VARIANTS']))
88 $isBigData = $this->request->get(
'bigData') ===
'Y';
89 $params[
'PRODUCT_ROW_VARIANTS'] = static::parseJsonParameter($params[
'PRODUCT_ROW_VARIANTS']);
90 $params[
'PAGE_ELEMENT_COUNT'] = static::predictElementCountByVariants($params[
'PRODUCT_ROW_VARIANTS'], $isBigData);
93 $params[
'PAGE_ELEMENT_COUNT'] = (int)$params[
'PAGE_ELEMENT_COUNT'];
94 $params[
'ELEMENT_COUNT'] = (int)($params[
'ELEMENT_COUNT'] ?? 0);
95 $params[
'LINE_ELEMENT_COUNT'] = (int)($params[
'LINE_ELEMENT_COUNT'] ?? 3);
97 if (!isset($params[
'INCLUDE_SUBSECTIONS']) || !in_array($params[
'INCLUDE_SUBSECTIONS'], array(
'Y',
'A',
'N')))
99 $params[
'INCLUDE_SUBSECTIONS'] =
'Y';
103 !isset($params[
'HIDE_NOT_AVAILABLE'])
104 || ($params[
'HIDE_NOT_AVAILABLE'] !==
'Y' && $params[
'HIDE_NOT_AVAILABLE'] !==
'L')
107 $params[
'HIDE_NOT_AVAILABLE'] =
'N';
111 !isset($params[
'HIDE_NOT_AVAILABLE_OFFERS'])
112 || ($params[
'HIDE_NOT_AVAILABLE_OFFERS'] !==
'Y' && $params[
'HIDE_NOT_AVAILABLE_OFFERS'] !==
'L')
115 $params[
'HIDE_NOT_AVAILABLE_OFFERS'] =
'N';
119 if (isset($params[
'GLOBAL_FILTER']))
121 $this->globalFilter = $params[
'GLOBAL_FILTER'];
126 !empty($params[
'FILTER_NAME'])
127 && preg_match(self::PARAM_TITLE_MASK, $params[
'FILTER_NAME'])
128 && isset($GLOBALS[$params[
'FILTER_NAME']])
129 && is_array($GLOBALS[$params[
'FILTER_NAME']])
132 $this->globalFilter = $GLOBALS[$params[
'FILTER_NAME']];
135 if (isset($this->globalFilter[
'FACET_OPTIONS']) && count($this->globalFilter) == 1)
137 unset($this->globalFilter[
'FACET_OPTIONS']);
144 $productMappingFilter = [];
146 Loader::includeModule(
'catalog')
150 $productMappingFilter = Catalog\Product\SystemField\ProductMapping::getExtendedFilterByArea(
155 $params[
'CACHE_FILTER'] = isset($params[
'CACHE_FILTER']) && $params[
'CACHE_FILTER'] ===
'Y';
157 !$params[
'CACHE_FILTER']
158 && !empty($this->globalFilter)
159 && array_diff_assoc($this->globalFilter, $productMappingFilter)
162 $params[
'CACHE_TIME'] = 0;
167 [
'ORDER' =>
'ELEMENT_SORT_FIELD',
'DIRECTION' =>
'ELEMENT_SORT_ORDER'],
168 [
'ORDER' =>
'SORT',
'DIRECTION' =>
'asc']
173 [
'ORDER' =>
'ELEMENT_SORT_FIELD2',
'DIRECTION' =>
'ELEMENT_SORT_ORDER2'],
174 [
'ORDER' =>
'ID',
'DIRECTION' =>
'desc']
177 $params[
'PAGER_BASE_LINK_ENABLE'] = (string)($params[
'PAGER_BASE_LINK_ENABLE'] ??
'');
178 $params[
'PAGER_TITLE'] = (string)($params[
'PAGER_TITLE'] ??
'');
179 $params[
'PAGER_TEMPLATE'] = (string)($params[
'PAGER_TEMPLATE'] ??
'');
180 if (!empty($params[
'PAGER_PARAMS_NAME']) && preg_match(self::PARAM_TITLE_MASK, $params[
'PAGER_PARAMS_NAME']))
182 $this->pagerParameters = $GLOBALS[$params[
'PAGER_PARAMS_NAME']] ?? [];
184 if (!is_array($this->pagerParameters))
186 $this->pagerParameters = array();
190 if (Loader::includeModule(
'catalog') && isset($params[
'CUSTOM_FILTER']) && is_string($params[
'CUSTOM_FILTER']))
194 $params[
'CUSTOM_FILTER'] = $this->
parseCondition(Json::decode($params[
'CUSTOM_FILTER']), $params);
198 $params[
'CUSTOM_FILTER'] = array();
203 $params[
'CUSTOM_FILTER'] = array();
213 $params[
'CALCULATE_SKU_MIN_PRICE'] = (isset($params[
'CALCULATE_SKU_MIN_PRICE']) && $params[
'CALCULATE_SKU_MIN_PRICE'] ===
'Y');
226 $order = (isset($orderRow[
'ORDER']) ? trim($orderRow[
'ORDER']) :
'');
227 $direction = (isset($orderRow[
'DIRECTION']) ? trim($orderRow[
'DIRECTION']) :
'');
228 if (empty($params) || $order ===
'' || $direction ===
'')
232 if (empty($params[$order]))
234 $params[$order] = $default[
'ORDER'] ??
'SORT';
236 $params[$order] = strtoupper($params[$order]);
238 if ($params[$order] ===
'ID' && !empty($params[$direction]) && is_array($params[$direction]))
240 Collection::normalizeArrayValuesByInt($params[$direction],
false);
241 if (empty($params[$direction]))
243 $params[$direction] = $default[
'DIRECTION'] ??
'desc';
248 if (empty($params[$direction]) || !preg_match(self::SORT_ORDER_MASK, $params[$direction]))
250 $params[$direction] = $default[
'DIRECTION'] ??
'desc';
262 $result = ($product[
'PRODUCT_IBLOCK_ID'] == $this->arParams[
'IBLOCK_ID']);
270 $templateVariantsMap = static::getTemplateVariantsMap();
272 if (!empty($variants))
274 foreach ($variants as $variant)
276 foreach ($templateVariantsMap as $variantInfo)
278 if ((
int)$variantInfo[
'VARIANT'] === (
int)$variant[
'VARIANT'])
281 ($isBigData && $variant[
'BIG_DATA'])
282 || (!$isBigData && !$variant[
'BIG_DATA'])
285 $count += (int)$variantInfo[
'COUNT'];
297 private function makeMagicWithPageNavigation()
299 if ($this->request->isAjaxRequest())
301 foreach ($this->request->getPostList() as $name => $value)
303 if (preg_match(
'%^PAGEN_(\d+)$%', $name, $m))
306 $NavNum = (int)$m[1] - 1;
315 $params[
'DISPLAY_TOP_PAGER'] = isset($params[
'DISPLAY_TOP_PAGER']) && $params[
'DISPLAY_TOP_PAGER'] ===
'Y';
316 $params[
'DISPLAY_BOTTOM_PAGER'] = !isset($params[
'DISPLAY_BOTTOM_PAGER']) || $params[
'DISPLAY_BOTTOM_PAGER'] !==
'N';
317 $params[
'LAZY_LOAD'] = isset($params[
'LAZY_LOAD']) && $params[
'LAZY_LOAD'] ===
'Y' ?
'Y' :
'N';
319 if ($params[
'DISPLAY_TOP_PAGER'] || $params[
'DISPLAY_BOTTOM_PAGER'] || $params[
'LAZY_LOAD'] ===
'Y')
321 \CPageOption::SetOptionString(
'main',
'nav_page_in_session',
'N');
322 $params[
'PAGER_TITLE'] = isset($params[
'PAGER_TITLE']) ? trim($params[
'PAGER_TITLE']) :
'';
323 $params[
'PAGER_SHOW_ALWAYS'] = isset($params[
'PAGER_SHOW_ALWAYS']) && $params[
'PAGER_SHOW_ALWAYS'] ===
'Y';
324 $params[
'PAGER_TEMPLATE'] = isset($params[
'PAGER_TEMPLATE']) ? trim($params[
'PAGER_TEMPLATE']) :
'';
325 $params[
'PAGER_DESC_NUMBERING'] = isset($params[
'PAGER_DESC_NUMBERING']) && $params[
'PAGER_DESC_NUMBERING'] ===
'Y';
326 $params[
'PAGER_DESC_NUMBERING_CACHE_TIME'] = (int)$params[
'PAGER_DESC_NUMBERING_CACHE_TIME'];
327 $params[
'PAGER_SHOW_ALL'] = isset($params[
'PAGER_SHOW_ALL']) && $params[
'PAGER_SHOW_ALL'] ===
'Y';
328 $params[
'LOAD_ON_SCROLL'] = isset($params[
'LOAD_ON_SCROLL']) && $params[
'LOAD_ON_SCROLL'] ===
'Y' ?
'Y' :
'N';
329 $params[
'MESS_BTN_LAZY_LOAD'] = isset($params[
'MESS_BTN_LAZY_LOAD']) ? trim($params[
'MESS_BTN_LAZY_LOAD']) :
'';
334 $params[
'PAGER_SHOW_ALWAYS'] =
false;
335 $params[
'PAGER_SHOW_ALL'] =
false;
336 $params[
'LOAD_ON_SCROLL'] =
'N';
338 if ($params[
'LAZY_LOAD'] ===
'Y' && $params[
'LOAD_ON_SCROLL'] ===
'Y')
340 $params[
'DEFERRED_LOAD'] = isset($params[
'DEFERRED_LOAD']) && $params[
'DEFERRED_LOAD'] ===
'Y' ?
'Y' :
'N';
344 $params[
'DEFERRED_LOAD'] =
'N';
359 $this->storage[
'IBLOCK_PARAMS'] = $parameters;
370 $usePropertyFeatures = Iblock\Model\PropertyFeature::isEnabledFeatures();
372 $params[
'PROPERTY_CODE'] = array();
373 $params[
'CART_PROPERTIES'] = array();
374 $params[
'SHOW_PRODUCTS'] = $params[
'SHOW_PRODUCTS'] ?? array();
376 foreach ($params as $name => $prop)
379 if (preg_match(
'/^PROPERTY_CODE_(\d+)$/', $name, $match))
381 $iblockId = (int)$match[1];
385 if (!empty($params[$name]) && is_array($params[$name]))
387 foreach ($params[$name] as $k => $v)
391 unset($params[$name][$k]);
395 $params[
'PROPERTY_CODE'][$iblockId] = $params[$name];
397 unset($params[$match[0]]);
399 elseif (preg_match(
'/^CART_PROPERTIES_(\d+)$/', $name, $match))
401 $iblockId = (int)$match[1];
405 if (!empty($params[$name]) && is_array($params[$name]))
407 foreach ($params[$name] as $k => $v)
409 if ($v ==
'' || $v ===
'-')
411 unset($params[$name][$k]);
414 $params[
'CART_PROPERTIES'][$iblockId] = $params[$name];
416 unset($params[$match[0]]);
418 elseif (preg_match(
'/^OFFER_TREE_PROPS_(\d+)$/', $name, $match))
420 $iblockId = (int)$match[1];
424 if (!empty($params[$name]) && is_array($params[$name]))
426 foreach ($params[$name] as $k => $v)
428 if ($v ==
'' || $v ===
'-')
430 unset($params[$name][$k]);
434 $params[
'OFFER_TREE_PROPS'][$iblockId] = $params[$name];
436 unset($params[$match[0]]);
438 elseif (preg_match(
'/^SHOW_PRODUCTS_(\d+)$/', $name, $match))
440 $iblockId = (int)$match[1];
444 if ($params[$name] ===
'Y')
446 $params[
'SHOW_PRODUCTS'][$iblockId] =
true;
449 unset($params[$match[0]]);
454 $parameters = array();
456 if (!empty($params[
'SHOW_PRODUCTS']))
458 foreach (array_keys($params[
'SHOW_PRODUCTS']) as $iblockId)
460 $catalog = \CCatalogSku::GetInfoByProductIBlock($iblockId);
463 $parameters[$iblockId] = array(
464 'PROPERTY_CODE' => $params[
'PROPERTY_CODE'][$iblockId] ?? array(),
465 'CART_PROPERTIES' => (!$usePropertyFeatures && isset($params[
'CART_PROPERTIES'][$iblockId])
466 ? $params[
'CART_PROPERTIES'][$iblockId]
472 if (!empty($catalog))
474 $parameters[$iblockId][
'OFFERS_FIELD_CODE'] = array(
'ID',
'CODE',
'NAME',
'SORT',
'PREVIEW_PICTURE',
'DETAIL_PICTURE');
475 $parameters[$iblockId][
'OFFERS_PROPERTY_CODE'] = $params[
'PROPERTY_CODE'][$catalog[
'IBLOCK_ID']] ?? array();
476 $parameters[$iblockId][
'OFFERS_CART_PROPERTIES'] = (!$usePropertyFeatures && isset($params[
'CART_PROPERTIES'][$catalog[
'IBLOCK_ID']])
477 ? $params[
'CART_PROPERTIES'][$catalog[
'IBLOCK_ID']]
480 $parameters[$iblockId][
'OFFERS_TREE_PROPS'] = (!$usePropertyFeatures && isset($params[
'OFFER_TREE_PROPS'][$catalog[
'IBLOCK_ID']])
481 ? $params[
'OFFER_TREE_PROPS'][$catalog[
'IBLOCK_ID']]
499 $usePropertyFeatures = Iblock\Model\PropertyFeature::isEnabledFeatures();
501 if (!isset($params[
'PROPERTY_CODE']) || !is_array($params[
'PROPERTY_CODE']))
503 $params[
'PROPERTY_CODE'] = array();
506 foreach ($params[
'PROPERTY_CODE'] as $k => $v)
510 unset($params[
'PROPERTY_CODE'][$k]);
514 if (!isset($params[
'OFFERS_FIELD_CODE']))
516 $params[
'OFFERS_FIELD_CODE'] = array();
518 elseif (!is_array($params[
'OFFERS_FIELD_CODE']))
520 $params[
'OFFERS_FIELD_CODE'] = array($params[
'OFFERS_FIELD_CODE']);
523 foreach ($params[
'OFFERS_FIELD_CODE'] as $key => $value)
527 unset($params[
'OFFERS_FIELD_CODE'][$key]);
531 if (!isset($params[
'OFFERS_PROPERTY_CODE']))
533 $params[
'OFFERS_PROPERTY_CODE'] = array();
535 elseif (!is_array($params[
'OFFERS_PROPERTY_CODE']))
537 $params[
'OFFERS_PROPERTY_CODE'] = array($params[
'OFFERS_PROPERTY_CODE']);
540 foreach ($params[
'OFFERS_PROPERTY_CODE'] as $key => $value)
544 unset($params[
'OFFERS_PROPERTY_CODE'][$key]);
548 $cartProperties = [];
549 $offersCartProperties = [];
550 $offersTreeProperties = [];
551 if (!$usePropertyFeatures)
553 if (!isset($params[
'PRODUCT_PROPERTIES']) || !is_array($params[
'PRODUCT_PROPERTIES']))
555 $params[
'PRODUCT_PROPERTIES'] = array();
558 foreach ($params[
'PRODUCT_PROPERTIES'] as $k => $v)
562 unset($params[
'PRODUCT_PROPERTIES'][$k]);
565 $cartProperties = $params[
'PRODUCT_PROPERTIES'];
567 if (!isset($params[
'OFFERS_CART_PROPERTIES']) || !is_array($params[
'OFFERS_CART_PROPERTIES']))
569 $params[
'OFFERS_CART_PROPERTIES'] = array();
572 foreach ($params[
'OFFERS_CART_PROPERTIES'] as $i => $pid)
576 unset($params[
'OFFERS_CART_PROPERTIES'][$i]);
579 $offersCartProperties = $params[
'OFFERS_CART_PROPERTIES'];
581 if (!isset($params[
'OFFER_TREE_PROPS']))
583 $params[
'OFFER_TREE_PROPS'] = array();
585 elseif (!is_array($params[
'OFFER_TREE_PROPS']))
587 $params[
'OFFER_TREE_PROPS'] = array($params[
'OFFER_TREE_PROPS']);
590 foreach ($params[
'OFFER_TREE_PROPS'] as $key => $value)
592 $value = (string)$value;
593 if ($value ==
'' || $value ===
'-')
595 unset($params[
'OFFER_TREE_PROPS'][$key]);
599 if (empty($params[
'OFFER_TREE_PROPS']) && !empty($params[
'OFFERS_CART_PROPERTIES']))
601 $params[
'OFFER_TREE_PROPS'] = $params[
'OFFERS_CART_PROPERTIES'];
602 foreach ($params[
'OFFER_TREE_PROPS'] as $key => $value)
606 unset($params[
'OFFER_TREE_PROPS'][$key]);
610 $offersTreeProperties = $params[
'OFFER_TREE_PROPS'];
614 $params[
'IBLOCK_ID'] => array(
615 'PROPERTY_CODE' => $params[
'PROPERTY_CODE'],
616 'CART_PROPERTIES' => $cartProperties,
617 'OFFERS_FIELD_CODE' => $params[
'OFFERS_FIELD_CODE'],
618 'OFFERS_PROPERTY_CODE' => $params[
'OFFERS_PROPERTY_CODE'],
619 'OFFERS_CART_PROPERTIES' => $offersCartProperties,
620 'OFFERS_TREE_PROPS' => $offersTreeProperties
635 return parent::getProductIds();
644 isset($this->arParams[
'LAZY_LOAD'])
645 && $this->arParams[
'LAZY_LOAD'] ===
'Y'
646 && isset($this->arParams[
'LOAD_ON_SCROLL'])
647 && $this->arParams[
'LOAD_ON_SCROLL'] ===
'Y'
648 && isset($this->arParams[
'DEFERRED_LOAD'])
649 && $this->arParams[
'DEFERRED_LOAD'] ===
'Y'
656 $addParam = \CAjax::GetSessionParam($this->arParams[
'AJAX_ID']);
658 $regexpLinks =
'/(<a\s[^>]*?>.*?<\/a>)/is'.BX_UTF_PCRE_MODIFIER;
659 $regexpParams =
'/([\w\-]+)\s*=\s*([\"\'])(.*?)\2/is'.BX_UTF_PCRE_MODIFIER;
661 $this->checkPcreLimit($data);
662 $arData = preg_split($regexpLinks, $data, -1, PREG_SPLIT_DELIM_CAPTURE);
664 $dataCount = count($arData);
668 $ignoreAttributes = array(
678 $dataChanged =
false;
680 for ($i = 1; $i < $dataCount; $i += 2)
682 if (!preg_match(
'/^<a\s([^>]*?)>(.*?)<\/a>$/is'.BX_UTF_PCRE_MODIFIER, $arData[$i], $match))
687 if (!preg_match_all($regexpParams, $params, $linkParams))
690 $strAdditional =
' ';
694 foreach ($linkParams[0] as $key => $value)
699 $paramName = mb_strtolower($linkParams[1][$key]);
701 if ($paramName ===
'href')
705 elseif (isset($ignoreAttributes[$paramName]))
712 $strAdditional .= $value.
' ';
716 if ($urlKey >= 0 && !$ignoreLink)
718 $url = Text\Converter::getHtmlConverter()->decode($linkParams[3][$urlKey]);
719 $url = str_replace($search,
'', $url);
721 if ($this->isAjaxURL($url))
725 $pos = mb_strpos($url,
'#');
728 $realUrl = mb_substr($realUrl, 0, $pos);
731 $realUrl .= mb_strpos($url,
'?') ===
false ?
'?' :
'&';
732 $realUrl .= $addParam;
734 $arData[$i] = \CAjax::GetLinkEx($realUrl, $url, $match[2],
'comp_'.$this->arParams[
'AJAX_ID'], $strAdditional);
743 $data = implode(
'', $arData);
747 private function checkPcreLimit($data)
749 $pcreBacktrackLimit = (int)ini_get(
'pcre.backtrack_limit');
750 $textLen = function_exists(
'mb_strlen')? mb_strlen($data,
'latin1') : mb_strlen($data);
753 if ($pcreBacktrackLimit > 0 && $pcreBacktrackLimit < $textLen)
755 @ini_set(
'pcre.backtrack_limit', $textLen);
756 $pcreBacktrackLimit = intval(ini_get(
'pcre.backtrack_limit'));
759 return $pcreBacktrackLimit >= $textLen;
762 private function isAjaxURL($url)
764 if (preg_match(
'/^(#|mailto:|javascript:|callto:)/', $url))
767 if (mb_strpos($url,
'://') !==
false)
770 $url = preg_replace(
'/#.*/',
'', $url);
772 if (mb_strpos($url,
'?') !==
false)
774 $url = mb_substr($url, 0, mb_strpos($url,
'?'));
777 if (mb_substr($url, -4) !=
'.php')
779 if (mb_substr($url, -1) !=
'/')
787 $currentUrl = $this->arParams[
'CURRENT_BASE_PAGE'];
789 if (mb_strpos($currentUrl,
'?') !==
false)
791 $currentUrl = mb_substr($currentUrl, 0, mb_strpos($currentUrl,
'?'));
794 if (mb_substr($currentUrl, -4) !=
'.php')
796 if (mb_substr($currentUrl, -1) !=
'/')
801 $currentUrl .=
'index.php';
804 $currentUrlDirName = dirname($currentUrl);
805 $currentUrlBaseName = basename($currentUrl);
806 $dirName = dirname($url);
809 ($dirName == $currentUrlDirName || $dirName ==
'' || $dirName ==
'.')
810 && basename($url) == $currentUrlBaseName
821 parent::initQueryFields();
827 $this->storage[
'SUB_FILTER'] = array();
835 $catalogFilter = array();
836 foreach ($this->globalFilter as $key => $value)
838 if (\CProductQueryBuilder::isCatalogFilterField($key))
841 if ($key ===
'=PRODUCT_UF_PRODUCT_MAPPING')
845 $catalogFilter[$key] = $value;
846 unset($this->globalFilter[$key]);
850 $iblock = $this->storage[
'CATALOGS'][$this->arParams[
'IBLOCK_ID']];
851 $offersFilterExists = !empty($this->globalFilter[
'OFFERS']) && is_array($this->globalFilter[
'OFFERS']);
853 if ($offersFilterExists)
855 $this->storage[
'SUB_FILTER'] = array_merge($this->globalFilter[
'OFFERS'], $catalogFilter);
856 $this->storage[
'SUB_FILTER'][
'IBLOCK_ID'] = $iblock[
'IBLOCK_ID'];
857 $this->storage[
'SUB_FILTER'][
'ACTIVE_DATE'] =
'Y';
858 $this->storage[
'SUB_FILTER'][
'ACTIVE'] =
'Y';
860 if ($this->arParams[
'HIDE_NOT_AVAILABLE'] ===
'Y')
862 $this->storage[
'SUB_FILTER'][
'AVAILABLE'] =
'Y';
865 $this->filterFields[
'=ID'] = \CIBlockElement::SubQuery(
866 'PROPERTY_'.$iblock[
'SKU_PROPERTY_ID'],
867 $this->storage[
'SUB_FILTER']
870 elseif (!empty($catalogFilter))
872 $this->storage[
'SUB_FILTER'] = $catalogFilter;
873 $this->storage[
'SUB_FILTER'][
'IBLOCK_ID'] = $iblock[
'IBLOCK_ID'];
874 $this->storage[
'SUB_FILTER'][
'ACTIVE_DATE'] =
'Y';
875 $this->storage[
'SUB_FILTER'][
'ACTIVE'] =
'Y';
877 $this->filterFields[] = array(
879 array($catalogFilter),
880 '=ID' => \CIBlockElement::SubQuery(
881 'PROPERTY_'.$iblock[
'SKU_PROPERTY_ID'],
882 $this->storage[
'SUB_FILTER']
891 $iblockElements = array();
893 if (!empty($elementIterator))
895 while ($element = $elementIterator->GetNext())
898 $iblockElements[$element[
'ID']] = $element;
902 return $iblockElements;
907 if (!empty($iblockElements))
909 $iblockParams = $this->storage[
'IBLOCK_PARAMS'][$iblock];
910 $propertyCodes = $iblockParams[
'PROPERTY_CODE'];
911 $productProperties = $iblockParams[
'CART_PROPERTIES'];
912 $getPropertyCodes = !empty($propertyCodes);
913 $getProductProperties = $this->arParams[
'ADD_PROPERTIES_TO_BASKET'] ===
'Y' && !empty($productProperties);
914 $getIblockProperties = $getPropertyCodes || $getProductProperties;
916 if ($getIblockProperties || ($this->useCatalog && $this->useDiscountCache))
919 'ID' => array_keys($iblockElements),
920 'IBLOCK_ID' => $iblock
922 \CIBlockElement::GetPropertyValuesArray($iblockElements, $iblock, $propFilter);
924 if ($getPropertyCodes)
929 foreach ($iblockElements as &$element)
931 if ($this->useCatalog && $this->useDiscountCache)
933 if ($this->storage[
'USE_SALE_DISCOUNTS'])
934 Catalog\Discount\DiscountManager::setProductPropertiesCache($element[
'ID'], $element[
"PROPERTIES"]);
936 \CCatalogDiscount::SetProductPropertiesCache($element[
'ID'], $element[
'PROPERTIES']);
939 if ($getIblockProperties)
941 if (!empty($propertyList))
943 foreach ($propertyList as $pid)
945 if (!isset($element[
'PROPERTIES'][$pid]))
948 $prop =& $element[
'PROPERTIES'][$pid];
949 $isArr = is_array($prop[
'VALUE']);
951 ($isArr && !empty($prop[
'VALUE']))
952 || (!$isArr && (
string)$prop[
'VALUE'] !==
'')
956 $element[
'DISPLAY_PROPERTIES'][$pid] = \CIBlockFormatProperties::GetDisplayValue($element, $prop,
'catalog_out');
963 if ($getProductProperties)
965 $element[
'PRODUCT_PROPERTIES'] = \CIBlockPriceTools::GetProductProperties(
969 $element[
'PROPERTIES']
972 if (!empty($element[
'PRODUCT_PROPERTIES']))
974 $element[
'PRODUCT_PROPERTIES_FILL'] = \CIBlockPriceTools::getFillProductProperties($element[
'PRODUCT_PROPERTIES']);
989 if ($this->arParams[
'HIDE_NOT_AVAILABLE'] ===
'Y')
994 if (!empty($this->arParams[
'CUSTOM_FILTER']))
999 if (!empty($this->arParams[
'FILTER_IDS']))
1014 $this->isIblockCatalog
1020 && $this->arParams[
'HIDE_NOT_AVAILABLE'] ===
'L'
1026 $field = strtoupper($this->arParams[
'ELEMENT_SORT_FIELD']);
1029 $sortFields[$field] = $this->arParams[
'ELEMENT_SORT_ORDER'];
1032 $field = strtoupper($this->arParams[
'ELEMENT_SORT_FIELD2']);
1035 $sortFields[$field] = $this->arParams[
'ELEMENT_SORT_ORDER2'];
1051 if (!empty($this->arParams[
'CUSTOM_ELEMENT_SORT']) && is_array($this->arParams[
'CUSTOM_ELEMENT_SORT']))
1053 foreach ($this->arParams[
'CUSTOM_ELEMENT_SORT'] as $field => $value)
1055 $field = strtoupper($field);
1056 if (isset($result[$field]))
1060 if ($field ===
'ID' && !empty($value) && is_array($value))
1062 Collection::normalizeArrayValuesByInt($value,
false);
1070 if (!is_string($value))
1074 if (!preg_match(self::SORT_ORDER_MASK, $value))
1080 $result[$field] = $value;
1082 unset($field, $value);
1091 if (is_array($this->navParams) && isset($this->navParams[
'nTopCount']) && $this->navParams[
'nTopCount'] == 0)
1096 $elementIterator = parent::getElementList($iblockId, $products);
1103 return $elementIterator;
1108 $navComponentParameters = array();
1110 if ($this->arParams[
'PAGER_BASE_LINK_ENABLE'] ===
'Y')
1112 $pagerBaseLink = trim($this->arParams[
'PAGER_BASE_LINK']) ?: $this->arResult[
'SECTION_PAGE_URL'];
1114 if ($this->pagerParameters && isset($this->pagerParameters[
'BASE_LINK']))
1116 $pagerBaseLink = $this->pagerParameters[
'BASE_LINK'];
1117 unset($this->pagerParameters[
'BASE_LINK']);
1120 $navComponentParameters[
'BASE_LINK'] = \CHTTP::urlAddParams($pagerBaseLink, $this->pagerParameters, array(
'encode' =>
true));
1124 $uri =
new Main\Web\Uri($this->arParams[
'CURRENT_BASE_PAGE']);
1125 $uri->deleteParams(array(
1126 'PAGEN_'.$elementIterator->NavNum,
1127 'SIZEN_'.$elementIterator->NavNum,
1128 'SHOWALL_'.$elementIterator->NavNum,
1131 'bitrix_include_areas'
1133 $navComponentParameters[
'BASE_LINK'] = $uri->getUri();
1136 $this->arResult[
'NAV_STRING'] = $elementIterator->GetPageNavStringEx(
1137 $navComponentObject,
1138 $this->arParams[
'PAGER_TITLE'],
1139 $this->arParams[
'PAGER_TEMPLATE'],
1140 $this->arParams[
'PAGER_SHOW_ALWAYS'],
1142 $navComponentParameters
1144 $this->arResult[
'NAV_CACHED_DATA'] =
null;
1145 $this->arResult[
'NAV_RESULT'] = $elementIterator;
1146 $this->arResult[
'NAV_PARAM'] = $navComponentParameters;
1151 if (empty($offers) || empty($this->storage[
'CATALOGS'][$iblockId]))
1153 $uniqueSortHash = array();
1154 $filteredOffers = array();
1155 $filteredElements = array();
1160 $catalog = $this->storage[
'CATALOGS'][$iblockId];
1161 $this->storage[
'SUB_FILTER'][
'=PROPERTY_'.$catalog[
'SKU_PROPERTY_ID']] = array_keys($this->elementLinks);
1162 $filteredOffers = Iblock\Component\Filters::getFilteredOffersByProduct(
1163 $catalog[
'IBLOCK_ID'],
1164 $catalog[
'SKU_PROPERTY_ID'],
1165 $this->storage[
'SUB_FILTER']
1170 foreach ($offers as &$offer)
1172 $elementId = $offer[
'LINK_ELEMENT_ID'];
1174 if (!isset($this->elementLinks[$elementId]))
1177 if (!isset($uniqueSortHash[$elementId]))
1179 $uniqueSortHash[$elementId] = array();
1182 $uniqueSortHash[$elementId][$offer[
'SORT_HASH']] =
true;
1184 if ($this->elementLinks[$elementId][
'OFFER_ID_SELECTED'] == 0 && $offer[
'CAN_BUY'])
1186 if (isset($filteredOffers[$elementId]))
1188 if (isset($filteredOffers[$elementId][$offer[
'ID']]))
1190 $this->elementLinks[$elementId][
'OFFER_ID_SELECTED'] = $offer[
'ID'];
1191 $filteredElements[$elementId] =
true;
1194 elseif (isset($filteredByProperty[$elementId]))
1196 if (isset($filteredByProperty[$elementId][$offer[
'ID']]))
1198 $this->elementLinks[$elementId][
'OFFER_ID_SELECTED'] = $offer[
'ID'];
1199 $filteredElements[$elementId] =
true;
1204 $this->elementLinks[$elementId][
'OFFER_ID_SELECTED'] = $offer[
'ID'];
1210 if (!empty($filteredOffers))
1212 $this->arResult[
'FILTERED_OFFERS_ID'] = array();
1215 foreach ($this->elementLinks as &$element)
1217 if (isset($filteredOffers[$element[
'ID']]))
1219 $this->arResult[
'FILTERED_OFFERS_ID'][$element[
'ID']] = $filteredOffers[$element[
'ID']];
1222 if ($element[
'OFFER_ID_SELECTED'] == 0 || isset($filteredElements[$element[
'ID']]))
1225 if (count($uniqueSortHash[$element[
'ID']]) < 2)
1227 $element[
'OFFER_ID_SELECTED'] = 0;
1235 if (empty($this->storage[
'CATALOGS'][$iblockId]))
1241 if (!empty($filter))
1243 $catalog = $this->storage[
'CATALOGS'][$iblockId];
1244 $offers = Iblock\Component\Filters::getFilteredOffersByProduct(
1245 $catalog[
'IBLOCK_ID'],
1246 $catalog[
'SKU_PROPERTY_ID'],
1248 '=PROPERTY_'.$catalog[
'SKU_PROPERTY_ID'] => array_keys($this->elementLinks),
1265 foreach ($level as $prop)
1267 if (is_array($prop))
1271 elseif ($prop instanceOf \CIBlockElement)
1273 $checkLogic =
false;
1274 $filter = $prop->arFilter;
1278 if ($checkLogic && is_array($filter) && count($filter) > 1)
1280 $filter[
'LOGIC'] = $level[
'LOGIC'];
1290 $this->globalFilter,
1291 $this->productIdMap,
1294 $this->pagerParameters
1300 return '/'.$this->getSiteId().$this->getRelativePath();
1305 parent::makeOutputResult();
1306 $this->arResult[
'PRICES'] = $this->storage[
'PRICES'];
1308 $this->arResult[
'ELEMENTS'] = array_keys($this->elementLinks);
1320 parent::deferredLoadAction();
1325 $this->arParams[
'~PRODUCT_ROW_VARIANTS'] = $this->arParams[
'~DEFERRED_PRODUCT_ROW_VARIANTS'];
1326 $this->arParams[
'PRODUCT_ROW_VARIANTS'] = static::parseJsonParameter($this->arParams[
'~PRODUCT_ROW_VARIANTS']);
1328 if (isset($this->arParams[
'PREDICT_ELEMENT_COUNT']) && $this->arParams[
'PREDICT_ELEMENT_COUNT'] ===
'Y')
1330 $this->arParams[
'PAGE_ELEMENT_COUNT'] = static::predictElementCountByVariants($this->arParams[
'PRODUCT_ROW_VARIANTS']);
1334 $this->arParams[
'PAGE_ELEMENT_COUNT'] = $this->arParams[
'DEFERRED_PAGE_ELEMENT_COUNT'];
1337 $this->arParams[
'PAGE_ELEMENT_COUNT'] = (int)$this->arParams[
'PAGE_ELEMENT_COUNT'];
1348 $this->arParams[
'PAGE_ELEMENT_COUNT'] > 0
1350 $this->arParams[
'DISPLAY_TOP_PAGER']
1351 || $this->arParams[
'DISPLAY_BOTTOM_PAGER']
1352 || $this->arParams[
'LAZY_LOAD'] ===
'Y'
1356 $this->navParams = array(
1357 'nPageSize' => $this->arParams[
'PAGE_ELEMENT_COUNT'],
1358 'bDescPageNumbering' => $this->arParams[
'PAGER_DESC_NUMBERING'],
1359 'bShowAll' => $this->arParams[
'PAGER_SHOW_ALL']
1361 $this->navigation = \CDBResult::GetNavParams($this->navParams);
1363 if ($this->navigation[
'PAGEN'] == 0 && $this->arParams[
'PAGER_DESC_NUMBERING_CACHE_TIME'] > 0)
1365 $this->arParams[
'CACHE_TIME'] = $this->arParams[
'PAGER_DESC_NUMBERING_CACHE_TIME'];
1370 $this->navParams = array(
1371 'nTopCount' => $this->arParams[
'PAGE_ELEMENT_COUNT'],
1372 'bDescPageNumbering' => $this->arParams[
'PAGER_DESC_NUMBERING'],
1374 $this->navigation =
false;
1379 $this->navParams = array(
'nTopCount' => $this->arParams[
'PAGE_ELEMENT_COUNT']);
1380 $this->navigation =
false;
1386 parent::prepareTemplateParams();
1387 $params =& $this->arParams;
1389 if ($params[
'LINE_ELEMENT_COUNT'] < 2)
1391 $params[
'LINE_ELEMENT_COUNT'] = 2;
1394 if ($params[
'LINE_ELEMENT_COUNT'] > 5)
1396 $params[
'LINE_ELEMENT_COUNT'] = 5;
1399 if ($params[
'ADD_TO_BASKET_ACTION'] !=
'BUY')
1401 $params[
'ADD_TO_BASKET_ACTION'] =
'ADD';
1405 (empty($params[
'PRODUCT_ROW_VARIANTS']) || !is_array($params[
'PRODUCT_ROW_VARIANTS']))
1406 && isset($params[
'~PRODUCT_ROW_VARIANTS'])
1409 $params[
'PRODUCT_ROW_VARIANTS'] = static::parseJsonParameter($params[
'~PRODUCT_ROW_VARIANTS']);
1412 if (empty($params[
'PRODUCT_ROW_VARIANTS']))
1414 $params[
'PRODUCT_ROW_VARIANTS'] = static::predictRowVariants($params[
'LINE_ELEMENT_COUNT'], $params[
'PAGE_ELEMENT_COUNT']);
1417 if (empty($params[
'PRODUCT_BLOCKS_ORDER']))
1419 $params[
'PRODUCT_BLOCKS_ORDER'] =
'price,props,sku,quantityLimit,quantity,buttons';
1422 if (is_string($params[
'PRODUCT_BLOCKS_ORDER']))
1424 $params[
'PRODUCT_BLOCKS_ORDER'] = explode(
',', $params[
'PRODUCT_BLOCKS_ORDER']);
1427 $params[
'PRODUCT_DISPLAY_MODE'] = isset($params[
'PRODUCT_DISPLAY_MODE']) && $params[
'PRODUCT_DISPLAY_MODE'] ===
'Y' ?
'Y' :
'N';
1443 if (!empty($jsonString) && is_string($jsonString))
1447 $parameter = Json::decode(str_replace(
"'",
'"', $jsonString));
1462 $params[
'ADDITIONAL_PICT_PROP'] = array();
1463 $params[
'LABEL_PROP'] = array();
1464 $params[
'LABEL_PROP_MOBILE'] = array();
1465 $params[
'PROPERTY_CODE_MOBILE'] = array();
1466 $params[
'ENLARGE_PROP'] = array();
1467 $params[
'OFFER_TREE_PROPS'] = array();
1469 foreach ($params as $name => $prop)
1471 if (preg_match(
'/^ADDITIONAL_PICT_PROP_(\d+)$/', $name, $match))
1473 $iblockId = (int)$match[1];
1477 if ($params[$name] !=
'' && $params[$name] !=
'-')
1479 $params[
'ADDITIONAL_PICT_PROP'][$iblockId] = $params[$name];
1481 unset($params[$match[0]]);
1483 elseif (preg_match(
'/^LABEL_PROP_(\d+)$/', $name, $match))
1485 $iblockId = (int)$match[1];
1489 if (!empty($params[$name]))
1491 if (!is_array($params[$name]))
1493 $params[$name] = array($params[$name]);
1496 foreach ($params[$name] as $k => $v)
1500 unset($params[$name][$k]);
1504 $params[
'LABEL_PROP'][$iblockId] = $params[$name];
1507 elseif (preg_match(
'/^LABEL_PROP_MOBILE_(\d+)$/', $name, $match))
1509 $iblockId = (int)$match[1];
1513 if (!empty($params[$name]) && is_array($params[$name]))
1515 foreach ($params[$name] as $k => $v)
1519 unset($params[$name][$k]);
1523 if (!empty($params[$name]))
1525 $params[$name] = array_flip($params[$name]);
1528 $params[
'LABEL_PROP_MOBILE'][$iblockId] = $params[$name];
1530 unset($params[$match[0]]);
1532 elseif (preg_match(
'/^PROPERTY_CODE_MOBILE_(\d+)$/', $name, $match))
1534 $iblockId = (int)$match[1];
1538 if (!empty($params[$name]) && is_array($params[$name]))
1540 foreach ($params[$name] as $k => $v)
1544 unset($params[$name][$k]);
1548 if (!empty($params[$name]))
1550 $params[$name] = array_flip($params[$name]);
1553 $params[
'PROPERTY_CODE_MOBILE'][$iblockId] = $params[$name];
1555 unset($params[$match[0]]);
1557 elseif (preg_match(
'/^ENLARGE_PROP_(\d+)$/', $name, $match))
1559 $iblockId = (int)$match[1];
1563 if ($params[$name] !=
'' && $params[$name] !=
'-')
1565 $params[
'ENLARGE_PROP'][$iblockId] = $params[$name];
1567 unset($params[$match[0]]);
1571 if (!empty($params[
'SHOW_PRODUCTS']))
1573 $usePropertyFeatures = Iblock\Model\PropertyFeature::isEnabledFeatures();
1575 foreach (array_keys($params[
'SHOW_PRODUCTS']) as $iblockId)
1577 if (!isset($this->storage[
'IBLOCK_PARAMS'][$iblockId]) || !is_array($this->storage[
'IBLOCK_PARAMS'][$iblockId]))
1579 $this->storage[
'IBLOCK_PARAMS'][$iblockId] = array();
1583 $this->storage[
'IBLOCK_PARAMS'][$iblockId][
'ADD_PICT_PROP'] = $params[
'ADDITIONAL_PICT_PROP'][$iblockId] ??
'';
1584 $this->storage[
'IBLOCK_PARAMS'][$iblockId][
'LABEL_PROP'] = $params[
'LABEL_PROP'][$iblockId] ?? array();
1585 $this->storage[
'IBLOCK_PARAMS'][$iblockId][
'LABEL_PROP_MOBILE'] = $params[
'LABEL_PROP_MOBILE'][$iblockId] ?? array();
1586 $this->storage[
'IBLOCK_PARAMS'][$iblockId][
'PROPERTY_CODE_MOBILE'] = $params[
'PROPERTY_CODE_MOBILE'][$iblockId] ?? array();
1587 $this->storage[
'IBLOCK_PARAMS'][$iblockId][
'ENLARGE_PROP'] = $params[
'ENLARGE_PROP'][$iblockId] ??
'';
1590 $catalog = \CCatalogSku::GetInfoByProductIBlock($iblockId);
1591 if (!empty($catalog))
1593 $this->storage[
'IBLOCK_PARAMS'][$iblockId][
'OFFERS_ADD_PICT_PROP'] = $params[
'ADDITIONAL_PICT_PROP'][$catalog[
'IBLOCK_ID']] ??
'';
1597 unset($usePropertyFeatures);
1608 $params[
'ADD_PICT_PROP'] = isset($params[
'ADD_PICT_PROP']) ? trim($params[
'ADD_PICT_PROP']) :
'';
1609 if ($params[
'ADD_PICT_PROP'] ===
'-')
1611 $params[
'ADD_PICT_PROP'] =
'';
1614 if (!isset($params[
'LABEL_PROP']) || !is_array($params[
'LABEL_PROP']))
1616 $params[
'LABEL_PROP'] = array();
1619 if (!isset($params[
'LABEL_PROP_MOBILE']) || !is_array($params[
'LABEL_PROP_MOBILE']))
1621 $params[
'LABEL_PROP_MOBILE'] = array();
1624 if (!empty($params[
'LABEL_PROP_MOBILE']))
1626 $params[
'LABEL_PROP_MOBILE'] = array_flip($params[
'LABEL_PROP_MOBILE']);
1629 if (!isset($params[
'PROPERTY_CODE_MOBILE']) || !is_array($params[
'PROPERTY_CODE_MOBILE']))
1631 $params[
'PROPERTY_CODE_MOBILE'] = array();
1634 if (!empty($params[
'PROPERTY_CODE_MOBILE']))
1636 $params[
'PROPERTY_CODE_MOBILE'] = array_flip($params[
'PROPERTY_CODE_MOBILE']);
1639 $params[
'ENLARGE_PROP'] = isset($params[
'ENLARGE_PROP']) ? trim($params[
'ENLARGE_PROP']) :
'';
1640 if ($params[
'ENLARGE_PROP'] ===
'-')
1642 $params[
'ENLARGE_PROP'] =
'';
1645 $params[
'OFFER_ADD_PICT_PROP'] = isset($params[
'OFFER_ADD_PICT_PROP']) ? trim($params[
'OFFER_ADD_PICT_PROP']) :
'';
1646 if ($params[
'OFFER_ADD_PICT_PROP'] ===
'-')
1648 $params[
'OFFER_ADD_PICT_PROP'] =
'';
1651 if (!isset($this->storage[
'IBLOCK_PARAMS'][$params[
'IBLOCK_ID']]) || !is_array($this->storage[
'IBLOCK_PARAMS'][$params[
'IBLOCK_ID']]))
1653 $this->storage[
'IBLOCK_PARAMS'][$params[
'IBLOCK_ID']] = array();
1656 $this->storage[
'IBLOCK_PARAMS'][$params[
'IBLOCK_ID']][
'ADD_PICT_PROP'] = $params[
'ADD_PICT_PROP'];
1657 $this->storage[
'IBLOCK_PARAMS'][$params[
'IBLOCK_ID']][
'LABEL_PROP'] = $params[
'LABEL_PROP'];
1658 $this->storage[
'IBLOCK_PARAMS'][$params[
'IBLOCK_ID']][
'LABEL_PROP_MOBILE'] = $params[
'LABEL_PROP_MOBILE'];
1659 $this->storage[
'IBLOCK_PARAMS'][$params[
'IBLOCK_ID']][
'PROPERTY_CODE_MOBILE'] = $params[
'PROPERTY_CODE_MOBILE'];
1660 $this->storage[
'IBLOCK_PARAMS'][$params[
'IBLOCK_ID']][
'ENLARGE_PROP'] = $params[
'ENLARGE_PROP'];
1661 $this->storage[
'IBLOCK_PARAMS'][$params[
'IBLOCK_ID']][
'OFFERS_ADD_PICT_PROP'] = $params[
'OFFER_ADD_PICT_PROP'];
1662 unset($skuTreeProperties);
1668 $templateVariantsMap = static::getTemplateVariantsMap();
1670 if (!empty($templateVariantsMap))
1672 foreach ($templateVariantsMap as $key => $variant)
1674 if (isset($variant[
'DEFAULT']) && $variant[
'DEFAULT'] ===
'Y')
1676 $variantId = $variant[
'VARIANT'];
1687 if ($pageElementCount <= 0)
1692 $templateVariantsMap = static::getTemplateVariantsMap();
1694 if (empty($templateVariantsMap))
1701 foreach ($templateVariantsMap as $key => $variant)
1703 if ($variant[
'COUNT'] == $lineElementCount && $variant[
'ENLARGED_POS'] ===
false)
1712 ceil($pageElementCount / $templateVariantsMap[$variantId][
'COUNT']),
1713 array(
'VARIANT' => $variantId,
'BIG_DATA' =>
false)
1719 parent::checkTemplateTheme();
1723 if (is_array($this->arResult[
'NAV_PARAM']))
1725 $this->arResult[
'NAV_PARAM'][
'TEMPLATE_THEME'] = $this->arParams[
'TEMPLATE_THEME'];
1728 if (!empty($this->arResult[
'NAV_RESULT']))
1731 $this->arResult[
'NAV_STRING'] = $this->arResult[
'NAV_RESULT']->GetPageNavStringEx(
1732 $navComponentObject,
1733 $this->arParams[
'PAGER_TITLE'],
1734 $this->arParams[
'PAGER_TEMPLATE'],
1735 $this->arParams[
'PAGER_SHOW_ALWAYS'],
1737 $this->arResult[
'NAV_PARAM']
1745 $defaultParams = parent::getTemplateDefaultParams();
1746 $defaultParams[
'PRODUCT_BLOCKS_ORDER'] =
'price,props,sku,quantity,buttons';
1747 $defaultParams[
'PRODUCT_ROW_VARIANTS'] = array();
1748 $defaultParams[
'PROPERTY_CODE_MOBILE'] = array();
1749 $defaultParams[
'SHOW_SLIDER'] =
'Y';
1750 $defaultParams[
'SLIDER_INTERVAL'] = 3000;
1751 $defaultParams[
'ENLARGE_PRODUCT'] =
'STRICT';
1752 $defaultParams[
'ENLARGE_PROP'] =
'';
1753 $defaultParams[
'ADD_TO_BASKET_ACTION'] =
'ADD';
1754 $defaultParams[
'MESS_BTN_LAZY_LOAD'] =
'';
1756 return $defaultParams;
1763 if (!empty($this->arResult[
'ITEMS']))
1771 $this->arResult[
'BIG_DATA'] = [];
1772 if ($this->request->getRequestMethod() ===
'GET')
1784 $variantsMap = static::getTemplateVariantsMap();
1785 $isBigData = $this->
getAction() ===
'bigDataLoad';
1787 if ($this->arParams[
'ENLARGE_PRODUCT'] ===
'PROP')
1792 if (!empty($this->arParams[
'PRODUCT_ROW_VARIANTS']))
1796 foreach ($this->arParams[
'PRODUCT_ROW_VARIANTS'] as $variant)
1799 (!$isBigData && !$variant[
'BIG_DATA'])
1800 || ($isBigData && $variant[
'BIG_DATA'])
1815 $variantParam =
false;
1817 $itemsLength = count($this->arResult[
'ITEMS']);
1819 while (($itemsRemaining = $itemsLength - $itemsCounter) > 0)
1821 if ($variantParam ===
false)
1823 $variantParam = reset($this->arParams[
'PRODUCT_ROW_VARIANTS']);
1827 if (!empty($variantParam))
1830 $isBigData && !$variantParam[
'BIG_DATA']
1831 || !$isBigData && $variantParam[
'BIG_DATA']
1834 $variantParam = next($this->arParams[
'PRODUCT_ROW_VARIANTS']);
1836 if ($variantParam ===
false)
1838 $variantParam = reset($this->arParams[
'PRODUCT_ROW_VARIANTS']);
1841 if ($variantParam ===
false)
1849 $variantParam ===
false
1850 || !isset($variantsMap[$variantParam[
'VARIANT']])
1851 || ($variantsMap[$variantParam[
'VARIANT']][
'SHOW_ONLY_FULL'] && $variantsMap[$variantParam[
'VARIANT']][
'COUNT'] > $itemsRemaining)
1859 $variant = $variantsMap[$variantParam[
'VARIANT']];
1863 if ($this->arParams[
'ENLARGE_PRODUCT'] ===
'PROP' && $variant[
'ENLARGED_POS'] !==
false)
1865 if (!empty($enlargedIndexMap))
1867 $overallPos = $itemsCounter + $variant[
'ENLARGED_POS'];
1868 $overallPosKey = array_search($overallPos, $enlargedIndexMap);
1869 if ($overallPosKey ===
false)
1871 $closestPos =
false;
1872 $closestPosKey =
false;
1873 $enlargedPosInRange = array_intersect($enlargedIndexMap , range($itemsCounter, $itemsCounter + $variant[
'COUNT']));
1875 if (!empty($enlargedPosInRange))
1877 foreach ($enlargedPosInRange as $key => $posInRange)
1879 if ($closestPos ===
false || abs($overallPos - $closestPos) > abs($posInRange - $overallPos))
1881 $closestPos = $posInRange;
1882 $closestPosKey = $key;
1886 $temporary = array($this->arResult[
'ITEMS'][$closestPos]);
1887 unset($this->arResult[
'ITEMS'][$closestPos], $enlargedIndexMap[$closestPosKey]);
1888 array_splice($this->arResult[
'ITEMS'], $overallPos, 0, $temporary);
1893 unset($enlargedIndexMap[$overallPosKey]);
1899 $itemsCounter += $variant[
'COUNT'];
1900 $variantParam = next($this->arParams[
'PRODUCT_ROW_VARIANTS']);
1904 $this->arResult[
'ITEM_ROWS'] = $rows;
1916 $rowsRange = array();
1917 $variantsMap = static::getTemplateVariantsMap();
1919 if (!empty($this->arParams[
'PRODUCT_ROW_VARIANTS']))
1921 foreach ($this->arParams[
'PRODUCT_ROW_VARIANTS'] as $key => $row)
1923 if ($row[
'BIG_DATA'])
1927 if (isset($variantsMap[$row[
'VARIANT']]))
1929 $count += (int)$variantsMap[$row[
'VARIANT']][
'COUNT'];
1932 $rowsRange[] = $count;
1937 $shownIds = array();
1938 if (!empty($this->elements))
1940 foreach ($this->elements as $element)
1942 $shownIds[] = $element[
'ID'];
1947 'enabled' => $count > 0,
1950 'rowsRange' => $rowsRange,
1951 'shownIds' => $shownIds,
1953 'cookiePrefix' => \COption::GetOptionString(
'main',
'cookie_name',
'BITRIX_SM'),
1955 'serverTime' => $count > 0 ? time() : 0,
1964 $enlargedIndexMap = array();
1966 foreach ($this->arResult[
'ITEMS'] as $key => $item)
1968 if ($item[
'ENLARGED'] ===
'Y')
1970 $enlargedIndexMap[] = $key;
1974 return $enlargedIndexMap;
1984 'CLASS' =>
'product-item-list-col-1',
1986 'ENLARGED_POS' =>
false,
1987 'SHOW_ONLY_FULL' =>
false,
1995 'CLASS' =>
'product-item-list-col-2',
1997 'ENLARGED_POS' =>
false,
1998 'SHOW_ONLY_FULL' =>
false,
2006 'CLASS' =>
'product-item-list-col-3',
2008 'ENLARGED_POS' =>
false,
2009 'SHOW_ONLY_FULL' =>
false,
2017 'CLASS' =>
'product-item-list-col-4',
2019 'ENLARGED_POS' =>
false,
2020 'SHOW_ONLY_FULL' =>
false,
2028 'CLASS' =>
'product-item-list-col-1-4',
2030 'ENLARGED_POS' => 0,
2031 'SHOW_ONLY_FULL' =>
false,
2039 'CLASS' =>
'product-item-list-col-4-1',
2041 'ENLARGED_POS' => 4,
2042 'SHOW_ONLY_FULL' =>
true,
2050 'CLASS' =>
'product-item-list-col-6',
2052 'ENLARGED_POS' =>
false,
2053 'SHOW_ONLY_FULL' =>
false,
2061 'CLASS' =>
'product-item-list-col-1-6',
2063 'ENLARGED_POS' => 0,
2064 'SHOW_ONLY_FULL' =>
false,
2072 'CLASS' =>
'product-item-list-col-6-1',
2074 'ENLARGED_POS' => 6,
2075 'SHOW_ONLY_FULL' =>
true,
2083 'CLASS' =>
'product-item-line-list',
2085 'ENLARGED_POS' =>
false,
2086 'SHOW_ONLY_FULL' =>
false,
2095 $skuPropList = array();
2097 if ($this->arResult[
'MODULES'][
'catalog'] && !empty($this->storage[
'IBLOCK_PARAMS']))
2099 $elementIndex = array_keys($this->elements);
2101 foreach ($this->storage[
'IBLOCK_PARAMS'] as $iblockId => $iblockParams)
2103 $skuPropList[$iblockId] = array();
2104 $sku = \CCatalogSku::GetInfoByProductIBlock($iblockId);
2105 $boolSku = !empty($sku) && is_array($sku);
2107 if ($boolSku && !empty($iblockParams[
'OFFERS_TREE_PROPS']) && $this->arParams[
'PRODUCT_DISPLAY_MODE'] ===
'Y')
2109 $skuPropList[$iblockId] = \CIBlockPriceTools::getTreeProperties(
2111 $iblockParams[
'OFFERS_TREE_PROPS'],
2113 'PICT' => $this->arResult[
'DEFAULT_PICTURE'],
2118 if (!empty($skuPropList[$iblockId]))
2120 if (!empty($this->productWithOffers[$iblockId]))
2122 $skuPropIds = array();
2123 foreach ($skuPropList[$iblockId] as $property)
2125 $skuPropIds[$property[
'CODE']] = array(
2126 'ID' => $property[
'ID'],
2127 'CODE' => $property[
'CODE'],
2128 'PROPERTY_TYPE' => $property[
'PROPERTY_TYPE'],
2129 'USER_TYPE' => $property[
'USER_TYPE']
2134 $needValues = array();
2135 foreach ($elementIndex as $index)
2137 if ($this->elements[$index][
'IBLOCK_ID'] != $iblockId)
2139 if ($this->elements[$index][
'PRODUCT'][
'TYPE'] != Catalog\ProductTable::TYPE_SKU)
2141 if (empty($this->elements[$index][
'OFFERS']))
2143 foreach ($this->elements[$index][
'OFFERS'] as $offer)
2145 foreach ($skuPropIds as $property)
2147 if (isset($offer[
'DISPLAY_PROPERTIES'][$property[
'CODE']]))
2149 if (!isset($needValues[$property[
'ID']]))
2150 $needValues[$property[
'ID']] = array();
2151 $valueId = ($property[
'PROPERTY_TYPE'] == Iblock\PropertyTable::TYPE_LIST
2152 ? $offer[
'DISPLAY_PROPERTIES'][$property[
'CODE']][
'VALUE_ENUM_ID']
2153 : $offer[
'DISPLAY_PROPERTIES'][$property[
'CODE']][
'VALUE']
2155 $needValues[$property[
'ID']][$valueId] = $valueId;
2165 if (!empty($needValues))
2166 \CIBlockPriceTools::getTreePropertyValues($skuPropList[$iblockId], $needValues);
2174 $this->arParams[
'PRODUCT_DISPLAY_MODE'] =
'N';
2180 return $skuPropList;
2186 foreach ($items as $key => &$item)
2188 $iblockParams = $this->storage[
'IBLOCK_PARAMS'][$item[
'IBLOCK_ID']];
2190 if (!isset($item[
'CATALOG_QUANTITY']))
2192 $item[
'CATALOG_QUANTITY'] = 0;
2195 $item[
'CATALOG_QUANTITY'] = $item[
'CATALOG_QUANTITY'] > 0 && is_float($item[
'ITEM_MEASURE_RATIOS'][$item[
'ITEM_MEASURE_RATIO_SELECTED']][
'RATIO'])
2196 ? (float)$item[
'CATALOG_QUANTITY']
2197 : (
int)$item[
'CATALOG_QUANTITY'];
2199 $item[
'CATALOG'] =
false;
2200 $item[
'CATALOG_SUBSCRIPTION'] = ($item[
'CATALOG_SUBSCRIPTION'] ??
'') ===
'Y' ?
'Y' :
'N';
2202 $item[
'BIG_DATA'] = $this->
getAction() ===
'bigDataLoad';
2204 \CIBlockPriceTools::getLabel($item, $iblockParams[
'LABEL_PROP']);
2205 $item[
'LABEL_PROP_MOBILE'] = $iblockParams[
'LABEL_PROP_MOBILE'];
2206 $item[
'PROPERTY_CODE_MOBILE'] = $iblockParams[
'PROPERTY_CODE_MOBILE'];
2207 static::checkEnlargedData($item, $iblockParams[
'ENLARGE_PROP']);
2209 if ($this->arParams[
'SHOW_SLIDER'] ===
'Y')
2217 if ($item[
'CATALOG'] && !empty($item[
'OFFERS']))
2219 if ($this->arParams[
'PRODUCT_DISPLAY_MODE'] ===
'Y')
2225 if ($this->arParams[
'CALCULATE_SKU_MIN_PRICE'] || $this->arParams[
'PRODUCT_DISPLAY_MODE'] !==
'Y')
2228 if ($this->arResult[
'MODULES'][
'catalog'] && !isset($this->arResult[
'CONVERT_CURRENCY'][
'CURRENCY_ID']))
2230 $baseCurrency = Currency\CurrencyManager::getBaseCurrency();
2233 $currency = $this->arResult[
'CONVERT_CURRENCY'][
'CURRENCY_ID'] ?? $baseCurrency;
2235 $item[
'ITEM_START_PRICE'] =
null;
2236 $item[
'ITEM_START_PRICE_SELECTED'] =
null;
2237 if ($enableCompatible)
2238 $item[
'MIN_PRICE'] =
false;
2241 $minPriceIndex =
null;
2242 foreach (array_keys($item[
'OFFERS']) as $index)
2244 if (!$item[
'OFFERS'][$index][
'CAN_BUY'] || $item[
'OFFERS'][$index][
'ITEM_PRICE_SELECTED'] ===
null)
2247 $currentPrice = $item[
'OFFERS'][$index][
'ITEM_PRICES'][$item[
'OFFERS'][$index][
'ITEM_PRICE_SELECTED']];
2248 if ($currentPrice[
'CURRENCY'] != $currency)
2250 $priceScale = \CCurrencyRates::ConvertCurrency(
2251 $currentPrice[
'RATIO_PRICE'],
2252 $currentPrice[
'CURRENCY'],
2258 $priceScale = $currentPrice[
'RATIO_PRICE'];
2260 if ($minPrice ===
null || $minPrice > $priceScale)
2262 $minPrice = $priceScale;
2263 $minPriceIndex = $index;
2265 unset($priceScale, $currentPrice);
2269 if ($minPriceIndex !==
null)
2271 $minOffer = $item[
'OFFERS'][$minPriceIndex];
2272 $item[
'ITEM_START_PRICE_SELECTED'] = $minPriceIndex;
2273 $item[
'ITEM_START_PRICE'] = $minOffer[
'ITEM_PRICES'][$minOffer[
'ITEM_PRICE_SELECTED']];
2274 if ($enableCompatible)
2276 $item[
'MIN_PRICE'] = array(
2277 'CATALOG_MEASURE_RATIO' => $minOffer[
'ITEM_MEASURE_RATIOS'][$minOffer[
'ITEM_MEASURE_RATIO_SELECTED']][
'RATIO'],
2278 'CATALOG_MEASURE' => $minOffer[
'ITEM_MEASURE'][
'ID'],
2279 'CATALOG_MEASURE_NAME' => $minOffer[
'ITEM_MEASURE'][
'TITLE'],
2280 '~CATALOG_MEASURE_NAME' => $minOffer[
'ITEM_MEASURE'][
'~TITLE'],
2281 'VALUE' => $item[
'ITEM_START_PRICE'][
'RATIO_BASE_PRICE'],
2282 'DISCOUNT_VALUE' => $item[
'ITEM_START_PRICE'][
'RATIO_PRICE'],
2283 'PRINT_VALUE' => $item[
'ITEM_START_PRICE'][
'PRINT_RATIO_BASE_PRICE'],
2284 'PRINT_DISCOUNT_VALUE' => $item[
'ITEM_START_PRICE'][
'PRINT_RATIO_PRICE'],
2285 'DISCOUNT_DIFF' => $item[
'ITEM_START_PRICE'][
'RATIO_DISCOUNT'],
2286 'PRINT_DISCOUNT_DIFF' => $item[
'ITEM_START_PRICE'][
'PRINT_RATIO_DISCOUNT'],
2287 'DISCOUNT_DIFF_PERCENT' => $item[
'ITEM_START_PRICE'][
'PERCENT'],
2288 'CURRENCY' => $item[
'ITEM_START_PRICE'][
'CURRENCY']
2293 unset($minPriceIndex, $minPrice);
2295 unset($baseCurrency, $currency);
2300 $this->arResult[
'MODULES'][
'catalog']
2303 $item[
'CATALOG_TYPE'] == Catalog\ProductTable::TYPE_PRODUCT
2304 || $item[
'CATALOG_TYPE'] == Catalog\ProductTable::TYPE_SET
2308 if ($enableCompatible)
2310 if ($item[
'ITEM_PRICE_SELECTED'] ===
null)
2312 $item[
'RATIO_PRICE'] =
null;
2313 $item[
'MIN_BASIS_PRICE'] =
null;
2317 $itemPrice = $item[
'ITEM_PRICES'][$item[
'ITEM_PRICE_SELECTED']];
2318 $item[
'RATIO_PRICE'] = array(
2319 'VALUE' => $itemPrice[
'RATIO_BASE_PRICE'],
2320 'DISCOUNT_VALUE' => $itemPrice[
'RATIO_PRICE'],
2321 'PRINT_VALUE' => $itemPrice[
'PRINT_RATIO_BASE_PRICE'],
2322 'PRINT_DISCOUNT_VALUE' => $itemPrice[
'PRINT_RATIO_PRICE'],
2323 'DISCOUNT_DIFF' => $itemPrice[
'RATIO_DISCOUNT'],
2324 'PRINT_DISCOUNT_DIFF' => $itemPrice[
'PRINT_RATIO_DISCOUNT'],
2325 'DISCOUNT_DIFF_PERCENT' => $itemPrice[
'PERCENT'],
2326 'CURRENCY' => $itemPrice[
'CURRENCY']
2328 $item[
'MIN_BASIS_PRICE'] = array(
2329 'VALUE' => $itemPrice[
'BASE_PRICE'],
2330 'DISCOUNT_VALUE' => $itemPrice[
'PRICE'],
2331 'PRINT_VALUE' => $itemPrice[
'PRINT_BASE_PRICE'],
2332 'PRINT_DISCOUNT_VALUE' => $itemPrice[
'PRINT_PRICE'],
2333 'DISCOUNT_DIFF' => $itemPrice[
'DISCOUNT'],
2334 'PRINT_DISCOUNT_DIFF' => $itemPrice[
'PRINT_DISCOUNT'],
2335 'DISCOUNT_DIFF_PERCENT' => $itemPrice[
'PERCENT'],
2336 'CURRENCY' => $itemPrice[
'CURRENCY']
2343 if (!empty($item[
'DISPLAY_PROPERTIES']))
2345 foreach ($item[
'DISPLAY_PROPERTIES'] as $propKey => $displayProp)
2348 if ($displayProp[
'PROPERTY_TYPE'] ===
'F')
2350 unset($item[
'DISPLAY_PROPERTIES'][$propKey]);
2356 $item[
'LAST_ELEMENT'] =
'N';
2360 $items[key($items)][
'LAST_ELEMENT'] =
'Y';
2365 $iblockParams = $this->storage[
'IBLOCK_PARAMS'][$item[
'IBLOCK_ID']];
2366 $productPictures = \CIBlockPriceTools::getDoublePicturesForItem($item, $iblockParams[
'ADD_PICT_PROP']);
2368 if (empty($productPictures[
'PICT']))
2370 $productPictures[
'PICT'] = $this->arResult[
'DEFAULT_PICTURE'];
2373 if (empty($productPictures[
'SECOND_PICT']))
2375 $productPictures[
'SECOND_PICT'] = $productPictures[
'PICT'];
2378 $item[
'PREVIEW_PICTURE'] = $productPictures[
'PICT'];
2379 $item[
'PREVIEW_PICTURE_SECOND'] = $productPictures[
'SECOND_PICT'];
2380 $item[
'SECOND_PICT'] =
true;
2381 $item[
'PRODUCT_PREVIEW'] = $productPictures[
'PICT'];
2382 $item[
'PRODUCT_PREVIEW_SECOND'] = $productPictures[
'SECOND_PICT'];
2388 $boolSkuDisplayProperties =
false;
2391 foreach ($item[
'OFFERS'] as $offerKey => $offer)
2393 if ($item[
'OFFER_ID_SELECTED'] > 0)
2395 $foundOffer = ($item[
'OFFER_ID_SELECTED'] == $offer[
'ID']);
2399 $foundOffer = $offer[
'CAN_BUY'];
2402 if ($foundOffer && $intSelected == -1)
2404 $intSelected = $offerKey;
2410 if (!empty($offer[
'DISPLAY_PROPERTIES']))
2412 $boolSkuDisplayProperties =
true;
2413 $skuProps = array();
2414 foreach ($offer[
'DISPLAY_PROPERTIES'] as $oneProp)
2416 if ($oneProp[
'PROPERTY_TYPE'] ===
'F')
2419 $skuProps[] = array(
2420 'CODE' => $oneProp[
'CODE'],
2421 'NAME' => $oneProp[
'NAME'],
2422 'VALUE' => $oneProp[
'DISPLAY_VALUE']
2428 $ratioSelectedIndex = $offer[
'ITEM_MEASURE_RATIO_SELECTED'];
2430 'ID' => $offer[
'ID'],
2431 'NAME' => ($offer[
'~NAME'] ??
''),
2432 'TREE' => $offer[
'TREE'],
2433 'DISPLAY_PROPERTIES' => $skuProps,
2436 'PRICE' => ($offer[
'RATIO_PRICE'] ?? $offer[
'MIN_PRICE'] ?? 0),
2437 'BASIS_PRICE' => ($offer[
'MIN_PRICE'] ?? 0),
2440 'ITEM_PRICE_MODE' => $offer[
'ITEM_PRICE_MODE'],
2441 'ITEM_PRICES' => $offer[
'ITEM_PRICES'],
2442 'ITEM_PRICE_SELECTED' => $offer[
'ITEM_PRICE_SELECTED'],
2443 'ITEM_QUANTITY_RANGES' => $offer[
'ITEM_QUANTITY_RANGES'],
2444 'ITEM_QUANTITY_RANGE_SELECTED' => $offer[
'ITEM_QUANTITY_RANGE_SELECTED'],
2445 'ITEM_MEASURE_RATIOS' => $offer[
'ITEM_MEASURE_RATIOS'],
2446 'ITEM_MEASURE_RATIO_SELECTED' => $ratioSelectedIndex,
2447 'SECOND_PICT' => $offer[
'SECOND_PICT'],
2448 'OWNER_PICT' => $offer[
'OWNER_PICT'],
2449 'PREVIEW_PICTURE' => $offer[
'PREVIEW_PICTURE'],
2450 'PREVIEW_PICTURE_SECOND' => $offer[
'PREVIEW_PICTURE_SECOND'],
2451 'CHECK_QUANTITY' => $offer[
'CHECK_QUANTITY'],
2452 'MAX_QUANTITY' => $offer[
'PRODUCT'][
'QUANTITY'],
2453 'STEP_QUANTITY' => $offer[
'ITEM_MEASURE_RATIOS'][$ratioSelectedIndex][
'RATIO'],
2454 'QUANTITY_FLOAT' => is_float($offer[
'ITEM_MEASURE_RATIOS'][$ratioSelectedIndex][
'RATIO']),
2455 'MEASURE' => $offer[
'ITEM_MEASURE'][
'TITLE'],
2456 'CAN_BUY' => $offer[
'CAN_BUY'],
2457 'CATALOG_SUBSCRIBE' => $offer[
'PRODUCT'][
'SUBSCRIBE']
2459 unset($ratioSelectedIndex);
2461 if (isset($offer[
'MORE_PHOTO_COUNT']) && $offer[
'MORE_PHOTO_COUNT'] > 0)
2463 $oneRow[
'MORE_PHOTO'] = $offer[
'MORE_PHOTO'];
2464 $oneRow[
'MORE_PHOTO_COUNT'] = $offer[
'MORE_PHOTO_COUNT'];
2467 $matrix[$offerKey] = $oneRow;
2470 if ($intSelected == -1)
2475 if (!$matrix[$intSelected][
'OWNER_PICT'])
2477 $item[
'PREVIEW_PICTURE'] = $matrix[$intSelected][
'PREVIEW_PICTURE'];
2478 $item[
'PREVIEW_PICTURE_SECOND'] = $matrix[$intSelected][
'PREVIEW_PICTURE_SECOND'];
2481 $item[
'JS_OFFERS'] = $matrix;
2482 $item[
'OFFERS_SELECTED'] = $intSelected;
2483 $item[
'OFFERS_PROPS_DISPLAY'] = $boolSkuDisplayProperties;
2489 $newOffers = array();
2491 $item[
'OFFERS_PROP'] =
false;
2492 $item[
'SKU_TREE_VALUES'] = array();
2494 $iblockParams = $this->storage[
'IBLOCK_PARAMS'][$item[
'IBLOCK_ID']];
2496 if (isset($this->arResult[
'SKU_PROPS'][$item[
'IBLOCK_ID']]))
2498 $skuPropList = $this->arResult[
'SKU_PROPS'][$item[
'IBLOCK_ID']];
2500 $skuPropIds = array_keys($skuPropList);
2501 $matrixFields = array_fill_keys($skuPropIds,
false);
2503 foreach ($item[
'OFFERS'] as $offerKey => $offer)
2505 $offer[
'ID'] = (int)$offer[
'ID'];
2507 if (isset($double[$offer[
'ID']]))
2511 foreach ($skuPropIds as $code)
2516 $matrix[$offerKey] = $row;
2518 \CIBlockPriceTools::clearProperties($offer[
'DISPLAY_PROPERTIES'], $iblockParams[
'OFFERS_TREE_PROPS']);
2519 \CIBlockPriceTools::setRatioMinPrice($offer,
false);
2521 if ($this->arParams[
'SHOW_SLIDER'] ===
'Y')
2526 $offerPictures = \CIBlockPriceTools::getDoublePicturesForItem($offer, $iblockParams[
'OFFERS_ADD_PICT_PROP']);
2527 $offer[
'OWNER_PICT'] = empty($offerPictures[
'PICT']);
2528 $offer[
'PREVIEW_PICTURE'] =
false;
2529 $offer[
'PREVIEW_PICTURE_SECOND'] =
false;
2530 $offer[
'SECOND_PICT'] =
true;
2532 if (!$offer[
'OWNER_PICT'])
2534 if (empty($offerPictures[
'SECOND_PICT']))
2536 $offerPictures[
'SECOND_PICT'] = $offerPictures[
'PICT'];
2539 $offer[
'PREVIEW_PICTURE'] = $offerPictures[
'PICT'];
2540 $offer[
'PREVIEW_PICTURE_SECOND'] = $offerPictures[
'SECOND_PICT'];
2543 if ($iblockParams[
'OFFERS_ADD_PICT_PROP'] !=
'' && isset($offer[
'DISPLAY_PROPERTIES'][$iblockParams[
'OFFERS_ADD_PICT_PROP']]))
2545 unset($offer[
'DISPLAY_PROPERTIES'][$iblockParams[
'OFFERS_ADD_PICT_PROP']]);
2548 $double[$offer[
'ID']] =
true;
2549 $newOffers[$offerKey] = $offer;
2552 $item[
'OFFERS'] = $newOffers;
2554 $usedFields = array();
2557 $matrixKeys = array_keys($matrix);
2558 foreach ($skuPropIds as $propCode)
2560 $boolExist = $matrixFields[$propCode];
2561 foreach ($matrixKeys as $offerKey)
2565 if (!isset($item[
'OFFERS'][$offerKey][
'TREE']))
2567 $item[
'OFFERS'][$offerKey][
'TREE'] = array();
2570 $propId = $this->arResult[
'SKU_PROPS'][$item[
'IBLOCK_ID']][$propCode][
'ID'];
2571 $value = $matrix[$offerKey][$propCode][
'VALUE'];
2573 if (!isset($item[
'SKU_TREE_VALUES'][$propId]))
2575 $item[
'SKU_TREE_VALUES'][$propId] = array();
2578 $item[
'SKU_TREE_VALUES'][$propId][$value] =
true;
2579 $item[
'OFFERS'][$offerKey][
'TREE'][
'PROP_'.$propId] = $value;
2580 $item[
'OFFERS'][$offerKey][
'SKU_SORT_'.$propCode] = $matrix[$offerKey][$propCode][
'SORT'];
2581 $usedFields[$propCode] =
true;
2582 $sortFields[
'SKU_SORT_'.$propCode] = SORT_NUMERIC;
2583 unset($value, $propId);
2587 unset($matrix[$offerKey][$propCode]);
2592 unset($propCode, $matrixKeys);
2594 $item[
'OFFERS_PROP'] = $usedFields;
2595 $item[
'OFFERS_PROP_CODES'] = !empty($usedFields) ? base64_encode(serialize(array_keys($usedFields))) :
'';
2597 Collection::sortByColumn($item[
'OFFERS'],
$sortFields);
2605 if (!
Iblock\Model\PropertyFeature::isEnabledFeatures())
2608 foreach (array_keys($this->storage[
'IBLOCK_PARAMS']) as $iblockId)
2623 $list = Iblock\Model\PropertyFeature::getListPageShowPropertyCodes(
2629 $this->storage[
'IBLOCK_PARAMS'][$iblockId][
'PROPERTY_CODE'] = $list;
2630 if ($this->useCatalog)
2632 $list = Iblock\Model\PropertyFeature::getListPageShowPropertyCodes(
2638 $this->storage[
'IBLOCK_PARAMS'][$iblockId][
'OFFERS_PROPERTY_CODE'] = $list;
getOffersIblockId($iblockId)
editTemplateCatalogInfo(&$item)
getTemplateEmptyPreview()
getBigDataServiceRequestParams($type='')
processElement(array &$element)
parseCondition($condition, $params)
getTemplatePropCell($code, $offer, &$matrixFields, $skuPropList)
loadOfferTreePropertyCodes($iblockId)
loadBasketPropertyCodes($iblockId)
getPropertyList($iblock, $propertyCodes)
editTemplateProductSlider(&$item, $iblock, $limit=0, $addDetailToSlider=true, $default=array())
offerIblockExist($iblockId)
editTemplateOfferSlider(&$item, $iblock, $limit=0, $addDetailToSlider=true, $default=array())
getTemplateMultiIblockParams(&$params)
initNavString(\CIBlockResult $elementIterator)
sortItemsByTemplateVariants()
setPaginationMode($state)
getIblockElements($elementIterator)
onPrepareComponentParams($params)
getPaginationParams(&$params)
static predictRowVariants($lineElementCount, $pageElementCount)
setMultiIblockMode($state)
getElementList($iblockId, $products)
editTemplateJsOffers(&$item)
getFilteredOffersByProperty($iblockId)
getSingleIblockParams(&$params)
editTemplateProductPictures(&$item)
getSpecificIblockParams(&$params)
static parseJsonParameter($jsonString)
checkProductIblock(array $product)
getTemplateDefaultParams()
static getTemplateVariantsMap()
chooseOffer($offers, $iblockId)
getMultiIblockParams(&$params)
initIblockPropertyFeatures()
editTemplateItems(&$items)
static predictElementCountByVariants($variants, $isBigData=false)
editTemplateOfferProps(&$item)
getOffersPropFilter(array $level)
static getDefaultVariantId()
getTemplateSingleIblockParams(&$params)
loadDisplayPropertyCodes($iblockId)
modifyDisplayProperties($iblock, &$iblockElements)
prepareElementSortRow(array $params, array $orderRow, array $default)