/components/bitrix/catalog.section.list/component.php
PHP | 516 lines | 451 code | 48 blank | 17 comment | 83 complexity | 7493f0a37171a5674d59cfaf59d80a22 MD5 | raw file
- <?php
- if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();
- /** @var CBitrixComponent $this */
- /** @var array $arParams */
- /** @var array $arResult */
- /** @var string $componentPath */
- /** @var string $componentName */
- /** @var string $componentTemplate */
- /** @global CDatabase $DB */
- /** @global CUser $USER */
- /** @global CMain $APPLICATION */
- use Bitrix\Main\Loader;
- use Bitrix\Main\Localization\Loc;
- use Bitrix\Iblock;
- /*************************************************************************
- Processing of received parameters
- *************************************************************************/
- if (!isset($arParams["CACHE_TIME"]))
- {
- $arParams["CACHE_TIME"] = 36000000;
- }
- $arParams["IBLOCK_TYPE"] = trim($arParams["IBLOCK_TYPE"] ?? '');
- $arParams["IBLOCK_ID"] = (int)($arParams["IBLOCK_ID"] ?? 0);
- $arParams["SECTION_ID"] = (int)($arParams["SECTION_ID"] ?? 0);
- $arParams["SECTION_CODE"] = trim($arParams["SECTION_CODE"] ?? '');
- $arParams["SECTION_URL"] = trim($arParams["SECTION_URL"] ?? '');
- $arParams["TOP_DEPTH"] = (int)($arParams["TOP_DEPTH"] ?? 0);
- if($arParams["TOP_DEPTH"] <= 0)
- {
- $arParams["TOP_DEPTH"] = 2;
- }
- $arParams["COUNT_ELEMENTS"] = !(isset($arParams["COUNT_ELEMENTS"]) && $arParams["COUNT_ELEMENTS"] === "N");
- if (!isset($arParams["COUNT_ELEMENTS_FILTER"]))
- {
- $arParams["COUNT_ELEMENTS_FILTER"] = "CNT_ACTIVE";
- }
- if (
- $arParams["COUNT_ELEMENTS_FILTER"] !== "CNT_ALL"
- && $arParams["COUNT_ELEMENTS_FILTER"] !== "CNT_ACTIVE"
- && $arParams["COUNT_ELEMENTS_FILTER"] !== "CNT_AVAILABLE"
- )
- {
- $arParams["COUNT_ELEMENTS_FILTER"] = "CNT_ALL";
- }
- $arParams["ADD_SECTIONS_CHAIN"] = !(isset($arParams["ADD_SECTIONS_CHAIN"]) && $arParams["ADD_SECTIONS_CHAIN"] === "N"); //Turn on by default
- if (
- empty($arParams["FILTER_NAME"])
- || !preg_match("/^[A-Za-z_][A-Za-z01-9_]*$/", $arParams["FILTER_NAME"])
- )
- {
- $arrFilter = array();
- }
- else
- {
- global ${$arParams["FILTER_NAME"]};
- $arrFilter = ${$arParams["FILTER_NAME"]};
- if(!is_array($arrFilter))
- {
- $arrFilter = [];
- }
- }
- $arParams["CACHE_FILTER"] = isset($arParams["CACHE_FILTER"]) && $arParams["CACHE_FILTER"] == "Y";
- if(!$arParams["CACHE_FILTER"] && !empty($arrFilter))
- {
- $arParams["CACHE_TIME"] = 0;
- }
- $arParams['SHOW_TITLE'] = ($arParams['SHOW_TITLE'] ?? 'N') === 'Y';
- $arResult["SECTIONS"] = array();
- /*************************************************************************
- Work with cache
- *************************************************************************/
- if ($this->startResultCache(
- false,
- array($arrFilter, ($arParams["CACHE_GROUPS"]==="N"? false: $USER->GetGroups()))
- ))
- {
- if (!Loader::includeModule("iblock"))
- {
- $this->abortResultCache();
- ShowError(Loc::getMessage("IBLOCK_MODULE_NOT_INSTALLED"));
- return;
- }
- $existIblock = Iblock\IblockSiteTable::getList(array(
- 'select' => array('IBLOCK_ID'),
- 'filter' => array(
- '=IBLOCK_ID' => $arParams['IBLOCK_ID'],
- '=SITE_ID' => SITE_ID,
- '=IBLOCK.ACTIVE' => 'Y',
- ),
- ))->fetch();
- if (empty($existIblock))
- {
- $this->abortResultCache();
- return;
- }
- $countTitleSuffix = '_ELEMENT';
- if (Loader::includeModule('catalog'))
- {
- $catalog = CCatalogSku::GetInfoByIBlock($arParams['IBLOCK_ID']);
- if (!empty($catalog))
- {
- $countTitleSuffix = '_PRODUCT';
- }
- }
- $arFilter = array(
- "ACTIVE" => "Y",
- "GLOBAL_ACTIVE" => "Y",
- "IBLOCK_ID" => $arParams["IBLOCK_ID"],
- );
- $arSelect = array();
- if (!empty($arParams["SECTION_FIELDS"]) && is_array($arParams["SECTION_FIELDS"]))
- {
- foreach($arParams["SECTION_FIELDS"] as &$field)
- {
- if (!empty($field) && is_string($field))
- {
- $arSelect[] = $field;
- }
- }
- unset($field);
- }
- if (!empty($arSelect))
- {
- $arSelect = array_merge(
- $arSelect,
- array(
- "ID",
- "NAME",
- "LEFT_MARGIN",
- "RIGHT_MARGIN",
- "DEPTH_LEVEL",
- "IBLOCK_ID",
- "IBLOCK_SECTION_ID",
- "LIST_PAGE_URL",
- "SECTION_PAGE_URL"
- )
- );
- }
- $boolPicture = empty($arSelect) || in_array('PICTURE', $arSelect);
- if (!empty($arParams["SECTION_USER_FIELDS"]) && is_array($arParams["SECTION_USER_FIELDS"]))
- {
- foreach($arParams["SECTION_USER_FIELDS"] as &$field)
- {
- if(is_string($field) && preg_match("/^UF_/", $field))
- {
- $arSelect[] = $field;
- }
- }
- unset($field);
- }
- $arSelect = array_unique($arSelect);
- $arResult["SECTION"] = false;
- $intSectionDepth = 0;
- if($arParams["SECTION_ID"]>0)
- {
- $arFilter["ID"] = $arParams["SECTION_ID"];
- $rsSections = CIBlockSection::GetList(array(), $arFilter, false, $arSelect);
- $rsSections->SetUrlTemplates("", $arParams["SECTION_URL"]);
- $arResult["SECTION"] = $rsSections->GetNext();
- }
- elseif ($arParams["SECTION_CODE"] !== '')
- {
- $arFilter["=CODE"] = $arParams["SECTION_CODE"];
- $rsSections = CIBlockSection::GetList(array(), $arFilter, false, $arSelect);
- $rsSections->SetUrlTemplates("", $arParams["SECTION_URL"]);
- $arResult["SECTION"] = $rsSections->GetNext();
- }
- if (is_array($arResult["SECTION"]))
- {
- $arResult["SECTION"]["~ELEMENT_CNT"] = null;
- $arResult["SECTION"]["ELEMENT_CNT"] = null;
- unset($arFilter["ID"]);
- unset($arFilter["=CODE"]);
- $arFilter["LEFT_MARGIN"] = $arResult["SECTION"]["LEFT_MARGIN"] + 1;
- $arFilter["RIGHT_MARGIN"] = $arResult["SECTION"]["RIGHT_MARGIN"];
- $arFilter["<="."DEPTH_LEVEL"] = $arResult["SECTION"]["DEPTH_LEVEL"] + $arParams["TOP_DEPTH"];
- $ipropValues = new \Bitrix\Iblock\InheritedProperty\SectionValues($arResult["SECTION"]["IBLOCK_ID"], $arResult["SECTION"]["ID"]);
- $arResult["SECTION"]["IPROPERTY_VALUES"] = $ipropValues->getValues();
- $arResult["SECTION"]["PATH"] = array();
- $rsPath = CIBlockSection::GetNavChain(
- $arResult["SECTION"]["IBLOCK_ID"],
- $arResult["SECTION"]["ID"],
- array(
- "ID", "CODE", "XML_ID", "EXTERNAL_ID", "IBLOCK_ID",
- "IBLOCK_SECTION_ID", "SORT", "NAME", "ACTIVE",
- "DEPTH_LEVEL", "SECTION_PAGE_URL"
- )
- );
- $rsPath->SetUrlTemplates("", $arParams["SECTION_URL"]);
- while($arPath = $rsPath->GetNext())
- {
- if ($arParams["ADD_SECTIONS_CHAIN"])
- {
- $ipropValues = new \Bitrix\Iblock\InheritedProperty\SectionValues($arParams["IBLOCK_ID"], $arPath["ID"]);
- $arPath["IPROPERTY_VALUES"] = $ipropValues->getValues();
- }
- $arResult["SECTION"]["PATH"][]=$arPath;
- }
- }
- else
- {
- $arResult["SECTION"] = array(
- "ID" => 0,
- "DEPTH_LEVEL" => 0,
- );
- $arFilter["<="."DEPTH_LEVEL"] = $arParams["TOP_DEPTH"];
- }
- $intSectionDepth = $arResult["SECTION"]['DEPTH_LEVEL'];
- $sectionFilter = array_merge($arrFilter, $arFilter);
- $elementCountFilter = array(
- "IBLOCK_ID" => $arParams["IBLOCK_ID"],
- "CHECK_PERMISSIONS" => "Y",
- "MIN_PERMISSION" => "R",
- "INCLUDE_SUBSECTIONS" => (isset($sectionFilter["ELEMENT_SUBSECTIONS"]) && $sectionFilter["ELEMENT_SUBSECTIONS"] == "N" ? "N" : "Y")
- );
- if (!empty($sectionFilter['PROPERTY']) && is_array($sectionFilter['PROPERTY']))
- {
- foreach (array_keys($sectionFilter['PROPERTY']) as $propertyId)
- {
- $field = CIBlock::MkOperationFilter($propertyId);
- $elementCountFilter[$field['PREFIX'].'PROPERTY_'.$field['FIELD']] = $sectionFilter['PROPERTY'][$propertyId];
- }
- unset($field, $propertyId, $value);
- }
- switch ($arParams["COUNT_ELEMENTS_FILTER"])
- {
- case "CNT_ALL":
- break;
- case "CNT_ACTIVE":
- $elementCountFilter["ACTIVE"] = "Y";
- $elementCountFilter["ACTIVE_DATE"] = "Y";
- break;
- case "CNT_AVAILABLE":
- $elementCountFilter["ACTIVE"] = "Y";
- $elementCountFilter["ACTIVE_DATE"] = "Y";
- $elementCountFilter["AVAILABLE"] = "Y";
- break;
- }
- if ($arParams["COUNT_ELEMENTS"] && $arResult['SECTION']['ID'] > 0)
- {
- $elementFilter = $elementCountFilter;
- $elementFilter['SECTION_ID'] = $arResult['SECTION']['ID'];
- if ($arResult['SECTION']['RIGHT_MARGIN'] == ($arResult['SECTION']['LEFT_MARGIN'] + 1))
- {
- $elementFilter['INCLUDE_SUBSECTIONS'] = 'N';
- }
- $arResult["SECTION"]["~ELEMENT_CNT"] = CIBlockElement::GetList(array(), $elementFilter, array());
- $arResult["SECTION"]["ELEMENT_CNT"] = $arResult["SECTION"]["~ELEMENT_CNT"];
- if (!empty($arResult["SECTION"]["ELEMENT_CNT"]))
- {
- $count = (int)$arResult["SECTION"]["ELEMENT_CNT"];
- $val = ($count < 100 ? $count : $count % 100);
- $dec = $val % 10;
- if ($val == 0)
- {
- $messageId = 'CP_BCSL_MESS_COUNT_ZERO';
- }
- elseif ($val == 1)
- {
- $messageId = 'CP_BCSL_MESS_COUNT_ONE';
- }
- elseif ($val >= 10 && $val <= 20)
- {
- $messageId = 'CP_BCSL_MESS_COUNT_TEN';
- }
- elseif ($dec == 1)
- {
- $messageId = 'CP_BCSL_MESS_COUNT_MOD_ONE';
- }
- elseif (2 <= $dec && $dec <= 4)
- {
- $messageId = 'CP_BCSL_MESS_COUNT_MOD_TWO';
- }
- else
- {
- $messageId = 'CP_BCSL_MESS_COUNT_OTHER';
- }
- $messageId .= $countTitleSuffix;
- $arResult["SECTION"]['ELEMENT_CNT_TITLE'] = Loc::getMessage($messageId, ['#VALUE#' => $count]);
- }
- }
- //ORDER BY
- $arSort = array();
- if (!empty($this->arParams['CUSTOM_SECTION_SORT']) && is_array($this->arParams['CUSTOM_SECTION_SORT']))
- {
- foreach ($this->arParams['CUSTOM_SECTION_SORT'] as $field => $value)
- {
- if (!is_string($value))
- {
- continue;
- }
- $field = strtoupper($field);
- if (isset($arSort[$field]))
- {
- continue;
- }
- if (!preg_match('/^(asc|desc|nulls)(,asc|,desc|,nulls)?$/i', $value))
- {
- continue;
- }
- $arSort[$field] = $value;
- }
- unset($field, $value);
- }
- if (empty($arSort))
- {
- $arSort = array(
- "LEFT_MARGIN" => "ASC",
- );
- }
- //EXECUTE
- $rsSections = CIBlockSection::GetList($arSort, $sectionFilter, false, $arSelect);
- $rsSections->SetUrlTemplates("", $arParams["SECTION_URL"]);
- while($arSection = $rsSections->GetNext())
- {
- \Bitrix\Iblock\InheritedProperty\SectionValues::queue($arSection["IBLOCK_ID"], $arSection["ID"]);
- $arSection['RELATIVE_DEPTH_LEVEL'] = $arSection['DEPTH_LEVEL'] - $intSectionDepth;
- $arButtons = CIBlock::GetPanelButtons(
- $arSection["IBLOCK_ID"],
- 0,
- $arSection["ID"],
- array("SESSID"=>false, "CATALOG"=>true)
- );
- $arSection["EDIT_LINK"] = $arButtons["edit"]["edit_section"]["ACTION_URL"];
- $arSection["DELETE_LINK"] = $arButtons["edit"]["delete_section"]["ACTION_URL"];
- $arSection["~ELEMENT_CNT"] = null;
- $arSection["ELEMENT_CNT"] = null;
- $arSection['ELEMENT_CNT_TITLE'] = '';
- $arResult["SECTIONS"][]=$arSection;
- }
- foreach ($arResult["SECTIONS"] as &$arSection)
- {
- $ipropValues = new \Bitrix\Iblock\InheritedProperty\SectionValues($arSection["IBLOCK_ID"], $arSection["ID"]);
- $arSection["IPROPERTY_VALUES"] = $ipropValues->getValues();
- if ($boolPicture)
- {
- \Bitrix\Iblock\Component\Tools::getFieldImageData(
- $arSection,
- array('PICTURE'),
- \Bitrix\Iblock\Component\Tools::IPROPERTY_ENTITY_SECTION,
- 'IPROPERTY_VALUES'
- );
- }
- if ($arParams["COUNT_ELEMENTS"])
- {
- $elementFilter = $elementCountFilter;
- $elementFilter["SECTION_ID"] = $arSection["ID"];
- if ($arSection['RIGHT_MARGIN'] == ($arSection['LEFT_MARGIN'] + 1))
- {
- $elementFilter['INCLUDE_SUBSECTIONS'] = 'N';
- }
- $arSection["~ELEMENT_CNT"] = CIBlockElement::GetList(array(), $elementFilter, array());
- $arSection["ELEMENT_CNT"] = $arSection["~ELEMENT_CNT"];
- if (!empty($arSection["ELEMENT_CNT"]))
- {
- $count = (int)$arSection["ELEMENT_CNT"];
- $val = ($count < 100 ? $count : $count % 100);
- $dec = $val % 10;
- if ($val == 0)
- {
- $messageId = 'CP_BCSL_MESS_COUNT_ZERO';
- }
- elseif ($val == 1)
- {
- $messageId = 'CP_BCSL_MESS_COUNT_ONE';
- }
- elseif ($val >= 10 && $val <= 20)
- {
- $messageId = 'CP_BCSL_MESS_COUNT_TEN';
- }
- elseif ($dec == 1)
- {
- $messageId = 'CP_BCSL_MESS_COUNT_MOD_ONE';
- }
- elseif (2 <= $dec && $dec <= 4)
- {
- $messageId = 'CP_BCSL_MESS_COUNT_MOD_TWO';
- }
- else
- {
- $messageId = 'CP_BCSL_MESS_COUNT_OTHER';
- }
- $messageId .= $countTitleSuffix;
- $arSection['ELEMENT_CNT_TITLE'] = Loc::getMessage($messageId, ['#VALUE#' => $count]);
- }
- }
- }
- unset($arSection);
- $arResult["SECTIONS_COUNT"] = count($arResult["SECTIONS"]);
- $this->setResultCacheKeys(array(
- "SECTIONS_COUNT",
- "SECTION",
- ));
- $this->includeComponentTemplate();
- }
- if ($arResult["SECTIONS_COUNT"] > 0 || isset($arResult["SECTION"]))
- {
- if(
- $USER->IsAuthorized()
- && $APPLICATION->GetShowIncludeAreas()
- && Loader::includeModule("iblock")
- )
- {
- $UrlDeleteSectionButton = "";
- if (isset($arResult["SECTION"]) && $arResult["SECTION"]['IBLOCK_SECTION_ID'] > 0)
- {
- $rsSection = CIBlockSection::GetList(
- array(),
- array("=ID" => $arResult["SECTION"]['IBLOCK_SECTION_ID']),
- false,
- array("SECTION_PAGE_URL")
- );
- $rsSection->SetUrlTemplates("", $arParams["SECTION_URL"]);
- $arSection = $rsSection->GetNext();
- $UrlDeleteSectionButton = $arSection["SECTION_PAGE_URL"];
- }
- if (empty($UrlDeleteSectionButton))
- {
- $url_template = CIBlock::GetArrayByID($arParams["IBLOCK_ID"], "LIST_PAGE_URL");
- $arIBlock = CIBlock::GetArrayByID($arParams["IBLOCK_ID"]);
- $arIBlock["IBLOCK_CODE"] = $arIBlock["CODE"];
- $UrlDeleteSectionButton = CIBlock::ReplaceDetailUrl($url_template, $arIBlock, true, false);
- }
- $arReturnUrl = array(
- "add_section" => (
- '' != $arParams["SECTION_URL"]?
- $arParams["SECTION_URL"]:
- CIBlock::GetArrayByID($arParams["IBLOCK_ID"], "SECTION_PAGE_URL")
- ),
- "add_element" => (
- '' != $arParams["SECTION_URL"]?
- $arParams["SECTION_URL"]:
- CIBlock::GetArrayByID($arParams["IBLOCK_ID"], "SECTION_PAGE_URL")
- ),
- "delete_section" => $UrlDeleteSectionButton,
- );
- $arButtons = CIBlock::GetPanelButtons(
- $arParams["IBLOCK_ID"],
- 0,
- $arResult["SECTION"]["ID"],
- array("RETURN_URL" => $arReturnUrl, "CATALOG"=>true)
- );
- $this->addIncludeAreaIcons(CIBlock::GetComponentMenu($APPLICATION->GetPublicShowMode(), $arButtons));
- }
- if($arParams["ADD_SECTIONS_CHAIN"] && isset($arResult["SECTION"]) && is_array($arResult["SECTION"]["PATH"]))
- {
- foreach($arResult["SECTION"]["PATH"] as $arPath)
- {
- if (
- isset($arPath["IPROPERTY_VALUES"]["SECTION_PAGE_TITLE"])
- && $arPath["IPROPERTY_VALUES"]["SECTION_PAGE_TITLE"] !== ""
- )
- {
- $APPLICATION->AddChainItem(
- $arPath["IPROPERTY_VALUES"]["SECTION_PAGE_TITLE"],
- $arPath["~SECTION_PAGE_URL"]
- );
- }
- else
- {
- $APPLICATION->AddChainItem(
- $arPath["NAME"],
- $arPath["~SECTION_PAGE_URL"]
- );
- }
- }
- }
- }