• Модуль: iblock
  • Путь к файлу: ~/bitrix/modules/iblock/lib/Controller/Property/Directory/Action/SaveSettingsAction.php
  • Класс: BitrixIblockControllerPropertyDirectoryActionSaveSettingsAction
  • Вызов: SaveSettingsAction::createHighload
private function createHighload(array $fields): AddResult
{
	$result = new AddResult();

	$title = trim($fields['DIRECTORY_NAME']);
	if (empty($title))
	{
		$this->errorCollection->setError(
			new Error(Loc::getMessage("IBLOCK_CONTROLLER_PROPERTY_DIRECTION_ACTION_SAVE_HIGHLOAD_ERROR_NAME_IS_ABSENT"))
		);

		return $result;
	}

	$name = mb_strtoupper(mb_substr($title, 0, 1)).mb_substr($title, 1);
	if (!preg_match('/^[A-Z][A-Za-z0-9]*$/', $name))
	{
		$this->errorCollection->setError(
			new Error(Loc::getMessage("IBLOCK_CONTROLLER_PROPERTY_DIRECTION_ACTION_SAVE_HIGHLOAD_ERROR_NAME_IS_INVALID"))
		);

		return $result;
	}

	$tableName = CIBlockPropertyDirectory::createHighloadTableName($title);
	if ($tableName === false)
	{
		$this->errorCollection->setError(
			new Error(Loc::getMessage("IBLOCK_CONTROLLER_PROPERTY_DIRECTION_ACTION_SAVE_HIGHLOAD_ERROR_NAME_IS_ABSENT"))
		);

		return $result;
	}

	$data = array(
		'NAME' => $name,
		'TABLE_NAME' => $tableName,
	);

	$result = HighloadBlockTable::add($data);
	if (!$result->isSuccess())
	{
		return $result;
	}

	$highloadBlockId = $result->getId();
	if (is_array($fields['DIRECTORY_ITEMS']))
	{
		$fieldsNames = reset($fields['DIRECTORY_ITEMS']);
		$fieldsNames['UF_DEF'] = '';
		$fieldsNames['UF_FILE'] = '';

		$sort = 100;
		$userTypeEntity = new CUserTypeEntity();
		$userFieldEntityId = 'HLBLOCK_' . $highloadBlockId;

		foreach($fieldsNames as $fieldName => $fieldValue)
		{
			if ('UF_DELETE' === $fieldName)
			{
				continue;
			}

			$fieldMandatory = 'N';
			switch($fieldName)
			{
				case 'UF_NAME':
				case 'UF_XML_ID':
					$fieldType = 'string';
					$fieldMandatory = 'Y';
					break;

				case 'UF_LINK':
				case 'UF_DESCRIPTION':
				case 'UF_FULL_DESCRIPTION':
					$fieldType = 'string';
					break;

				case 'UF_SORT':
					$fieldType = 'integer';
					break;

				case 'UF_FILE':
					$fieldType = 'file';
					break;

				case 'UF_DEF':
					$fieldType = 'boolean';
					break;

				default:
					$fieldType = 'string';
			}

			$userFieldValues = [
				'ENTITY_ID' => $userFieldEntityId,
				'FIELD_NAME' => $fieldName,
				'USER_TYPE_ID' => $fieldType,
				'XML_ID' => '',
				'SORT' => $sort,
				'MULTIPLE' => 'N',
				'MANDATORY' => $fieldMandatory,
				'SHOW_FILTER' => 'N',
				'SHOW_IN_LIST' => 'Y',
				'EDIT_IN_LIST' => 'Y',
				'IS_SEARCHABLE' => 'N',
				'SETTINGS' => [],
			];

			$userTypeEntity->Add($userFieldValues);
			$sort += 100;
		}
	}

	return $result;
}