• Модуль: catalog
  • Путь к файлу: ~/bitrix/modules/catalog/lib/component/gridvariationform.php
  • Класс: BitrixCatalogComponentGridVariationForm
  • Вызов: GridVariationForm::getProductFieldHeaders
protected function getProductFieldHeaders(array $fields, int $defaultWidth): array
{
	$headers = [];

	$numberFields = ['QUANTITY', 'QUANTITY_RESERVED', 'QUANTITY_COMMON', 'MEASURE_RATIO', 'WEIGHT', 'WIDTH', 'LENGTH', 'HEIGHT'];
	$numberFields = array_fill_keys($numberFields, true);

	$immutableFields = ['TIMESTAMP_X', 'MODIFIED_BY', 'DATE_CREATE', 'CREATED_USER_NAME', 'AVAILABLE'];
	$immutableFields = array_fill_keys($immutableFields, true);

	$defaultFields = ['QUANTITY', 'MEASURE', 'NAME', 'BARCODE'];
	$defaultFields = array_fill_keys($defaultFields, true);

	$sortableFields = [
		'QUANTITY' =>'QUANTITY',
		'AVAILABLE' =>'AVAILABLE',
		'WEIGHT' =>'WEIGHT',
		'ACTIVE' =>'ACTIVE',
		'MEASURE' =>'MEASURE',
		'TIMESTAMP_X' => 'TIMESTAMP_X',
		'MODIFIED_BY' => 'MODIFIED_BY',
		'DATE_CREATE' => 'CREATED',
		'CREATED_USER_NAME' => 'CREATED_BY',
		'CODE' => 'CODE',
		'EXTERNAL_ID' => 'EXTERNAL_ID',
		'XML_ID' => 'XML_ID',
		'TAGS' => 'TAGS',
		'SHOW_COUNTER' => 'SHOW_COUNTER',
		'SHOW_COUNTER_START' => 'SHOW_COUNTER_START',
		'PREVIEW_PICTURE' => 'HAS_PREVIEW_PICTURE',
		'DETAIL_PICTURE' => 'HAS_DETAIL_PICTURE',
	];

	foreach ($fields as $code)
	{
		$type = isset($numberFields[$code]) ? 'number' : 'string';

		switch ($code)
		{
			case 'AVAILABLE':
			case 'ACTIVE':
			case 'VAT_INCLUDED':
				$type = 'boolean';
				break;

			case 'MODIFIED_BY':
				$type = 'user';
				break;

			case 'VAT_ID':
			case 'MEASURE':
			case 'QUANTITY_TRACE':
			case 'CAN_BUY_ZERO':
			case 'SUBSCRIBE':
				$type = 'list';
				break;
		}

		$editable = false;

		if (!isset($immutableFields[$code]))
		{
			$editable = [
				'TYPE' => Types::TEXT,
			];

			switch ($code)
			{
				case 'ACTIVE':
					$editable = [
						'TYPE' => Types::CHECKBOX,
					];
					break;
				case 'VAT_INCLUDED':
					$editable =
						$this->isPricesEditable()
							? ['TYPE' => Types::CHECKBOX]
							: false
					;
					break;

				case 'VAT_ID':
					if (!$this->isPricesEditable())
					{
						$editable = false;
						$type = 'readOnlyVat';

						break;
					}

					$defaultVat = $this->getDefaultVat();
					$vatList = [
						$defaultVat['ID'] => $defaultVat['NAME'],
					];

					if ($defaultVat['ID'] !== static::NOT_SELECTED_VAT_ID_VALUE && !Loader::includeModule('bitrix24'))
					{
						$vatList[static::NOT_SELECTED_VAT_ID_VALUE] = Loc::getMessage("CATALOG_PRODUCT_CARD_VARIATION_GRID_NOT_SELECTED");
					}

					foreach ($this->getVats() as $vat)
					{
						if ($vat['RATE'] === $defaultVat['RATE'] && $vat['EXCLUDE_VAT'] === $defaultVat['EXCLUDE_VAT'])
						{
							continue;
						}

						$vatList[$vat['ID']] = htmlspecialcharsbx($vat['NAME']);
					}
					$editable = [
						'TYPE' => Types::DROPDOWN,
						'items' => $vatList,
					];
					break;

				case 'MEASURE':
					$measureList = [];

					foreach ($this->getMeasures() as $measure)
					{
						$measureList[$measure['ID']] = htmlspecialcharsbx($measure['MEASURE_TITLE']);
						if (empty($measureList[$measure['ID']]))
						{
							$measureList[$measure['ID']] = CCatalogMeasureClassifier::getMeasureTitle(
								$measure["CODE"],
								'MEASURE_TITLE'
							);
						}
					}
					$editable = [
						'TYPE' => Types::DROPDOWN,
						'items' => $measureList,
					];
					break;

				case 'QUANTITY':
				case 'QUANTITY_RESERVED':
				case 'QUANTITY_COMMON':
					if (State::isUsedInventoryManagement())
					{
						$editable = false;
					}
					else
					{
						$editable = [
							'TYPE' => Types::NUMBER,
							'PLACEHOLDER' => 0,
						];
					}
					break;

				case 'MEASURE_RATIO':
					$editable = [
						'TYPE' => Types::NUMBER,
						'PLACEHOLDER' => 0,
					];
					break;

				case 'BARCODE':
					$editable = [
						'TYPE' => Types::CUSTOM,
					];
					$type = 'barcode';
					break;

				case 'QUANTITY_TRACE':
				case 'CAN_BUY_ZERO':
				case 'SUBSCRIBE':
					$items = [];
					foreach ($this->getCatalogEnumFields($code) as $field)
					{
						$items[$field['VALUE']] = $field['NAME'];
					}

					$editable = [
						'TYPE' => Types::DROPDOWN,
						'items' => $items,
					];
					break;
			}
		}

		$headerName =
			$code === 'MODIFIED_BY'
				? static::getHeaderName('USER_NAME')
				: static::getHeaderName($code)
		;

		$sortField = $sortableFields[$code] ?? false;

		$headers[] = [
			'id' => static::formatFieldName($code),
			'name' => $headerName['NAME'],
			'title' => $headerName['TITLE'],
			'sort' => $sortField,
			'locked' => false,
			'headerHint' => null,
			'type' => $type,
			'align' => $type === 'number' ? 'right' : 'left',
			'editable' => $editable,
			'width' => $defaultWidth,
			'default' => isset($defaultFields[$code]),
		];
	}

	return $headers;
}