3namespace Bitrix\Iblock\Component;
10use Bitrix\Main\Type\Collection;
11use Bitrix\Main\Type\DateTime;
12use Bitrix\Main\Localization\Loc;
13use Bitrix\Sale\Internals\FacebookConversion;
28 $params[
'ADD_SECTIONS_CHAIN'] = (isset(
$params[
'ADD_SECTIONS_CHAIN']) &&
$params[
'ADD_SECTIONS_CHAIN'] ===
'N' ?
'N' :
'Y');
29 $params[
'PRODUCT_DISPLAY_MODE'] =
'Y';
31 $params[
'IBLOCK_TYPE'] = trim((
string)(
$params[
'IBLOCK_TYPE'] ??
''));
33 if (isset(
$params[
'ELEMENT_ID']))
37 $this->errorCollection->setError(
new Error(Loc::getMessage(
'CATALOG_ELEMENT_NOT_FOUND'), self::ERROR_404));
44 $params[
'ELEMENT_CODE'] = trim((
string)(
$params[
'ELEMENT_CODE'] ??
''));
46 $params[
'CHECK_SECTION_ID_VARIABLE'] = isset(
$params[
'CHECK_SECTION_ID_VARIABLE']) &&
$params[
'CHECK_SECTION_ID_VARIABLE'] ===
'Y' ?
'Y' :
'N';
47 $params[
'SECTION_ID_VARIABLE'] = trim((
string)(
$params[
'SECTION_ID_VARIABLE'] ??
''));
49 $params[
'SECTION_ID_VARIABLE'] ===
''
50 || !preg_match(self::PARAM_TITLE_MASK,
$params[
'SECTION_ID_VARIABLE'])
53 $params[
'SECTION_ID_VARIABLE'] =
'SECTION_ID';
57 if (
$params[
'CHECK_SECTION_ID_VARIABLE'] ===
'Y')
59 $params[
'FROM_SECTION'] = trim($this->request->get(
$params[
'SECTION_ID_VARIABLE']));
62 $params[
'SECTIONS_CHAIN_START_FROM'] = (int)(
$params[
'SECTIONS_CHAIN_START_FROM'] ?? 0);
63 $params[
'META_KEYWORDS'] = trim((
string)(
$params[
'META_KEYWORDS'] ??
''));
64 $params[
'META_DESCRIPTION'] = trim((
string)(
$params[
'META_DESCRIPTION'] ??
''));
65 $params[
'BROWSER_TITLE'] = trim((
string)(
$params[
'BROWSER_TITLE'] ??
''));
67 $params[
'BACKGROUND_IMAGE'] = trim((
string)(
$params[
'BACKGROUND_IMAGE'] ??
''));
68 if (
$params[
'BACKGROUND_IMAGE'] ===
'-')
70 $params[
'BACKGROUND_IMAGE'] =
'';
73 $params[
'USE_MAIN_ELEMENT_SECTION'] = isset(
$params[
'USE_MAIN_ELEMENT_SECTION']) &&
$params[
'USE_MAIN_ELEMENT_SECTION'] ===
'Y';
74 $params[
'ADD_ELEMENT_CHAIN'] = isset(
$params[
'ADD_ELEMENT_CHAIN']) &&
$params[
'ADD_ELEMENT_CHAIN'] ===
'Y';
75 $params[
'LINK_IBLOCK_TYPE'] = trim((
string)(
$params[
'LINK_IBLOCK_TYPE'] ??
''));
77 $params[
'LINK_PROPERTY_SID'] = trim((
string)(
$params[
'LINK_PROPERTY_SID'] ??
''));
78 $params[
'LINK_ELEMENTS_URL'] = trim((
string)(
$params[
'LINK_ELEMENTS_URL'] ??
''));
79 if (
$params[
'LINK_ELEMENTS_URL'] ===
'')
81 $params[
'LINK_ELEMENTS_URL'] =
'link.php?PARENT_ELEMENT_ID=#ELEMENT_ID#';
84 $params[
'SHOW_WORKFLOW'] = $this->request->get(
'show_workflow') ===
'Y';
90 $params[
'PRICE_VAT_SHOW_VALUE'] = isset(
$params[
'PRICE_VAT_SHOW_VALUE']) &&
$params[
'PRICE_VAT_SHOW_VALUE'] ===
'Y';
93 if (!isset(
$params[
'HIDE_NOT_AVAILABLE_OFFERS']) && isset(
$params[
'HIDE_NOT_AVAILABLE']))
95 $params[
'HIDE_NOT_AVAILABLE_OFFERS'] =
$params[
'HIDE_NOT_AVAILABLE'];
99 !isset(
$params[
'HIDE_NOT_AVAILABLE_OFFERS'])
100 || (
$params[
'HIDE_NOT_AVAILABLE_OFFERS'] !==
'Y' &&
$params[
'HIDE_NOT_AVAILABLE_OFFERS'] !==
'L')
103 $params[
'HIDE_NOT_AVAILABLE_OFFERS'] =
'N';
106 $params[
'HIDE_NOT_AVAILABLE'] =
'N';
107 $params[
'USE_ELEMENT_COUNTER'] = isset(
$params[
'USE_ELEMENT_COUNTER']) &&
$params[
'USE_ELEMENT_COUNTER'] ===
'N' ?
'N' :
'Y';
108 $params[
'SHOW_DEACTIVATED'] = isset(
$params[
'SHOW_DEACTIVATED']) &&
$params[
'SHOW_DEACTIVATED'] ===
'Y' ?
'Y' :
'N';
111 if (empty(
$params[
'USE_GIFTS_DETAIL']))
113 $params[
'USE_GIFTS_DETAIL'] =
'Y';
116 if (empty(
$params[
'USE_GIFTS_MAIN_PR_SECTION_LIST']))
118 $params[
'USE_GIFTS_MAIN_PR_SECTION_LIST'] =
'Y';
121 if (empty(
$params[
'GIFTS_DETAIL_PAGE_ELEMENT_COUNT']))
123 $params[
'GIFTS_DETAIL_PAGE_ELEMENT_COUNT'] = 4;
126 if (empty(
$params[
'GIFTS_MAIN_PRODUCT_DETAIL_PAGE_ELEMENT_COUNT']))
128 $params[
'GIFTS_MAIN_PRODUCT_DETAIL_PAGE_ELEMENT_COUNT'] = 4;
140 if (!isset(
$params[
'PROPERTY_CODE']) || !is_array(
$params[
'PROPERTY_CODE']))
145 foreach (
$params[
'PROPERTY_CODE'] as
$k => $v)
153 if (!isset(
$params[
'OFFERS_FIELD_CODE']))
162 foreach (
$params[
'OFFERS_FIELD_CODE'] as
$key => $value)
170 if (!isset(
$params[
'OFFERS_PROPERTY_CODE']))
179 foreach (
$params[
'OFFERS_PROPERTY_CODE'] as
$key => $value)
187 if (!in_array(
'PREVIEW_PICTURE',
$params[
'OFFERS_PROPERTY_CODE']))
189 $params[
'OFFERS_PROPERTY_CODE'][] =
'PREVIEW_PICTURE';
192 if (!in_array(
'DETAIL_PICTURE',
$params[
'OFFERS_PROPERTY_CODE']))
194 $params[
'OFFERS_PROPERTY_CODE'][] =
'DETAIL_PICTURE';
197 $cartProperties = [];
198 $offersCartProperties = [];
199 $offerTreeProperties = [];
200 if (!$usePropertyFeatures)
202 if (!isset(
$params[
'PRODUCT_PROPERTIES']) || !is_array(
$params[
'PRODUCT_PROPERTIES']))
207 foreach (
$params[
'PRODUCT_PROPERTIES'] as
$k => $v)
211 unset(
$params[
'PRODUCT_PROPERTIES'][
$k]);
214 $cartProperties =
$params[
'PRODUCT_PROPERTIES'];
216 if (!isset(
$params[
'OFFERS_CART_PROPERTIES']) || !is_array(
$params[
'OFFERS_CART_PROPERTIES']))
221 foreach (
$params[
'OFFERS_CART_PROPERTIES'] as
$i => $pid)
225 unset(
$params[
'OFFERS_CART_PROPERTIES'][
$i]);
228 $offersCartProperties =
$params[
'OFFERS_CART_PROPERTIES'];
230 if (!isset(
$params[
'OFFER_TREE_PROPS']))
239 foreach (
$params[
'OFFER_TREE_PROPS'] as
$key => $value)
241 $value = (string)$value;
242 if ($value ==
'' || $value ===
'-')
248 if (empty(
$params[
'OFFER_TREE_PROPS']) && !empty(
$params[
'OFFERS_CART_PROPERTIES']))
251 foreach (
$params[
'OFFER_TREE_PROPS'] as
$key => $value)
259 $offerTreeProperties =
$params[
'OFFER_TREE_PROPS'];
264 'PROPERTY_CODE' =>
$params[
'PROPERTY_CODE'],
265 'CART_PROPERTIES' => $cartProperties,
266 'OFFERS_FIELD_CODE' =>
$params[
'OFFERS_FIELD_CODE'],
267 'OFFERS_PROPERTY_CODE' =>
$params[
'OFFERS_PROPERTY_CODE'],
268 'OFFERS_CART_PROPERTIES' => $offersCartProperties,
269 'OFFERS_TREE_PROPS' => $offerTreeProperties
276 if (
$success = parent::checkModules())
278 $this->storage[
'MODULES'][
'workflow'] =
false;
286 parent::initialLoadAction();
288 if (!$this->
hasErrors() && isset($this->arResult[
'ID']))
301 parent::processResultData();
302 $this->arResult[
'IS_FACEBOOK_CONVERSION_CUSTOMIZE_PRODUCT_EVENT_ENABLED'] =
false;
313 $this->abortResultCache();
314 $this->errorCollection->setError(
new Error(Loc::getMessage(
'CATALOG_ELEMENT_NOT_FOUND'), self::ERROR_404));
325 if ($this->arParams[
'ELEMENT_ID'] <= 0)
328 'IBLOCK_ID' => $this->arParams[
'IBLOCK_ID'],
329 'IBLOCK_LID' => $this->getSiteId(),
330 'ACTIVE_DATE' =>
'Y',
331 'CHECK_PERMISSIONS' =>
'Y',
332 'MIN_PERMISSION' =>
'R',
335 if ($this->arParams[
'SHOW_DEACTIVATED'] !==
'Y')
337 $findFilter[
'ACTIVE'] =
'Y';
341 $this->arParams[
'ELEMENT_ID'],
342 $this->arParams[
'~ELEMENT_CODE'],
343 $this->arParams[
'STRICT_SECTION_CHECK']? $this->arParams[
'SECTION_ID']: 0,
344 $this->arParams[
'STRICT_SECTION_CHECK']? $this->arParams[
'~SECTION_CODE']:
'',
349 return $this->arParams[
'ELEMENT_ID'] > 0;
354 parent::initCatalogInfo();
355 $useCatalogButtons =
array();
358 !empty($this->storage[
'CATALOGS'][$this->arParams[
'IBLOCK_ID']])
359 && is_array($this->storage[
'CATALOGS'][$this->arParams[
'IBLOCK_ID']])
362 $catalogType = $this->storage[
'CATALOGS'][$this->arParams[
'IBLOCK_ID']][
'CATALOG_TYPE'];
363 if ($catalogType == \CCatalogSku::TYPE_CATALOG || $catalogType == \CCatalogSku::TYPE_FULL)
365 $useCatalogButtons[
'add_product'] =
true;
368 if ($catalogType == \CCatalogSku::TYPE_PRODUCT || $catalogType == \CCatalogSku::TYPE_FULL)
370 $useCatalogButtons[
'add_sku'] =
true;
375 $this->arResult[
'USE_CATALOG_BUTTONS'] = $useCatalogButtons;
383 if (!
Iblock\
Model\PropertyFeature::isEnabledFeatures())
387 $this->loadBasketPropertyCodes($this->arParams[
'IBLOCK_ID']);
388 $this->loadOfferTreePropertyCodes($this->arParams[
'IBLOCK_ID']);
393 return ($product[
'PRODUCT_IBLOCK_ID'] == $this->arParams[
'IBLOCK_ID']);
408 $this->storage[
'IBLOCK_PARAMS'][
$iblockId][
'PROPERTY_CODE'] = $list;
409 if ($this->useCatalog)
417 $this->storage[
'IBLOCK_PARAMS'][
$iblockId][
'OFFERS_PROPERTY_CODE'] = $list;
428 if ($this->arParams[
'SET_CANONICAL_URL'] ===
'Y')
441 if ($this->arParams[
'SHOW_DEACTIVATED'] !==
'Y')
451 $wfShowHistory =
'N';
455 $this->storage[
'modules'][
'workflow'] =
true;
457 $wfElementId = \CIBlockElement::WF_GetLast($this->arParams[
'ELEMENT_ID']);
458 $wfStatusId = \CIBlockElement::WF_GetCurrentStatus($wfElementId, $wfStatusTitle);
459 $wfStatusPermission = \CIBlockElement::WF_GetStatusPermission($wfStatusId);
461 if ($wfStatusId == 1 || $wfStatusPermission < 1)
463 $wfElementId = $this->arParams[
'ELEMENT_ID'];
467 $wfShowHistory =
'Y';
470 $this->arParams[
'ELEMENT_ID'] = $wfElementId;
473 return $wfShowHistory;
480 if ($this->arParams[
'STRICT_SECTION_CHECK'])
482 $sectionId = !empty($section) ? $section[
'ID'] : 0;
484 if ($this->arParams[
'USE_MAIN_ELEMENT_SECTION'])
486 $this->filterFields[
'IBLOCK_SECTION_ID'] = $sectionId;
490 $this->filterFields[
'SECTION_ID'] = $sectionId;
491 $this->filterFields[
'INCLUDE_SUBSECTIONS'] =
'N';
495 $elementIterator = parent::getElementList(
$iblockId, $products);
497 if (!empty($elementIterator) && !$this->arParams[
'USE_MAIN_ELEMENT_SECTION'])
499 $elementIterator->SetSectionContext($section);
502 $this->storage[
'SECTION'] = $section;
504 return $elementIterator;
510 $sectionFilter =
array(
511 'IBLOCK_ID' => $this->arParams[
'IBLOCK_ID'],
515 if ($this->arParams[
'SECTION_ID'] > 0 || $this->arParams[
'SECTION_CODE'] !==
'')
517 if ($this->arParams[
'SECTION_ID'] > 0)
519 $sectionFilter[
'ID'] = $this->arParams[
'SECTION_ID'];
523 $sectionFilter[
'HAS_ELEMENT'] = $this->arParams[
'ELEMENT_ID'];
524 $sectionFilter[
'=CODE'] = $this->arParams[
'SECTION_CODE'];
527 $sectionIterator = \CIBlockSection::GetList(
array(), $sectionFilter);
528 $sectionIterator->SetUrlTemplates(
'', $this->arParams[
'SECTION_URL']);
529 $section = $sectionIterator->GetNext();
531 elseif ($this->arParams[
'CHECK_SECTION_ID_VARIABLE'] ===
'Y' && $this->arParams[
'FROM_SECTION'] !==
'')
533 if ((
int)$this->arParams[
'FROM_SECTION'].
'|' == $this->arParams[
'FROM_SECTION'].
'|')
535 $sectionFilter[
'ID'] = $this->arParams[
'FROM_SECTION'];
539 $sectionFilter[
'HAS_ELEMENT'] = $this->arParams[
'ELEMENT_ID'];
540 $sectionFilter[
'=CODE'] = $this->arParams[
'FROM_SECTION'];
543 $sectionIterator = \CIBlockSection::GetList(
array(), $sectionFilter);
544 $sectionIterator->SetUrlTemplates(
'', $this->arParams[
'SECTION_URL']);
545 $section = $sectionIterator->GetNext();
551 protected function getIblockElements($elementIterator)
553 $iblockElements =
array();
556 if (!empty($elementIterator) && ($elementObject = $elementIterator->GetNextElement()))
558 $element = $elementObject->GetFields();
559 $this->processElement($element);
560 $iblockElements[$element[
'ID']] = $element;
564 $this->abortResultCache();
565 $this->errorCollection->setError(
new Error(Loc::getMessage(
'CATALOG_ELEMENT_NOT_FOUND'), self::ERROR_404));
568 return $iblockElements;
573 if (!empty($iblockElements))
575 reset($iblockElements);
576 $elementKey = key($iblockElements);
577 $element =& $iblockElements[$elementKey];
579 $iblockParams = $this->storage[
'IBLOCK_PARAMS'][
$iblock];
581 'ID' => array_keys($iblockElements),
584 \CIBlockElement::GetPropertyValuesArray($iblockElements,
$iblock, $propFilter);
586 if (!empty($iblockParams[
'PROPERTY_CODE']))
588 $propertyList = $this->getPropertyList(
$iblock, $iblockParams[
'PROPERTY_CODE']);
591 if ($this->useCatalog && $this->useDiscountCache)
593 if ($this->storage[
'USE_SALE_DISCOUNTS'])
596 \CCatalogDiscount::SetProductPropertiesCache($element[
'ID'], $element[
'PROPERTIES']);
599 if (!empty($propertyList))
601 foreach ($propertyList as $pid)
603 if (!isset($element[
'PROPERTIES'][$pid]))
606 $prop =& $element[
'PROPERTIES'][$pid];
607 $isArr = is_array($prop[
'VALUE']);
609 ($isArr && !empty($prop[
'VALUE']))
610 || (!$isArr && (
string)$prop[
'VALUE'] !==
'')
614 $element[
'DISPLAY_PROPERTIES'][$pid] = \CIBlockFormatProperties::GetDisplayValue($element, $prop);
624 if ($this->arParams[
'ADD_PROPERTIES_TO_BASKET'] ===
'Y' && !empty($iblockParams[
'CART_PROPERTIES']))
629 $iblockParams[
'CART_PROPERTIES'],
630 $element[
'PROPERTIES']
633 if (!empty($element[
'PRODUCT_PROPERTIES']))
639 $element[
'BACKGROUND_IMAGE'] =
false;
641 if ($this->arParams[
'BACKGROUND_IMAGE'] !=
'' && isset($element[
'PROPERTIES'][$this->arParams[
'BACKGROUND_IMAGE']]))
643 if (!empty($element[
'PROPERTIES'][$this->arParams[
'BACKGROUND_IMAGE']][
'VALUE']))
645 $element[
'BACKGROUND_IMAGE'] = \CFile::GetFileArray($element[
'PROPERTIES'][$this->arParams[
'BACKGROUND_IMAGE']][
'VALUE']);
649 $element[
'MORE_PHOTO'] =
array();
651 if (!empty($element[
'PROPERTIES'][
'MORE_PHOTO'][
'VALUE']) && is_array($element[
'PROPERTIES'][
'MORE_PHOTO'][
'VALUE']))
653 foreach ($element[
'PROPERTIES'][
'MORE_PHOTO'][
'VALUE'] as $file)
655 $file = \CFile::GetFileArray($file);
658 $element[
'MORE_PHOTO'][] = $file;
663 $element[
'LINKED_ELEMENTS'] =
array();
666 $this->arParams[
'LINK_PROPERTY_SID'] <>
''
667 && $this->arParams[
'LINK_IBLOCK_TYPE'] <>
''
668 && $this->arParams[
'LINK_IBLOCK_ID'] > 0
671 $linkElementIterator = \CIBlockElement::GetList(
672 array(
'SORT' =>
'ASC'),
674 'IBLOCK_ID' => $this->arParams[
'LINK_IBLOCK_ID'],
675 'IBLOCK_ACTIVE' =>
'Y',
676 'ACTIVE_DATE' =>
'Y',
678 'CHECK_PERMISSIONS' =>
'Y',
679 'IBLOCK_TYPE' => $this->arParams[
'LINK_IBLOCK_TYPE'],
680 'PROPERTY_'.$this->arParams[
'LINK_PROPERTY_SID'] => $element[
'ID'],
684 array(
'ID',
'IBLOCK_ID',
'NAME',
'DETAIL_PAGE_URL',
'IBLOCK_NAME')
686 while ($linkElement = $linkElementIterator->GetNext())
688 $element[
'LINKED_ELEMENTS'][] = $linkElement;
692 if (!$this->storage[
'SECTION'] && $element[
'IBLOCK_SECTION_ID'] > 0)
694 $sectionFilter =
array(
695 'ID' => $element[
'IBLOCK_SECTION_ID'],
696 'IBLOCK_ID' => $element[
'IBLOCK_ID'],
699 $sectionIterator = \CIBlockSection::GetList(
array(), $sectionFilter);
700 $sectionIterator->SetUrlTemplates(
'', $this->arParams[
'SECTION_URL']);
701 $this->storage[
'SECTION'] = $sectionIterator->GetNext();
702 unset($sectionIterator);
705 if (!empty($this->storage[
'SECTION']))
708 'SEARCHABLE_CONTENT',
'~SEARCHABLE_CONTENT',
709 'TIMESTAMP_X',
'~TIMESTAMP_X',
710 'DATE_CREATE',
'~DATE_CREATE',
712 foreach ($blackList as $fieldName)
714 if (array_key_exists($fieldName, $this->storage[
'SECTION']))
716 unset($this->storage[
'SECTION'][$fieldName]);
719 unset($fieldName, $blackList);
721 $this->storage[
'SECTION'][
'PATH'] =
array();
722 $pathIterator = \CIBlockSection::GetNavChain(
723 $element[
'IBLOCK_ID'],
724 $this->storage[
'SECTION'][
'ID'],
726 'ID',
'CODE',
'XML_ID',
'EXTERNAL_ID',
'IBLOCK_ID',
727 'IBLOCK_SECTION_ID',
'SORT',
'NAME',
'ACTIVE',
728 'DEPTH_LEVEL',
'SECTION_PAGE_URL'
731 $pathIterator->SetUrlTemplates(
'', $this->arParams[
'SECTION_URL']);
732 while (
$path = $pathIterator->GetNext())
734 if ($this->arParams[
"ADD_SECTIONS_CHAIN"])
737 $path[
'IPROPERTY_VALUES'] = $ipropValues->getValues();
740 $this->storage[
'SECTION'][
'PATH'][] =
$path;
742 unset(
$path, $pathIterator);
744 if ($this->arParams[
'SECTIONS_CHAIN_START_FROM'] > 0)
746 $this->storage[
'SECTION'][
'PATH'] = array_slice($this->storage[
'SECTION'][
'PATH'], $this->arParams[
'SECTIONS_CHAIN_START_FROM']);
749 $element[
'SECTION'] = $this->storage[
'SECTION'];
758 $uniqueSortHash =
array();
760 foreach ($offers as $offer)
762 $elementId = $offer[
'LINK_ELEMENT_ID'];
764 if (!isset($this->elementLinks[$elementId]))
767 if (!isset($uniqueSortHash[$elementId]))
769 $uniqueSortHash[$elementId] =
array();
772 $uniqueSortHash[$elementId][$offer[
'SORT_HASH']] =
true;
774 if ($this->elementLinks[$elementId][
'OFFER_ID_SELECTED'] == 0 && $offer[
'CAN_BUY'])
776 $this->elementLinks[$elementId][
'OFFER_ID_SELECTED'] = $offer[
'ID'];
779 unset($elementId, $offer);
781 foreach ($this->elementLinks as &$element)
783 if ($element[
'OFFER_ID_SELECTED'] == 0)
786 if (
count($uniqueSortHash[$element[
'ID']]) < 2)
788 $element[
'OFFER_ID_SELECTED'] = 0;
795 $resultCacheKeys =
array(
801 'CANONICAL_PAGE_URL',
806 'USE_CATALOG_BUTTONS'
812 $this->arParams[
'SET_TITLE']
813 || $this->arParams[
'ADD_ELEMENT_CHAIN']
814 || $this->arParams[
'SET_BROWSER_TITLE'] ===
'Y'
815 || $this->arParams[
'SET_META_KEYWORDS'] ===
'Y'
816 || $this->arParams[
'SET_META_DESCRIPTION'] ===
'Y'
819 $this->arResult[
'META_TAGS'] =
array();
820 $resultCacheKeys[] =
'META_TAGS';
822 $elementTitle = $this->arResult[
'NAME'];
824 isset($this->arResult[
'IPROPERTY_VALUES'][
'ELEMENT_PAGE_TITLE'])
825 && $this->arResult[
'IPROPERTY_VALUES'][
'ELEMENT_PAGE_TITLE'] !==
''
828 $elementTitle = $this->arResult[
'IPROPERTY_VALUES'][
'ELEMENT_PAGE_TITLE'];
830 if ($this->arParams[
'SET_TITLE'])
832 $this->arResult[
'META_TAGS'][
'TITLE'] = $elementTitle;
835 if ($this->arParams[
'ADD_ELEMENT_CHAIN'])
837 $this->arResult[
'META_TAGS'][
'ELEMENT_CHAIN'] = $elementTitle;
840 if ($this->arParams[
'SET_BROWSER_TITLE'] ===
'Y')
842 $browserTitle = Collection::firstNotEmpty(
843 $this->arResult[
'PROPERTIES'],
array($this->arParams[
'BROWSER_TITLE'],
'VALUE'),
844 $this->arResult, $this->arParams[
'BROWSER_TITLE'],
845 $this->arResult[
'IPROPERTY_VALUES'],
'ELEMENT_META_TITLE'
847 $this->arResult[
'META_TAGS'][
'BROWSER_TITLE'] = is_array($browserTitle)
848 ? implode(
' ', $browserTitle)
850 unset($browserTitle);
853 if ($this->arParams[
'SET_META_KEYWORDS'] ===
'Y')
855 $metaKeywords = Collection::firstNotEmpty(
856 $this->arResult[
'PROPERTIES'],
array($this->arParams[
'META_KEYWORDS'],
'VALUE'),
857 $this->arResult[
'IPROPERTY_VALUES'],
'ELEMENT_META_KEYWORDS'
859 $this->arResult[
'META_TAGS'][
'KEYWORDS'] = is_array($metaKeywords)
860 ? implode(
' ', $metaKeywords)
862 unset($metaKeywords);
865 if ($this->arParams[
'SET_META_DESCRIPTION'] ===
'Y')
867 $metaDescription = Collection::firstNotEmpty(
868 $this->arResult[
'PROPERTIES'],
array($this->arParams[
'META_DESCRIPTION'],
'VALUE'),
869 $this->arResult[
'IPROPERTY_VALUES'],
'ELEMENT_META_DESCRIPTION'
871 $this->arResult[
'META_TAGS'][
'DESCRIPTION'] = is_array($metaDescription)
872 ? implode(
' ', $metaDescription)
874 unset($metaDescription);
878 return $resultCacheKeys;
895 if (!
$USER->IsAuthorized())
902 || $this->arParams[
'SET_TITLE']
903 || isset(
$arResult[$this->arParams[
'BROWSER_TITLE']])
909 'add_element' => \CIBlock::GetArrayByID($this->arParams[
'IBLOCK_ID'],
'DETAIL_PAGE_URL'),
912 ?
$arResult[
'SECTION'][
'SECTION_PAGE_URL']
915 $buttonParams =
array(
916 'RETURN_URL' => $returnUrl,
920 if (isset(
$arResult[
'USE_CATALOG_BUTTONS']))
922 $buttonParams[
'USE_CATALOG_BUTTONS'] =
$arResult[
'USE_CATALOG_BUTTONS'];
923 if (!empty($buttonParams[
'USE_CATALOG_BUTTONS']))
925 $buttonParams[
'SHOW_CATALOG_BUTTONS'] =
true;
929 $buttons = \CIBlock::GetPanelButtons(
935 unset($buttonParams);
939 $this->addIncludeAreaIcons(\CIBlock::GetComponentMenu(
$APPLICATION->GetPublicShowMode(), $buttons));
942 if ($this->arParams[
'SET_TITLE'] || isset(
$arResult[$this->arParams[
'BROWSER_TITLE']]))
944 $this->storage[
'TITLE_OPTIONS'] =
null;
945 if (isset($buttons[
'submenu'][
'edit_element']))
947 $this->storage[
'TITLE_OPTIONS'] = [
948 'ADMIN_EDIT_LINK' => $buttons[
'submenu'][
'edit_element'][
'ACTION'],
949 'PUBLIC_EDIT_LINK' => $buttons[
'edit'][
'edit_element'][
'ACTION'],
950 'COMPONENT_NAME' => $this->getName(),
962 \CIBlockElement::CounterInc($this->arResult[
'ID']);
975 if ($this->arParams[
'SET_CANONICAL_URL'] ===
'Y' &&
$arResult[
"CANONICAL_PAGE_URL"])
978 if ($this->arParams[
'SET_TITLE'])
983 if ($this->arParams[
'SET_BROWSER_TITLE'] ===
'Y')
985 if (
$arResult[
"META_TAGS"][
"BROWSER_TITLE"] !==
'')
987 $APPLICATION->SetPageProperty(
"title",
$arResult[
"META_TAGS"][
"BROWSER_TITLE"], $this->storage[
'TITLE_OPTIONS']);
991 if ($this->arParams[
'SET_META_KEYWORDS'] ===
'Y')
993 if (
$arResult[
"META_TAGS"][
"KEYWORDS"] !==
'')
995 $APPLICATION->SetPageProperty(
"keywords",
$arResult[
"META_TAGS"][
"KEYWORDS"], $this->storage[
'TITLE_OPTIONS']);
999 if ($this->arParams[
'SET_META_DESCRIPTION'] ===
'Y')
1001 if (
$arResult[
"META_TAGS"][
"DESCRIPTION"] !==
'')
1003 $APPLICATION->SetPageProperty(
"description",
$arResult[
"META_TAGS"][
"DESCRIPTION"], $this->storage[
'TITLE_OPTIONS']);
1007 if (!empty(
$arResult[
'BACKGROUND_IMAGE']) && is_array(
$arResult[
'BACKGROUND_IMAGE']))
1015 if ($this->arParams['ADD_SECTIONS_CHAIN'] && !empty($arResult['SECTION']['PATH']) && is_array($arResult['SECTION']['PATH']))
1017 foreach ($arResult['SECTION']['PATH'] as $path)
1019 if (isset($path['IPROPERTY_VALUES']['SECTION_PAGE_TITLE']) && $path['IPROPERTY_VALUES']['SECTION_PAGE_TITLE'] !== '')
1021 $APPLICATION->AddChainItem($path['IPROPERTY_VALUES']['SECTION_PAGE_TITLE'], $path['~SECTION_PAGE_URL']);
1025 $APPLICATION->AddChainItem($path['NAME'], $path['~SECTION_PAGE_URL']);
1030 if ($this->arParams['ADD_ELEMENT_CHAIN'])
1032 $APPLICATION->AddChainItem($arResult["META_TAGS
"]["ELEMENT_CHAIN
"]);
1035 if ($this->arParams['SET_LAST_MODIFIED'] && $arResult['TIMESTAMP_X'])
1037 Main\Context::getCurrent()->getResponse()->setLastModified(DateTime::createFromUserTime($arResult["TIMESTAMP_X
"]));
1041 protected function getAdditionalCacheId()
1044 $this->productIdMap,
1045 $this->arParams['CACHE_GROUPS'] === 'N' ? false : $this->getUserGroupsCacheId()
1049 protected function getComponentCachePath()
1054 protected function makeOutputResult()
1056 parent::makeOutputResult();
1057 $this->arResult['CAT_PRICES'] = $this->storage['PRICES'];
1058 $this->arResult = array_merge($this->arResult, $this->elements[0]);
1061 protected function prepareTemplateParams()
1063 parent::prepareTemplateParams();
1064 $params =& $this->arParams;
1066 $params['DISPLAY_NAME'] = $params['DISPLAY_NAME'] === 'N' ? 'N' : 'Y';
1067 $params['USE_RATIO_IN_RANGES'] = $params['USE_RATIO_IN_RANGES'] === 'N' ? 'N' : 'Y';
1069 if (!isset($params['IMAGE_RESOLUTION']))
1071 $params['IMAGE_RESOLUTION'] = '16by9';
1074 if (!is_array($params['DETAIL_PICTURE_MODE']))
1076 $params['DETAIL_PICTURE_MODE'] = array($params['DETAIL_PICTURE_MODE']);
1079 $params['ADD_DETAIL_TO_SLIDER'] = $params['ADD_DETAIL_TO_SLIDER'] === 'Y' ? 'Y' : 'N';
1080 $displayPreviewTextMode = array('H' => true, 'E' => true, 'S' => true);
1081 if (!isset($displayPreviewTextMode[$params['DISPLAY_PREVIEW_TEXT_MODE']]))
1083 $params['DISPLAY_PREVIEW_TEXT_MODE'] = 'E';
1086 if (!is_array($params['ADD_TO_BASKET_ACTION']))
1088 $params['ADD_TO_BASKET_ACTION'] = array($params['ADD_TO_BASKET_ACTION']);
1091 $params['ADD_TO_BASKET_ACTION'] = array_filter($params['ADD_TO_BASKET_ACTION'], 'CIBlockParameters::checkParamValues');
1092 if (empty($params['ADD_TO_BASKET_ACTION']) || (!in_array('ADD', $params['ADD_TO_BASKET_ACTION']) && !in_array('BUY', $params['ADD_TO_BASKET_ACTION'])))
1094 $params['ADD_TO_BASKET_ACTION'] = array('BUY');
1097 if (!isset($params['ADD_TO_BASKET_ACTION_PRIMARY']) || !is_array($params['ADD_TO_BASKET_ACTION_PRIMARY']))
1099 $params['ADD_TO_BASKET_ACTION_PRIMARY'] = array('BUY', 'ADD');
1102 $params['USE_VOTE_RATING'] = $params['USE_VOTE_RATING'] === 'Y' ? 'Y' : 'N';
1104 if ($params['VOTE_DISPLAY_AS_RATING'] != 'vote_avg')
1106 $params['VOTE_DISPLAY_AS_RATING'] = 'rating';
1109 $params['USE_COMMENTS'] = $params['USE_COMMENTS'] === 'Y' ? 'Y' : 'N';
1110 $params['BLOG_USE'] = $params['BLOG_USE'] === 'Y' ? 'Y' : 'N';
1111 $params['VK_USE'] = $params['VK_USE'] === 'Y' && !empty($params['VK_API_ID']) ? 'Y' : 'N';
1112 $params['FB_USE'] = $params['FB_USE'] === 'Y' && !empty($params['FB_APP_ID']) ? 'Y' : 'N';
1114 if ($params['USE_COMMENTS'] === 'Y')
1116 if ($params['BLOG_USE'] === 'N' && $params['VK_USE'] === 'N' && $params['FB_USE'] === 'N')
1118 $params['USE_COMMENTS'] = 'N';
1122 $params['BRAND_USE'] = $params['BRAND_USE'] === 'Y' ? 'Y' : 'N';
1124 if ($params['BRAND_PROP_CODE'] == '')
1126 $params['BRAND_PROP_CODE'] = array();
1129 if (!is_array($params['BRAND_PROP_CODE']))
1131 $params['BRAND_PROP_CODE'] = array($params['BRAND_PROP_CODE']);
1134 if (empty($params['PRODUCT_INFO_BLOCK_ORDER']))
1136 $params['PRODUCT_INFO_BLOCK_ORDER'] = 'sku,props,priceRanges';
1139 if (is_string($params['PRODUCT_INFO_BLOCK_ORDER']))
1141 $params['PRODUCT_INFO_BLOCK_ORDER'] = explode(',', $params['PRODUCT_INFO_BLOCK_ORDER']);
1144 if (empty($params['PRODUCT_PAY_BLOCK_ORDER']))
1146 $params['PRODUCT_PAY_BLOCK_ORDER'] = 'rating,price,quantityLimit,quantity,buttons';
1149 if (is_string($params['PRODUCT_PAY_BLOCK_ORDER']))
1151 $params['PRODUCT_PAY_BLOCK_ORDER'] = explode(',', $params['PRODUCT_PAY_BLOCK_ORDER']);
1154 $this->getTemplateIblockParams($params);
1157 protected function getTemplateIblockParams(&$params)
1159 $params['ADD_PICT_PROP'] = isset($params['ADD_PICT_PROP']) ? trim($params['ADD_PICT_PROP']) : '';
1160 if ($params['ADD_PICT_PROP'] === '-')
1162 $params['ADD_PICT_PROP'] = '';
1165 if (!isset($params['LABEL_PROP']) || !is_array($params['LABEL_PROP']))
1167 $params['LABEL_PROP'] = array();
1170 if (!isset($params['LABEL_PROP_MOBILE']) || !is_array($params['LABEL_PROP_MOBILE']))
1172 $params['LABEL_PROP_MOBILE'] = array();
1175 if (!empty($params['LABEL_PROP_MOBILE']))
1177 $params['LABEL_PROP_MOBILE'] = array_flip($params['LABEL_PROP_MOBILE']);
1179 $params['ENLARGE_PROP'] = isset($params['ENLARGE_PROP']) ? trim($params['ENLARGE_PROP']) : '';
1180 if ($params['ENLARGE_PROP'] === '-')
1182 $params['ENLARGE_PROP'] = '';
1185 $params['OFFER_ADD_PICT_PROP'] = isset($params['OFFER_ADD_PICT_PROP']) ? trim($params['OFFER_ADD_PICT_PROP']) : '';
1186 if ($params['OFFER_ADD_PICT_PROP'] === '-')
1188 $params['OFFER_ADD_PICT_PROP'] = '';
1191 if (!isset($params['MAIN_BLOCK_PROPERTY_CODE']) || !is_array($params['MAIN_BLOCK_PROPERTY_CODE']))
1193 $params['MAIN_BLOCK_PROPERTY_CODE'] = array();
1196 if (!empty($params['MAIN_BLOCK_PROPERTY_CODE']))
1198 $params['MAIN_BLOCK_PROPERTY_CODE'] = array_flip($params['MAIN_BLOCK_PROPERTY_CODE']);
1201 if (!isset($params['MAIN_BLOCK_OFFERS_PROPERTY_CODE']) || !is_array($params['MAIN_BLOCK_OFFERS_PROPERTY_CODE']))
1203 $params['MAIN_BLOCK_OFFERS_PROPERTY_CODE'] = array();
1206 if (!empty($params['MAIN_BLOCK_OFFERS_PROPERTY_CODE']))
1208 $params['MAIN_BLOCK_OFFERS_PROPERTY_CODE'] = array_flip($params['MAIN_BLOCK_OFFERS_PROPERTY_CODE']);
1211 if (!isset($this->storage['IBLOCK_PARAMS'][$params['IBLOCK_ID']]) || !is_array($this->storage['IBLOCK_PARAMS'][$params['IBLOCK_ID']]))
1213 $this->storage['IBLOCK_PARAMS'][$params['IBLOCK_ID']] = array();
1216 $this->storage['IBLOCK_PARAMS'][$params['IBLOCK_ID']]['ADD_PICT_PROP'] = $params['ADD_PICT_PROP'];
1217 $this->storage['IBLOCK_PARAMS'][$params['IBLOCK_ID']]['LABEL_PROP'] = $params['LABEL_PROP'];
1218 $this->storage['IBLOCK_PARAMS'][$params['IBLOCK_ID']]['LABEL_PROP_MOBILE'] = $params['LABEL_PROP_MOBILE'];
1219 $this->storage['IBLOCK_PARAMS'][$params['IBLOCK_ID']]['ENLARGE_PROP'] = $params['ENLARGE_PROP'];
1220 $this->storage['IBLOCK_PARAMS'][$params['IBLOCK_ID']]['OFFERS_ADD_PICT_PROP'] = $params['OFFER_ADD_PICT_PROP'];
1221 $this->storage['IBLOCK_PARAMS'][$params['IBLOCK_ID']]['MAIN_BLOCK_PROPERTY_CODE'] = $params['MAIN_BLOCK_PROPERTY_CODE'];
1222 $this->storage['IBLOCK_PARAMS'][$params['IBLOCK_ID']]['MAIN_BLOCK_OFFERS_PROPERTY_CODE'] = $params['MAIN_BLOCK_OFFERS_PROPERTY_CODE'];
1224 unset($skuTreeProperties);
1227 protected function getTemplateDefaultParams()
1229 $defaultParams = parent::getTemplateDefaultParams();
1230 $defaultParams['DISPLAY_NAME'] = 'Y';
1231 $defaultParams['USE_RATIO_IN_RANGES'] = 'Y';
1232 $defaultParams['IMAGE_RESOLUTION'] = '16by9';
1233 $defaultParams['DETAIL_PICTURE_MODE'] = array('POPUP', 'MAGNIFIER');
1234 $defaultParams['ADD_DETAIL_TO_SLIDER'] = 'N';
1235 $defaultParams['DISPLAY_PREVIEW_TEXT_MODE'] = 'E';
1236 $defaultParams['ADD_TO_BASKET_ACTION'] = array('BUY');
1237 $defaultParams['ADD_TO_BASKET_ACTION_PRIMARY'] = array('BUY', 'ADD');
1238 $defaultParams['USE_VOTE_RATING'] = 'N';
1239 $defaultParams['VOTE_DISPLAY_AS_RATING'] = 'rating';
1240 $defaultParams['USE_COMMENTS'] = 'N';
1241 $defaultParams['BLOG_USE'] = 'N';
1242 $defaultParams['BLOG_URL'] = 'catalog_comments';
1243 $defaultParams['BLOG_EMAIL_NOTIFY'] = 'N';
1244 $defaultParams['VK_USE'] = 'N';
1245 $defaultParams['VK_API_ID'] = '';
1246 $defaultParams['FB_USE'] = 'N';
1247 $defaultParams['FB_APP_ID'] = '';
1248 $defaultParams['BRAND_USE'] = 'N';
1249 $defaultParams['BRAND_PROP_CODE'] = '';
1251 return $defaultParams;
1254 protected function editTemplateData()
1256 $this->arResult['DEFAULT_PICTURE'] = $this->getTemplateEmptyPreview();
1257 $this->arResult['SKU_PROPS'] = $this->getTemplateSkuPropList();
1258 $this->arResult['CURRENCIES'] = $this->getTemplateCurrencies();
1259 $this->editTemplateItems($this->arResult);
1262 protected function editTemplateOfferProps(&$item)
1265 $newOffers = array();
1267 $item['OFFER_GROUP'] = false;
1268 $item['OFFERS_PROP'] = false;
1270 $iblockParams = $this->storage['IBLOCK_PARAMS'][$item['IBLOCK_ID']];
1272 $boolSkuDisplayProps = false;
1273 $skuPropList = $this->arResult['SKU_PROPS'];
1274 $skuPropIds = array_keys($skuPropList);
1275 $matrixFields = array_fill_keys($skuPropIds, false);
1277 foreach ($item['OFFERS'] as $keyOffer => $offer)
1279 $offer['ID'] = (int)$offer['ID'];
1281 if (isset($double[$offer['ID']]))
1284 $offer['OFFER_GROUP'] = false;
1287 foreach ($skuPropIds as $code)
1289 $row[$code] = $this->getTemplatePropCell($code, $offer, $matrixFields, $skuPropList);
1292 $matrix[$keyOffer] = $row;
1294 \CIBlockPriceTools::setRatioMinPrice($offer, false);
1295 $this->editTemplateOfferSlider($offer, $item['IBLOCK_ID'], 0, $this->arParams['ADD_DETAIL_TO_SLIDER'] === 'Y', $item['MORE_PHOTO']);
1297 if (\CIBlockPriceTools::clearProperties($offer['DISPLAY_PROPERTIES'], $iblockParams['OFFERS_TREE_PROPS']))
1299 $boolSkuDisplayProps = true;
1301 $offer['TREE'] = [];
1303 $double[$offer['ID']] = true;
1304 $newOffers[$keyOffer] = $offer;
1307 $item['OFFERS'] = $newOffers;
1308 $item['SHOW_OFFERS_PROPS'] = $boolSkuDisplayProps;
1310 $usedFields = array();
1311 $sortFields = array();
1313 foreach ($skuPropIds as $propCode)
1315 $boolExist = $matrixFields[$propCode];
1316 foreach ($matrix as $keyOffer => $row)
1320 $item['OFFERS'][$keyOffer]['TREE']['PROP_'.$skuPropList[$propCode]['ID']] = $matrix[$keyOffer][$propCode]['VALUE'];
1321 $item['OFFERS'][$keyOffer]['SKU_SORT_'.$propCode] = $matrix[$keyOffer][$propCode]['SORT'];
1322 $usedFields[$propCode] = true;
1323 $sortFields['SKU_SORT_'.$propCode] = SORT_NUMERIC;
1327 unset($matrix[$keyOffer][$propCode]);
1332 $item['OFFERS_PROP'] = $usedFields;
1333 $item['OFFERS_PROP_CODES'] = (!empty($usedFields) ? base64_encode(serialize(array_keys($usedFields))) : '');
1335 Collection::sortByColumn($item['OFFERS'], $sortFields);
1338 protected function editTemplateProductSets(&$item)
1341 if (!Catalog\Config\Feature::isProductSetsEnabled())
1343 if (!isset($item['PRODUCT']['TYPE']))
1346 $parentBundle = ($item['PRODUCT']['BUNDLE'] == 'Y');
1348 $result[$item['ID']] = true;
1349 if ($item['PRODUCT']['TYPE'] == Catalog\ProductTable::TYPE_SKU)
1351 foreach ($item['OFFERS'] as $offer)
1355 || ($offer['PRODUCT']['BUNDLE'] == 'Y')
1358 $result[$offer['ID']] = true;
1363 unset($parentBundle);
1365 $item['OFFER_GROUP'] = !empty($result);
1366 if (!empty($result))
1367 $item['OFFER_GROUP_VALUES'] = array_keys($result);
1372 protected function editTemplateJsOffers(&$item, $offerSet)
1377 $offerText = $this->arParams['SHOW_SKU_DESCRIPTION'] === 'Y';
1379 foreach ($item['OFFERS'] as $keyOffer => $offer)
1381 if ($item['OFFER_ID_SELECTED'] > 0)
1383 $foundOffer = ($item['OFFER_ID_SELECTED'] == $offer['ID']);
1387 $foundOffer = $offer['CAN_BUY'];
1390 if ($foundOffer && $intSelected == -1)
1392 $intSelected = $keyOffer;
1397 if (!empty($offer['DISPLAY_PROPERTIES']))
1400 foreach ($offer['DISPLAY_PROPERTIES'] as $oneProp)
1402 if ($oneProp['PROPERTY_TYPE'] === Iblock\PropertyTable::TYPE_FILE)
1408 'CODE' => $oneProp['CODE'],
1409 'NAME' => $oneProp['NAME'],
1410 'VALUE' => $oneProp['DISPLAY_VALUE'],
1416 if (isset($offerSet[$offer['ID']]))
1418 $offer['OFFER_GROUP'] = true;
1419 $item['OFFERS'][$keyOffer]['OFFER_GROUP'] = true;
1422 $ratioSelectedIndex = $offer['ITEM_MEASURE_RATIO_SELECTED'];
1423 $firstPhoto = reset($offer['MORE_PHOTO']);
1425 'ID' => $offer['ID'],
1426 'CODE' => $offer['CODE'],
1427 'NAME' => $offer['~NAME'] ?? $item['~NAME'],
1428 'TREE' => $offer['TREE'],
1429 'DISPLAY_PROPERTIES' => $skuProps,
1430 'PREVIEW_TEXT' => $offerText ? $offer['PREVIEW_TEXT'] : '',
1431 'PREVIEW_TEXT_TYPE' => $offerText ? $offer['PREVIEW_TEXT_TYPE'] : '',
1432 'DETAIL_TEXT' => $offerText ? $offer['DETAIL_TEXT'] : '',
1433 'DETAIL_TEXT_TYPE' => $offerText ? $offer['DETAIL_TEXT_TYPE'] : '',
1434 'ITEM_PRICE_MODE' => $offer['ITEM_PRICE_MODE'],
1435 'ITEM_PRICES' => $offer['ITEM_PRICES'],
1436 'ITEM_PRICE_SELECTED' => $offer['ITEM_PRICE_SELECTED'],
1437 'ITEM_QUANTITY_RANGES' => $offer['ITEM_QUANTITY_RANGES'],
1438 'ITEM_QUANTITY_RANGE_SELECTED' => $offer['ITEM_QUANTITY_RANGE_SELECTED'],
1439 'ITEM_MEASURE_RATIOS' => $offer['ITEM_MEASURE_RATIOS'],
1440 'ITEM_MEASURE_RATIO_SELECTED' => $ratioSelectedIndex,
1441 'PREVIEW_PICTURE' => $firstPhoto,
1442 'DETAIL_PICTURE' => $firstPhoto,
1443 'CHECK_QUANTITY' => $offer['CHECK_QUANTITY'],
1444 'MAX_QUANTITY' => $offer['PRODUCT']['QUANTITY'],
1445 'STEP_QUANTITY' => $offer['ITEM_MEASURE_RATIOS'][$ratioSelectedIndex]['RATIO'], // deprecated
1446 'QUANTITY_FLOAT' => is_float($offer['ITEM_MEASURE_RATIOS'][$ratioSelectedIndex]['RATIO']), // deprecated
1447 'MEASURE' => $offer['ITEM_MEASURE']['TITLE'],
1448 'OFFER_GROUP' => (isset($offerSet[$offer['ID']]) && $offerSet[$offer['ID']]),
1449 'CAN_BUY' => $offer['CAN_BUY'],
1450 'CATALOG_SUBSCRIBE' => $offer['PRODUCT']['SUBSCRIBE'],
1451 'SLIDER' => $offer['MORE_PHOTO'],
1452 'SLIDER_COUNT' => $offer['MORE_PHOTO_COUNT'],
1454 unset($ratioSelectedIndex);
1456 $matrix[$keyOffer] = $oneRow;
1459 if ($intSelected == -1)
1464 $item['JS_OFFERS'] = $matrix;
1465 $item['OFFERS_SELECTED'] = $intSelected;
1467 if ($matrix[$intSelected]['SLIDER_COUNT'] > 0)
1469 $item['MORE_PHOTO'] = $matrix[$intSelected]['SLIDER'];
1470 $item['MORE_PHOTO_COUNT'] = $matrix[$intSelected]['SLIDER_COUNT'];
1473 $item['OFFERS_IBLOCK'] = $this->storage['SKU_IBLOCK_INFO']['IBLOCK_ID'];
1476 public function getTemplateSkuPropList()
1478 $skuPropList = array();
1480 if ($this->arResult['MODULES']['catalog'] && !empty($this->arParams['IBLOCK_ID']))
1482 $sku = \CCatalogSku::GetInfoByProductIBlock($this->arParams['IBLOCK_ID']);
1483 $iblockParams = $this->storage['IBLOCK_PARAMS'][$this->arParams['IBLOCK_ID']];
1484 $boolSku = !empty($sku) && is_array($sku);
1485 if ($boolSku && !empty($iblockParams['OFFERS_TREE_PROPS']) && $this->arParams['PRODUCT_DISPLAY_MODE'] === 'Y')
1487 $this->storage['SKU_IBLOCK_INFO'] = $sku;
1489 $skuPropList = \CIBlockPriceTools::getTreeProperties(
1491 $iblockParams['OFFERS_TREE_PROPS'],
1493 'PICT' => $this->arResult['DEFAULT_PICTURE'],
1498 if (empty($skuPropList))
1500 $this->arParams['PRODUCT_DISPLAY_MODE'] = 'N';
1505 return $skuPropList;
1508 protected function editTemplateItems(&$item)
1510 $skuPropList =& $this->arResult['SKU_PROPS'];
1512 if (!isset($item['CATALOG_QUANTITY']))
1514 $item['CATALOG_QUANTITY'] = 0;
1517 $item['CATALOG_QUANTITY'] = $item['CATALOG_QUANTITY'] > 0 && is_float($item['ITEM_MEASURE_RATIOS'][$item['ITEM_MEASURE_RATIO_SELECTED']]['RATIO'])
1518 ? (float)$item['CATALOG_QUANTITY']
1519 : (int)$item['CATALOG_QUANTITY'];
1521 $item['CATALOG'] = false;
1522 $item['CATALOG_SUBSCRIPTION'] = isset($item['CATALOG_SUBSCRIPTION']) && $item['CATALOG_SUBSCRIPTION'] === 'Y' ? 'Y' : 'N';
1524 \CIBlockPriceTools::getLabel($item, $this->arParams['LABEL_PROP']);
1525 $this->editTemplateProductSlider($item, $item['IBLOCK_ID'], 0, $this->arParams['ADD_DETAIL_TO_SLIDER'] === 'Y', array($this->arResult['DEFAULT_PICTURE']));
1526 $this->editTemplateCatalogInfo($item);
1528 $item['SHOW_OFFERS_PROPS'] = false;
1529 if ($item['CATALOG'] && !empty($item['OFFERS']))
1531 $needValues = array();
1533 foreach ($item['OFFERS'] as &$offer)
1535 foreach (array_keys($skuPropList) as $strOneCode)
1537 if (isset($offer['DISPLAY_PROPERTIES'][$strOneCode]))
1539 if (!isset($needValues[$skuPropList[$strOneCode]['ID']]))
1541 $needValues[$skuPropList[$strOneCode]['ID']] = array();
1544 $valueId = $skuPropList[$strOneCode]['PROPERTY_TYPE'] == Iblock\PropertyTable::TYPE_LIST
1545 ? $offer['DISPLAY_PROPERTIES'][$strOneCode]['VALUE_ENUM_ID']
1546 : $offer['DISPLAY_PROPERTIES'][$strOneCode]['VALUE'];
1548 $needValues[$skuPropList[$strOneCode]['ID']][$valueId] = $valueId;
1556 if (!empty($needValues))
1557 \CIBlockPriceTools::getTreePropertyValues($skuPropList, $needValues);
1559 $this->editTemplateOfferProps($item);
1560 $offerSet = $this->editTemplateProductSets($item);
1561 $this->editTemplateJsOffers($item, $offerSet);
1564 if ($item['MODULES']['catalog'] && $item['CATALOG'])
1567 $item['CATALOG_TYPE'] == Catalog\ProductTable::TYPE_PRODUCT
1568 || $item['CATALOG_TYPE'] == Catalog\ProductTable::TYPE_SET
1571 if (isset($item['MIN_PRICE']))
1573 \CIBlockPriceTools::setRatioMinPrice($item, false);
1574 $item['MIN_BASIS_PRICE'] = $item['MIN_PRICE'];
1579 Catalog\Config\Feature::isProductSetsEnabled()
1581 $item['CATALOG_TYPE'] == Catalog\ProductTable::TYPE_PRODUCT
1582 || $item['CATALOG_TYPE'] == Catalog\ProductTable::TYPE_SET
1586 $item['OFFER_GROUP'] = (isset($item['PRODUCT']['BUNDLE']) && $item['PRODUCT']['BUNDLE'] === 'Y');
1589 // fix warnings in templates for simple products
1590 $item['OFFERS_IBLOCK'] ??= ($this->storage['SKU_IBLOCK_INFO']['IBLOCK_ID'] ?? 0);
1591 $item['OFFERS_SELECTED'] ??= 0;
1595 if (!empty($item['DISPLAY_PROPERTIES']))
1597 foreach ($item['DISPLAY_PROPERTIES'] as $propKey => $displayProperty)
1599 if ($displayProperty['PROPERTY_TYPE'] === 'F')
1601 unset($item['DISPLAY_PROPERTIES'][$propKey]);
static setProductPropertiesCache($productId, $props)
onPrepareComponentParams($params)
getElementList($iblockId, $products)
checkProductIblock(array $product)
chooseOffer($offers, $iblockId)
initAdditionalCacheKeys(&$resultCacheKeys)
getIblockParams(&$params)
initIblockPropertyFeatures()
loadDisplayPropertyCodes($iblockId)
modifyDisplayProperties($iblock, &$iblockElements)
static getDetailPageShowProperties($iblockId, array $parameters=[])
static isEnabledFeatures()
static includeModule($moduleName)
static isEventEnabled(string $eventName)
static urnEncode($str, $charset=false)
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
if(! $catalogEdit->isSuccess()) $iblock
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
if(empty($signedUserToken)) $key
</p ></td >< td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 2.0pt 0cm 2.0pt;height:9.0pt'>< p class=Normal align=center style='margin:0cm;margin-bottom:.0001pt;text-align:center;line-height:normal'>< a name=ТекстовоеПоле54 ></a ><?=($taxRate > count( $arTaxList) > 0) ? $taxRate."%"
if($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']