403Webshell
Server IP : 80.87.202.40  /  Your IP : 216.73.216.169
Web Server : Apache
System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64
User : bitrix ( 600)
PHP Version : 8.2.27
Disable Function : NONE
MySQL : OFF |  cURL : ON |  WGET : ON |  Perl : ON |  Python : OFF |  Sudo : ON |  Pkexec : ON
Directory :  /home/bitrix/ext_www/cvetdv.ru/bitrix/components/bitrix/catalog.catalog.controller/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/cvetdv.ru/bitrix/components/bitrix/catalog.catalog.controller/class.php
<?php

if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true)
{
	die();
}

use Bitrix\Catalog;
use Bitrix\Catalog\Access\AccessController;
use Bitrix\Catalog\Access\ActionDictionary;
use Bitrix\Catalog\Url\InventoryBuilder;
use Bitrix\Crm;
use Bitrix\Iblock;
use Bitrix\Main;
use Bitrix\Main\ErrorableImplementation;
use Bitrix\Main\Grid\Export\ExcelExporter;
use Bitrix\Main\Loader;
use Bitrix\Main\Localization\Loc;

class CatalogCatalogControllerComponent extends CBitrixComponent
{
	use ErrorableImplementation;

	private const PAGE_INDEX = 'index';
	private const PAGE_LIST = 'list';
	private const PAGE_SECTION_LIST = 'section_list';
	private const PAGE_SECTION_DETAIL = 'section_detail';
	private const PAGE_PRODUCT_DETAIL = 'product_detail';
	private const PAGE_ERROR = 'error';
	private const PAGE_TOOL_DISABLED = 'tool_disabled';

	private const DEFAULT_SEF_FOLDER = '/shop/documents-catalog/';

	/** @var  Main\ErrorCollection */
	protected $errorCollection;

	/** @var int */
	protected int $iblockId;
	/** @var string */
	protected string $iblockListMode;
	/** @var bool */
	protected bool $iblockListMixed;

	/** @var string */
	protected $pageId;

	/** @var Crm\Product\Url\ProductBuilder */
	protected $urlBuilder;

	private bool $isIframe = false;

	protected array $config = [];

	/**
	 * Base constructor.
	 * @param \CBitrixComponent|null $component		Component object if exists.
	 */
	public function __construct($component = null)
	{
		parent::__construct($component);
		$this->errorCollection = new Main\ErrorCollection();
	}

	/**
	 * @param $arParams
	 * @return array
	 */
	public function onPrepareComponentParams($arParams): array
	{
		if (!is_array($arParams))
		{
			$arParams = [];
		}

		$arParams['IBLOCK_ID'] = (int)($arParams['IBLOCK_ID'] ?? 0);
		$arParams['BUILDER_CONTEXT'] = (string)($arParams['BUILDER_CONTEXT'] ?? '');

		$arParams['SEF_MODE'] = 'Y';
		$arParams['SEF_FOLDER'] = (string)($arParams['SEF_FOLDER'] ?? self::DEFAULT_SEF_FOLDER);
		$arParams['SEF_URL_TEMPLATES'] = $arParams['SEF_URL_TEMPLATES'] ?? [];
		$arParams['VARIABLE_ALIASES'] = $arParams['VARIABLE_ALIASES'] ?? [];

		if (empty($arParams['PATH_TO']) || !is_array($arParams['PATH_TO']))
		{
			$arParams['PATH_TO'] = [];
		}

		return parent::onPrepareComponentParams($arParams);
	}

	/**
	 * @return void
	 */
	public function onIncludeComponentLang(): void
	{
		$this->includeComponentLang('class.php');
	}

	/**
	 * @return void
	 */
	protected function showErrors(): void
	{
		foreach ($this->getErrors() as $error)
		{
			\ShowError($error);
		}
		unset($error);
	}

	/**
	 * @param string $message
	 * @return void
	 */
	protected function addErrorMessage(string $message): void
	{
		$this->errorCollection->setError(new Main\Error($message));
	}

	public function isUiCatalog(): bool
	{
		return (isset($this->config['UI_CATALOG']) && $this->config['UI_CATALOG']);
	}

