PageRenderTime 53ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 0ms

/components/bitrix/catalog.section/templates/store_v3/template.php

https://gitlab.com/alexprowars/bitrix
PHP | 315 lines | 274 code | 23 blank | 18 comment | 16 complexity | e1e7b2f17537594cf303f1967d93c878 MD5 | raw file
  1. <?php
  2. use Bitrix\Main\Localization\Loc;
  3. if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true)
  4. {
  5. die();
  6. }
  7. /**
  8. * @global CMain $APPLICATION
  9. * @var array $arParams
  10. * @var array $arResult
  11. * @var CatalogSectionComponent $component
  12. * @var CBitrixComponentTemplate $this
  13. * @var string $templateName
  14. * @var string $componentPath
  15. *
  16. * _________________________________________________________________________
  17. * | Attention!
  18. * | The following comments are for system use
  19. * | and are required for the component to work correctly in ajax mode:
  20. * | <!-- items-container -->
  21. * | <!-- pagination-container -->
  22. * | <!-- component-end -->
  23. */
  24. $this->setFrameMode(true);
  25. $cyclicLoading = [
  26. 'mode' => $arParams['CYCLIC_LOADING'] === 'Y',
  27. 'counterName' => $arParams['CYCLIC_LOADING_COUNTER_NAME'],
  28. 'counter' => $arResult['ORIGINAL_PARAMETERS']['CYCLIC_COUNT']
  29. ];
  30. if (!empty($arResult['NAV_RESULT']))
  31. {
  32. $navParams = [
  33. 'NavPageCount' => $arResult['NAV_RESULT']->NavPageCount,
  34. 'NavPageNomer' => $arResult['NAV_RESULT']->NavPageNomer,
  35. 'NavNum' => $arResult['NAV_RESULT']->NavNum,
  36. ];
  37. if ($arParams['SECTIONS_OFFSET_MODE'] === 'F')
  38. {
  39. if ($navParams['NavPageNomer'] > 0 && $navParams['NavPageCount'] > 0)
  40. {
  41. $arParams['SECTIONS_OFFSET_VALUE'] = (($navParams['NavPageNomer'] - 1) * 100) / $navParams['NavPageCount'];
  42. }
  43. else
  44. {
  45. $arParams['SECTIONS_OFFSET_VALUE'] = 0;
  46. }
  47. }
  48. if ($arParams['CYCLIC_LOADING'] === 'Y')
  49. {
  50. if ($navParams['NavPageNomer'] >= $navParams['NavPageCount'])
  51. {
  52. $arResult['ORIGINAL_PARAMETERS']['CYCLIC_COUNT']++;
  53. }
  54. }
  55. }
  56. else
  57. {
  58. $navParams = [
  59. 'NavPageCount' => 1,
  60. 'NavPageNomer' => 1,
  61. 'NavNum' => $this->randString(),
  62. ];
  63. if ($arParams['SECTIONS_OFFSET_MODE'] === 'F')
  64. {
  65. $arParams['SECTIONS_OFFSET_VALUE'] = 0;
  66. }
  67. }
  68. $showTopPager = false;
  69. $showBottomPager = false;
  70. $showLazyLoad = false;
  71. if ($arParams['PAGE_ELEMENT_COUNT'] > 0 && $navParams['NavPageCount'] > 1)
  72. {
  73. $showTopPager = $arParams['DISPLAY_TOP_PAGER'];
  74. $showBottomPager = $arParams['DISPLAY_BOTTOM_PAGER'];
  75. $showLazyLoad = $arParams['LAZY_LOAD'] === 'Y' && $navParams['NavPageNomer'] != $navParams['NavPageCount'];
  76. }
  77. $templateLibrary = ['popup', 'ajax', 'fx', 'main.loader'];
  78. $currencyList = '';
  79. if (!empty($arResult['CURRENCIES']))
  80. {
  81. $templateLibrary[] = 'currency';
  82. $currencyList = CUtil::PhpToJSObject($arResult['CURRENCIES'], false, true, true);
  83. }
  84. $templateData = [
  85. 'TEMPLATE_LIBRARY' => $templateLibrary,
  86. 'CURRENCIES' => $currencyList,
  87. 'NAV_PARAMS' => $navParams
  88. ];
  89. unset($currencyList, $templateLibrary);
  90. $elementEdit = CIBlock::GetArrayByID($arParams['IBLOCK_ID'], 'ELEMENT_EDIT');
  91. $elementDelete = CIBlock::GetArrayByID($arParams['IBLOCK_ID'], 'ELEMENT_DELETE');
  92. $elementDeleteParams = ['CONFIRM' => GetMessage('CT_BCS_TPL_ELEMENT_DELETE_CONFIRM')];
  93. $positionClassMap = [
  94. 'left' => 'product-item-label-left',
  95. 'center' => 'product-item-label-center',
  96. 'right' => 'product-item-label-right',
  97. 'bottom' => 'product-item-label-bottom',
  98. 'middle' => 'product-item-label-middle',
  99. 'top' => 'product-item-label-top',
  100. ];
  101. $labelPositionClass = '';
  102. if (!empty($arParams['LABEL_PROP_POSITION']))
  103. {
  104. foreach (explode('-', $arParams['LABEL_PROP_POSITION']) as $pos)
  105. {
  106. $labelPositionClass .= isset($positionClassMap[$pos]) ? ' '.$positionClassMap[$pos] : '';
  107. }
  108. }
  109. $arParams['~MESS_BTN_BUY'] = $arParams['~MESS_BTN_BUY'] ?: Loc::getMessage('CT_BCS_TPL_MESS_BTN_BUY');
  110. $arParams['~MESS_BTN_DETAIL'] = $arParams['~MESS_BTN_DETAIL'] ?: Loc::getMessage('CT_BCS_TPL_MESS_BTN_DETAIL');
  111. $arParams['~MESS_BTN_COMPARE'] = $arParams['~MESS_BTN_COMPARE'] ?: Loc::getMessage('CT_BCS_TPL_MESS_BTN_COMPARE');
  112. $arParams['~MESS_BTN_SUBSCRIBE'] = $arParams['~MESS_BTN_SUBSCRIBE'] ?: Loc::getMessage('CT_BCS_TPL_MESS_BTN_SUBSCRIBE');
  113. $arParams['~MESS_BTN_ADD_TO_BASKET'] = $arParams['~MESS_BTN_ADD_TO_BASKET'] ?: Loc::getMessage('CT_BCS_TPL_MESS_BTN_ADD_TO_BASKET');
  114. $arParams['~MESS_NOT_AVAILABLE'] = $arParams['~MESS_NOT_AVAILABLE'] ?: Loc::getMessage('CT_BCS_TPL_MESS_PRODUCT_NOT_AVAILABLE');
  115. $arParams['~BTN_MESSAGE_CONTINUE_SHOPPING'] = $arParams['~BTN_MESSAGE_CONTINUE_SHOPPING'] ?: Loc::getMessage('CT_BCS_CATALOG_BTN_MESSAGE_CONTINUE_SHOPPING');
  116. $arParams['~BTN_MESSAGE_CREATE_ORDER'] = $arParams['~BTN_MESSAGE_CREATE_ORDER'] ?: Loc::getMessage('CT_BCS_CATALOG_BTN_MESSAGE_CREATE_ORDER');
  117. $arParams['~MESS_SHOW_MAX_QUANTITY'] = $arParams['~MESS_SHOW_MAX_QUANTITY'] ?: Loc::getMessage('CT_BCS_CATALOG_SHOW_MAX_QUANTITY');
  118. $arParams['~MESS_RELATIVE_QUANTITY_MANY'] = $arParams['~MESS_RELATIVE_QUANTITY_MANY'] ?: Loc::getMessage('CT_BCS_CATALOG_RELATIVE_QUANTITY_MANY');
  119. $arParams['MESS_RELATIVE_QUANTITY_MANY'] = $arParams['MESS_RELATIVE_QUANTITY_MANY'] ?: Loc::getMessage('CT_BCS_CATALOG_RELATIVE_QUANTITY_MANY');
  120. $arParams['~MESS_RELATIVE_QUANTITY_FEW'] = $arParams['~MESS_RELATIVE_QUANTITY_FEW'] ?: Loc::getMessage('CT_BCS_CATALOG_RELATIVE_QUANTITY_FEW');
  121. $arParams['MESS_RELATIVE_QUANTITY_FEW'] = $arParams['MESS_RELATIVE_QUANTITY_FEW'] ?: Loc::getMessage('CT_BCS_CATALOG_RELATIVE_QUANTITY_FEW');
  122. $arParams['MESS_BTN_LAZY_LOAD'] = $arParams['MESS_BTN_LAZY_LOAD'] ?: Loc::getMessage('CT_BCS_CATALOG_MESS_BTN_LAZY_LOAD');
  123. $generalParams = [
  124. 'PRODUCT_DISPLAY_MODE' => $arParams['PRODUCT_DISPLAY_MODE'],
  125. 'SHOW_MAX_QUANTITY' => $arParams['SHOW_MAX_QUANTITY'],
  126. 'RELATIVE_QUANTITY_FACTOR' => $arParams['RELATIVE_QUANTITY_FACTOR'],
  127. 'MESS_SHOW_MAX_QUANTITY' => $arParams['~MESS_SHOW_MAX_QUANTITY'],
  128. 'MESS_RELATIVE_QUANTITY_MANY' => $arParams['~MESS_RELATIVE_QUANTITY_MANY'],
  129. 'MESS_RELATIVE_QUANTITY_FEW' => $arParams['~MESS_RELATIVE_QUANTITY_FEW'],
  130. 'SHOW_OLD_PRICE' => $arParams['SHOW_OLD_PRICE'],
  131. 'USE_PRODUCT_QUANTITY' => $arParams['USE_PRODUCT_QUANTITY'],
  132. 'PRODUCT_QUANTITY_VARIABLE' => $arParams['PRODUCT_QUANTITY_VARIABLE'],
  133. 'ADD_TO_BASKET_ACTION' => $arParams['ADD_TO_BASKET_ACTION'],
  134. 'ADD_PROPERTIES_TO_BASKET' => $arParams['ADD_PROPERTIES_TO_BASKET'],
  135. 'PRODUCT_PROPS_VARIABLE' => $arParams['PRODUCT_PROPS_VARIABLE'],
  136. 'SHOW_CLOSE_POPUP' => $arParams['SHOW_CLOSE_POPUP'],
  137. 'DISPLAY_COMPARE' => $arParams['DISPLAY_COMPARE'],
  138. 'COMPARE_PATH' => $arParams['COMPARE_PATH'],
  139. 'COMPARE_NAME' => $arParams['COMPARE_NAME'],
  140. 'PRODUCT_SUBSCRIPTION' => $arParams['PRODUCT_SUBSCRIPTION'],
  141. 'PRODUCT_BLOCKS_ORDER' => $arParams['PRODUCT_BLOCKS_ORDER'],
  142. 'LABEL_POSITION_CLASS' => $labelPositionClass,
  143. '~BASKET_URL' => $arParams['~BASKET_URL'],
  144. '~ADD_URL_TEMPLATE' => $arResult['~ADD_URL_TEMPLATE'],
  145. '~BUY_URL_TEMPLATE' => $arResult['~BUY_URL_TEMPLATE'],
  146. '~COMPARE_URL_TEMPLATE' => $arResult['~COMPARE_URL_TEMPLATE'],
  147. '~COMPARE_DELETE_URL_TEMPLATE' => $arResult['~COMPARE_DELETE_URL_TEMPLATE'],
  148. 'TEMPLATE_THEME' => $arParams['TEMPLATE_THEME'],
  149. 'USE_ENHANCED_ECOMMERCE' => $arParams['USE_ENHANCED_ECOMMERCE'],
  150. 'DATA_LAYER_NAME' => $arParams['DATA_LAYER_NAME'],
  151. 'BRAND_PROPERTY' => $arParams['BRAND_PROPERTY'],
  152. 'MESS_BTN_BUY' => $arParams['~MESS_BTN_BUY'],
  153. 'MESS_BTN_DETAIL' => $arParams['~MESS_BTN_DETAIL'],
  154. 'MESS_BTN_COMPARE' => $arParams['~MESS_BTN_COMPARE'],
  155. 'MESS_BTN_SUBSCRIBE' => $arParams['~MESS_BTN_SUBSCRIBE'],
  156. 'MESS_BTN_ADD_TO_BASKET' => $arParams['~MESS_BTN_ADD_TO_BASKET'],
  157. 'BTN_MESSAGE_CONTINUE_SHOPPING' => $arParams['~BTN_MESSAGE_CONTINUE_SHOPPING'],
  158. 'BTN_MESSAGE_CREATE_ORDER' => $arParams['~BTN_MESSAGE_CREATE_ORDER'],
  159. 'MESS_NOT_AVAILABLE' => $arParams['~MESS_NOT_AVAILABLE'],
  160. 'USE_OFFER_NAME' => $arParams['USE_OFFER_NAME'],
  161. 'CUSTOM_SITE_ID' => $component->getSiteId(),
  162. ];
  163. $obName = 'ob'.preg_replace('/[^a-zA-Z0-9_]/', 'x', $this->GetEditAreaId($navParams['NavNum']));
  164. $containerName = 'container-'.$navParams['NavNum'];
  165. $themeClass = isset($arParams['TEMPLATE_THEME']) ? ' bx-'.$arParams['TEMPLATE_THEME'] : '';
  166. ?>
  167. <div class="catalog-section<?=$themeClass?> container-fluid" data-entity="<?=$containerName?>">
  168. <!-- items-container -->
  169. <div data-entity="items-row" class="row flex-wrap">
  170. <?php
  171. if (!empty($arResult['ITEMS']))
  172. {
  173. foreach ($arResult['ITEMS'] as $item)
  174. {
  175. $uniqueId = $item['ID'].'_'.md5($this->randString().$component->getAction()).$arResult['AREA_ID_ADDITIONAL_SALT'];
  176. $this->addEditAction($uniqueId, $item['EDIT_LINK'], $elementEdit);
  177. $this->addDeleteAction($uniqueId, $item['DELETE_LINK'], $elementDelete, $elementDeleteParams);
  178. ?><div class="catalog-section-item-wrapper col-12 col-sm-6 d-flex align-items-stretch"><?
  179. $APPLICATION->IncludeComponent(
  180. 'bitrix:catalog.item',
  181. 'store_v3',
  182. [
  183. 'RESULT' => [
  184. 'ITEM' => $item,
  185. 'AREA_ID' => $this->getEditAreaId($uniqueId),
  186. ],
  187. 'PARAMS' => $generalParams + [
  188. 'SKU_PROPS' => $arResult['SKU_PROPS'][$item['IBLOCK_ID']],
  189. ],
  190. ],
  191. $component,
  192. [
  193. 'HIDE_ICONS' => 'Y',
  194. ]
  195. );
  196. ?></div><?
  197. }
  198. $APPLICATION->IncludeComponent(
  199. 'bitrix:catalog.section.list',
  200. 'store_v3',
  201. [
  202. 'ADD_SECTIONS_CHAIN' => 'N',
  203. 'CACHE_FILTER' => $arParams['CACHE_FILTER'],
  204. 'CACHE_GROUPS' => $arParams['CACHE_GROUPS'],
  205. 'CACHE_TIME' => $arParams['CACHE_TIME'],
  206. 'CACHE_TYPE' => $arParams['CACHE_TYPE'],
  207. 'COUNT_ELEMENTS' => 'Y',
  208. 'COUNT_ELEMENTS_FILTER' => 'CNT_AVAILABLE', // it's no use
  209. 'FILTER_NAME' => $arParams['SECTIONS_FILTER_NAME'],
  210. 'IBLOCK_ID' => $arParams['IBLOCK_ID'],
  211. 'IBLOCK_TYPE' => $arParams['IBLOCK_TYPE'],
  212. 'SECTION_CODE' => $arParams['SECTIONS_SECTION_CODE'],
  213. 'SECTION_FIELDS' => array("",""),
  214. 'SECTION_ID' => $arParams['SECTIONS_SECTION_ID'],
  215. 'SECTION_URL' => $arParams['SECTION_URL'],
  216. 'SECTION_USER_FIELDS' => array("",""), // check and replace to $arParams['SECTION_USER_FIELDS']
  217. 'SHOW_TITLE' => 'N',
  218. 'TOP_DEPTH' => $arParams['SECTIONS_TOP_DEPTH'],
  219. 'OFFSET_MODE' => $arParams['SECTIONS_OFFSET_MODE'],
  220. 'OFFSET_VALUE' => $arParams['SECTIONS_OFFSET_VALUE'],
  221. 'OFFSET_VARIABLE' => $arParams['SECTIONS_OFFSET_VARIABLE'],
  222. 'AREA_ID' => $arResult['AREA_ID_ADDITIONAL_SALT']
  223. ],
  224. $component,
  225. [
  226. 'HIDE_ICONS' => 'Y',
  227. ]
  228. );
  229. }
  230. else
  231. {
  232. // load css for bigData/deferred load
  233. $APPLICATION->IncludeComponent(
  234. 'bitrix:catalog.item',
  235. 'store_v3',
  236. [],
  237. $component,
  238. [
  239. 'HIDE_ICONS' => 'Y',
  240. ]
  241. );
  242. }
  243. ?>
  244. </div>
  245. <!-- items-container -->
  246. </div>
  247. <?php
  248. $signer = new \Bitrix\Main\Security\Sign\Signer;
  249. $signedTemplate = $signer->sign($templateName, 'catalog.section');
  250. $signedParams = $signer->sign(base64_encode(serialize($arResult['ORIGINAL_PARAMETERS'])), 'catalog.section');
  251. $templateData['SIGNED_PARAMETERS'] = $signedParams;
  252. ?>
  253. <script>
  254. BX.message({
  255. BTN_MESSAGE_BASKET_REDIRECT: '<?=GetMessageJS('CT_BCS_CATALOG_BTN_MESSAGE_BASKET_REDIRECT')?>',
  256. BASKET_URL: '<?=$arParams['BASKET_URL']?>',
  257. ADD_TO_BASKET_OK: '<?=GetMessageJS('ADD_TO_BASKET_OK')?>',
  258. TITLE_ERROR: '<?=GetMessageJS('CT_BCS_CATALOG_TITLE_ERROR')?>',
  259. TITLE_BASKET_PROPS: '<?=GetMessageJS('CT_BCS_CATALOG_TITLE_BASKET_PROPS')?>',
  260. TITLE_SUCCESSFUL: '<?=GetMessageJS('ADD_TO_BASKET_OK')?>',
  261. BASKET_UNKNOWN_ERROR: '<?=GetMessageJS('CT_BCS_CATALOG_BASKET_UNKNOWN_ERROR')?>',
  262. BTN_MESSAGE_SEND_PROPS: '<?=GetMessageJS('CT_BCS_CATALOG_BTN_MESSAGE_SEND_PROPS')?>',
  263. BTN_MESSAGE_CLOSE: '<?=GetMessageJS('CT_BCS_CATALOG_BTN_MESSAGE_CLOSE')?>',
  264. BTN_MESSAGE_CLOSE_POPUP: '<?=GetMessageJS('CT_BCS_CATALOG_BTN_MESSAGE_CLOSE_POPUP')?>',
  265. COMPARE_MESSAGE_OK: '<?=GetMessageJS('CT_BCS_CATALOG_MESS_COMPARE_OK')?>',
  266. COMPARE_UNKNOWN_ERROR: '<?=GetMessageJS('CT_BCS_CATALOG_MESS_COMPARE_UNKNOWN_ERROR')?>',
  267. COMPARE_TITLE: '<?=GetMessageJS('CT_BCS_CATALOG_MESS_COMPARE_TITLE')?>',
  268. PRICE_TOTAL_PREFIX: '<?=GetMessageJS('CT_BCS_CATALOG_PRICE_TOTAL_PREFIX')?>',
  269. RELATIVE_QUANTITY_MANY: '<?=CUtil::JSEscape($arParams['MESS_RELATIVE_QUANTITY_MANY'])?>',
  270. RELATIVE_QUANTITY_FEW: '<?=CUtil::JSEscape($arParams['MESS_RELATIVE_QUANTITY_FEW'])?>',
  271. BTN_MESSAGE_COMPARE_REDIRECT: '<?=GetMessageJS('CT_BCS_CATALOG_BTN_MESSAGE_COMPARE_REDIRECT')?>',
  272. BTN_MESSAGE_LAZY_LOAD: '<?=CUtil::JSEscape($arParams['MESS_BTN_LAZY_LOAD'])?>',
  273. BTN_MESSAGE_LAZY_LOAD_WAITER: '<?=GetMessageJS('CT_BCS_CATALOG_BTN_MESSAGE_LAZY_LOAD_WAITER')?>',
  274. SITE_ID: '<?=CUtil::JSEscape($component->getSiteId())?>'
  275. });
  276. var <?=$obName?> = new JCCatalogSectionComponent({
  277. siteId: '<?=CUtil::JSEscape($component->getSiteId())?>',
  278. componentPath: '<?=CUtil::JSEscape($componentPath)?>',
  279. navParams: <?=CUtil::PhpToJSObject($navParams)?>,
  280. deferredLoad: <?=($arParams['DEFERRED_LOAD'] === 'Y') ? 'true' : 'false' ?>, // enable it for deferred load
  281. initiallyShowHeader: '<?=!empty($arResult['ITEM_ROWS'])?>',
  282. bigData: <?=CUtil::PhpToJSObject($arResult['BIG_DATA'])?>,
  283. lazyLoad: !!'<?=$showLazyLoad?>',
  284. loadOnScroll: <?=($arParams['LOAD_ON_SCROLL'] === 'Y') ? 'true' : 'false' ?>,
  285. cyclicLoading: <?=CUtil::PhpToJSObject($cyclicLoading, false, false, true) ?>,
  286. template: '<?=CUtil::JSEscape($signedTemplate)?>',
  287. ajaxId: '<?=CUtil::JSEscape($arParams['AJAX_ID'])?>',
  288. parameters: '<?=CUtil::JSEscape($signedParams)?>',
  289. container: '<?=$containerName?>'
  290. });
  291. </script>
  292. <!-- component-end -->