• Модуль: tasks
  • Путь к файлу: ~/bitrix/modules/tasks/lib/item.php
  • Класс: BitrixTasksItem
  • Вызов: Item::generateMap
static function generateMap(array $parameters = array())
{
	$dc = static::getDataSourceClass();
	$ufc = static::getUserFieldControllerClass();

	$map = new FieldMap();

	if (
		!isset($parameters['EXCLUDE'])
		|| !is_array($parameters['EXCLUDE'])
	)
	{
		$parameters['EXCLUDE'] = [];
	}

	// read from orm tablet
	/**
	 * @var mixed[]|BitrixMainEntityBooleanField|BitrixMainEntityDateTimeField|BitrixMainEntityScalarField $v
	 */
	foreach($dc::getMap() as $k => $v)
	{
		$name = $k;
		if(is_object($v))
		{
			$name = $v->getName();
		}
		if(array_key_exists($name, $parameters['EXCLUDE'])) // ignore some
		{
			continue;
		}

		// todo: refactor mess here, make some fabric maybe

		$isBoolean = is_object($v) ? is_a($v, '\Bitrix\Main\Entity\BooleanField') : $v['data_type'] == 'boolean';
		$isDate = is_object($v) ? is_a($v, '\Bitrix\Main\Entity\DateTimeField') : $v['data_type'] == 'datetime';
		$isReference = is_object($v) ? is_a($v, '\Bitrix\Main\Entity\ReferenceField') : isset($v['reference']);
		$isExpression = is_object($v) ? is_a($v, '\Bitrix\Main\Entity\ExpressionField') : isset($v['expression']);

		if(
			$isReference
			|| $isExpression
			|| (is_object($v) && !method_exists($v, 'getDefaultValue'))
		) // todo: make use of references and expressions too
		{
			continue;
		}

		$fParameters = array(
			'NAME' => $name,
			'SOURCE' => FieldScalar::SOURCE_TABLET,
			//'DB_WRITABLE' => !($isReference || $isExpression),
			'DEFAULT' => is_object($v) ? $v->getDefaultValue() : ($v['default_value'] ?? null),
			'ENUMERATION' => $isBoolean ? (
				is_object($v) ? $v->getValues() : ($v['values'] ?? null)
			) : array(),
		);

		if($isDate)
		{
			$field = new FieldDate($fParameters);
		}
		elseif($isBoolean)
		{
			$field = new FieldBoolean($fParameters);
		}
		else
		{
			$field = new FieldScalar($fParameters);
		}

		$map->placeField($field, $name);
	}

	// read from user field scheme
	if($ufc !== null && class_exists($ufc))
	{
		// as we pass 0 to the first argument, there is no need to pass userId also
		foreach($ufc::getScheme() as $name => $v)
		{
			if(array_key_exists($name, $parameters['EXCLUDE'])) // ignore some
			{
				continue;
			}

			$isDate = $v['USER_TYPE_ID'] == 'date';
			$isDateTime = $v['USER_TYPE_ID'] == 'datetime';

			$field = array(
				'NAME' => $name,
				'SOURCE' => FieldScalar::SOURCE_UF,
				'DEFAULT' => ($v['SETTINGS']['DEFAULT_VALUE'] ?? null),
			);

			if($v['MULTIPLE'] == 'Y')
			{
				if(($isDate || $isDateTime))
				{
					$field = new FieldCollectionUFDate($field);
				}
				else
				{
					if($v['USER_TYPE_ID'] == 'integer')
					{
						$field = new FieldCollectionInteger($field);
					}
					else
					{
						$field = new FieldCollectionScalar($field);
					}
				}
			}
			else
			{
				if($isDate || $isDateTime)
				{
					$field = new FieldUFDate($field);
				}
				else
				{
					$field = new FieldScalar($field);
				}
			}

			$map->placeField($field, $name);
		}
	}

	// todo: make some onBuildMap event here to be able to modify it without inheritance, hmm?

	return $map;
}