	public function executeComponent()
	{
		$this->checkModules();
		if ($this->hasErrors())
		{
			$this->showErrors();

			return;
		}
		if (!$this->checkInventoryManagementToolAvailability())
		{
			$this->includeComponentTemplate(self::PAGE_TOOL_DISABLED);

			return;
		}
		$this->checkAccess();
		if ($this->hasErrors())
		{
			$this->includeComponentTemplate(self::PAGE_ERROR);

			return;
		}
		$this->initConfig();
		if ($this->hasErrors())
		{
			$this->showErrors();

			return;
		}
		$this->initUrlBuilder();
		if ($this->hasErrors())
		{
			$this->showErrors();

			return;
		}
		$this->parseComponentVariables();
		if ($this->hasErrors())
		{
			$this->showErrors();

			return;
		}
		$this->initUiScope();
		$this->arResult['PAGE_DESCRIPTION'] = $this->getPageDescription();
		$this->arResult['IBLOCK_ID'] = $this->iblockId;
		$this->arResult['URL_BUILDER'] = $this->getUrlBuilder();

		$this->includeComponentTemplate($this->pageId);
	}

	protected function getUrlBuilder(): InventoryBuilder
	{
		return new InventoryBuilder();
	}

	protected function checkModules(): void
	{
		if (!Loader::includeModule('catalog'))
		{
			$this->addErrorMessage(Loc::getMessage('CATALOG_CATALOG_CONTROLLER_ERR_CATALOG_MODULE_ABSENT'));
		}
		if (!Loader::includeModule('iblock'))
		{
			$this->addErrorMessage(Loc::getMessage('CATALOG_CATALOG_CONTROLLER_ERR_IBLOCK_MODULE_ABSENT'));
		}
	}

	protected function checkInventoryManagementToolAvailability(): bool
	{
		return Catalog\Restriction\ToolAvailabilityManager::getInstance()->checkInventoryManagementAvailability();
	}

	protected function checkAccess(): void
	{
		if (!AccessController::getCurrent()->check(ActionDictionary::ACTION_CATALOG_READ))
		{
			$this->addErrorMessage(Loc::getMessage('CATALOG_CATALOG_CONTROLLER_ERR_ACCESS_DENIED'));
		}
	}

	protected function initConfig(): void
	{
		$iblockId = $this->arParams['IBLOCK_ID'];
		if ($iblockId <= 0)
		{
			$iblockId = null;
			if (Loader::includeModule('crm'))
			{
				$iblockId = Crm\Product\Catalog::getDefaultId();
			}
		}
		if ($iblockId === null)
		{
			$this->addErrorMessage(Loc::getMessage('CATALOG_CATALOG_CONTROLLER_ERR_CATALOG_PRODUCT_ABSENT'));

			return;
		}
		$iblock = Iblock\IblockTable::getRow([
			'select' => [
				'ID',
			],
			'filter' => [
				'=ID' => $iblockId,
			],
			'cache' => [
				'ttl' => 86400,
			],
		]);
		if ($iblock === null)
		{
			$this->addErrorMessage(Loc::getMessage('CATALOG_CATALOG_CONTROLLER_ERR_CATALOG_PRODUCT_ABSENT'));

			return;
		}
		$this->iblockId = $iblockId;
		$this->isIframe = $this->request->get('IFRAME') === 'Y' && $this->request->get('IFRAME_TYPE') === 'SIDE_SLIDER';
		$this->config['UI_CATALOG'] = Catalog\Config\State::isProductCardSliderEnabled();
	}

	protected function initUrlBuilder(): void
	{
		$builderId = $this->arParams['BUILDER_CONTEXT'];
		if ($builderId === '')
		{
			$builderId = Catalog\Url\ShopBuilder::TYPE_ID;
		}

		$builderManager = Iblock\Url\AdminPage\BuilderManager::getInstance();
		$this->urlBuilder = $builderManager->getBuilder($builderId);
		if ($this->urlBuilder === null)
		{
			$this->addErrorMessage(Loc::getMessage('CATALOG_CATALOG_CONTROLLER_ERR_URL_BUILDER_ABSENT'));
			return;
		}
		$this->urlBuilder->setIblockId($this->iblockId);
		$this->urlBuilder->setUrlParams([]);
		$this->iblockListMixed = $this->urlBuilder->isIblockListMixed();
		$this->iblockListMode =
			$this->iblockListMixed
				? Iblock\IblockTable::LIST_MODE_COMBINED
				: Iblock\IblockTable::LIST_MODE_SEPARATE
		;
	}

