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;
}