	protected function parseComponentVariables(): void
	{
		CBitrixComponent::includeComponentClass('bitrix:catalog.productcard.controller');

		$templateUrls = $this->getTemplateUrls();
		[$template, $variables, $variableAliases] = $this->processSefMode($templateUrls);

		if ($this->isUiCatalog())
		{
			if (\CatalogProductControllerComponent::hasUrlTemplateId($template))
			{
				$template = self::PAGE_PRODUCT_DETAIL;
			}
		}

		$this->arResult = array_merge(
			[
				'VARIABLES' => $variables,
				'ALIASES' => $variableAliases,
			],
			$this->arResult
		);

		$this->pageId = $template;
		if (empty($this->pageId))
		{
			$this->addErrorMessage(Loc::getMessage('CATALOG_CATALOG_CONTROLLER_ERR_PAGE_UNKNOWN'));
		}
		if ($this->pageId === self::PAGE_INDEX)
		{
			if (
				!$this->request->isPost()
				&& !$this->request->isAjaxRequest()
				&& (
					$this->request->getQuery('find_section_section') === null
					|| $this->request->getQuery('SECTION_ID') === null
					|| $this->request->getQuery('apply_filter') === null
				)
				&& $this->request->getQuery(ExcelExporter::REQUEST_PARAM_NAME) !== ExcelExporter::REQUEST_PARAM_VALUE
			)
			{
				$pageUrl = $this->request->getRequestUri();
				$currentUri = new Main\Web\Uri($pageUrl);
				LocalRedirect($currentUri->addParams([
					'find_section_section' => 0,
					'SECTION_ID' => 0,
					'apply_filter' => 'Y'
				])->getUri());
			}
		}
	}

	protected function getTemplateUrls(): array
	{
		if ($this->iblockListMixed)
		{
			$result = [
				self::PAGE_INDEX => '',
				self::PAGE_LIST => 'list/#SECTION_ID#/',
				self::PAGE_SECTION_DETAIL => 'section/#SECTION_ID#/',
			];
		}
		else
		{
			$result = [
				self::PAGE_INDEX => '',
				self::PAGE_LIST => 'list/#SECTION_ID#/',
				self::PAGE_SECTION_LIST => 'section_list/#SECTION_ID#/',
				self::PAGE_SECTION_DETAIL => 'section/#SECTION_ID#/',
			];
		}

		if ($this->isUiCatalog())
		{
			return $result + \CatalogProductControllerComponent::getTemplateUrls();
		}
		else
		{
			$result[self::PAGE_PRODUCT_DETAIL] = 'product/#ELEMENT_ID#/';

			return $result;
		}
	}

	protected function processSefMode(array $templateUrls): array
	{
		$templateUrls = \CComponentEngine::MakeComponentUrlTemplates($templateUrls, $this->arParams['SEF_URL_TEMPLATES']);
		foreach ($templateUrls as $name => $url)
		{
			$this->arResult['PATH_TO'][strtoupper($name)] = $this->arParams['SEF_FOLDER'].$url;
		}

		$variableAliases = \CComponentEngine::MakeComponentVariableAliases([], $this->arParams['VARIABLE_ALIASES']);

		$variables = [];
		$template = \CComponentEngine::ParseComponentPath($this->arParams['SEF_FOLDER'], $templateUrls, $variables);

		if (!is_string($template) || !isset($templateUrls[$template]))
		{
			$template = key($templateUrls);
		}

		\CComponentEngine::InitComponentVariables($template, [], $variableAliases, $variables);

		return [$template, $variables, $variableAliases];
	}

	protected function getPageDescription(): ?array
	{
		$result = null;

		$pageUrl = $this->request->getRequestUri();
		$currentUri = new Main\Web\Uri($pageUrl);
		$queryString = $currentUri->getQuery();

		switch ($this->pageId)
		{
			case self::PAGE_INDEX:
				$result = [
					'PAGE_ID' => 'catalog_catalog_products',
					'PAGE_PATH' => '/bitrix/modules/iblock/admin/'.($this->iblockListMixed
						? 'iblock_list_admin.php'
						: 'iblock_element_admin.php'
					),
					'PAGE_PARAMS' => $this->urlBuilder->getBaseParams(),
					'SEF_FOLDER' => '/', // hack for template files
					'INTERNAL_PAGE' => 'N',
					'IS_SIDE_PANEL' => 'N',
					'CACHE_TYPE' => 'N',
					'PAGE_CONSTANTS' => [
						'URL_BUILDER_TYPE' => $this->urlBuilder->getId(),
						'SELF_FOLDER_URL' => '/shop/settings/'
					]
				];
				break;
			case self::PAGE_LIST:
				$result = [
					'PAGE_ID' => ($this->iblockListMixed ? 'catalog_catalog_item_list' : 'catalog_catalog_product_list'),
					'PAGE_PATH' => '/bitrix/modules/iblock/admin/'.($this->iblockListMixed
						? 'iblock_list_admin.php'
						: 'iblock_element_admin.php'
					),
					'PAGE_PARAMS' => $this->urlBuilder->getBaseParams(),
					'SEF_FOLDER' => '/', // hack for template files
					'INTERNAL_PAGE' => 'N',
					'IS_SIDE_PANEL' => 'N',
					'CACHE_TYPE' => 'N',
					'PAGE_CONSTANTS' => [
						'URL_BUILDER_TYPE' => $this->urlBuilder->getId(),
						'SELF_FOLDER_URL' => '/shop/settings/'
					]
				];
				break;
			case self::PAGE_SECTION_LIST:
				$result = [
					'PAGE_ID' => 'catalog_catalog_section_list',
					'PAGE_PATH' => '/bitrix/modules/iblock/admin/iblock_section_admin.php',
					'PAGE_PARAMS' => $this->urlBuilder->getBaseParams(),
					'SEF_FOLDER' => '/', // hack for template files
					'INTERNAL_PAGE' => 'N',
					'IS_SIDE_PANEL' => 'N',
					'CACHE_TYPE' => 'N',
					'PAGE_CONSTANTS' => [
						'URL_BUILDER_TYPE' => $this->urlBuilder->getId(),
						'SELF_FOLDER_URL' => '/shop/settings/'
					]
				];
				break;
			case self::PAGE_SECTION_DETAIL:
				$result = [
					'PAGE_ID' => 'catalog_catalog_section_detail',
					'PAGE_PATH' => '',
					'PAGE_PARAMS' => $queryString,
					'SEF_FOLDER' => '/', // hack for template files
					'INTERNAL_PAGE' => 'Y',
					'CACHE_TYPE' => 'N',
					'PAGE_CONSTANTS' => [
						'URL_BUILDER_TYPE' => $this->urlBuilder->getId(),
						'SELF_FOLDER_URL' => '/shop/settings/'
					]
				];
				break;
			case self::PAGE_PRODUCT_DETAIL:
				//$result = [];
				if ($this->isUiCatalog())
				{
					$result = [];
				}
				else
				{
					$result = [
						'PAGE_ID' => 'catalog_catalog_product_detail',
						'PAGE_PATH' => '',
						'PAGE_PARAMS' => $queryString,
						'SEF_FOLDER' => '/', // hack for template files
						'INTERNAL_PAGE' => 'Y',
						'CACHE_TYPE' => 'N',
						'PAGE_CONSTANTS' => [
							'URL_BUILDER_TYPE' => $this->urlBuilder->getId(),
							'SELF_FOLDER_URL' => '/shop/settings/'
						]
					];
				}
				break;
		}

		return $result;
	}

	/**
	 * @return void
	 */
	protected function initUiScope(): void
	{
		global $APPLICATION;

		Main\UI\Extension::load($this->getUiExtensions());

		foreach ($this->getUiStyles() as $styleList)
		{
			$APPLICATION->SetAdditionalCSS($styleList);
		}

		$scripts = $this->getUiScripts();
		if (!empty($scripts))
		{
			$asset = Main\Page\Asset::getInstance();
			foreach ($scripts as $row)
			{
				$asset->addJs($row);
			}
			unset($row, $asset);
		}
		unset($scripts);
	}

	/**
	 * @return array
	 */
	protected function getUiExtensions(): array
	{
		return [
			'admin_interface',
			'sidepanel'
		];
	}

	/**
	 * @return array
	 */
	protected function getUiStyles(): array
	{
		return [];
	}

	/**
	 * @return array
	 */
	protected function getUiScripts(): array
	{
		return [];
	}

	public function showCatalogControlPanel(): void
	{
		/** global \CMain $APPLICATION */
		global $APPLICATION;
		$APPLICATION->IncludeComponent(
			'bitrix:catalog.store.document.control_panel',
			'',
			[
				'PATH_TO' => $this->arParams['PATH_TO'],
			],
			$this
		);
	}

	public function isIframeMode(): bool
	{
		return $this->isIframe;
	}
}

Youez - 2016 - github.com/yon3zu
LinuXploit