• Модуль: main
  • Путь к файлу: ~/bitrix/modules/main/lib/userfield.php
  • Класс: BitrixMainUserFieldTable
  • Вызов: UserFieldTable::createUtmEntity
static function createUtmEntity(ORMEntity $srcEntity, array $utmFields, $ufId = null)
{
	global $USER_FIELD_MANAGER;

	/** @var BitrixMainORMDataDataManager $utmClassFull */
	$utmClassFull = static::getUtmEntityClassNameBySrcEntity($srcEntity);
	$utmClassPath = explode('\', ltrim($utmClassFull, '\'));

	$utmNamespace = join('\', array_slice($utmClassPath, 0, -1));
	$utmClass = end($utmClassPath);

	// get table name
	$utmTable = static::getUtmEntityTableNameBySrcEntity($srcEntity, $ufId);

	// collect fields
	$fieldsMap = array(
		'ID' => array(
			'data_type' => 'integer',
			'primary' => true,
			'autocomplete' => true
		),
		'VALUE_ID' => array(
			'data_type' => 'integer',
			'primary' => true
		),
		'PARENT' => array(
			'data_type' => $srcEntity->getDataClass(),
			'reference' => array(
				'=this.VALUE_ID' => 'ref.ID'
			)
		),
		'FIELD_ID' => array(
			'data_type' => 'integer'
		),

		// base values fields
		'VALUE' => array(
			'data_type' => 'text'
		),
		'VALUE_INT' => array(
			'data_type' => 'integer'
		),
		'VALUE_DOUBLE' => array(
			'data_type' => 'float'
		),
		'VALUE_DATE' => array(
			'data_type' => 'datetime'
		)
	);

	// initialize entity
	if (class_exists($utmNamespace."\".$utmClass))
	{
		ORMEntity::destroy($utmNamespace."\".$utmClass);
		$entity = ORMEntity::getInstance($utmNamespace."\".$utmClass);

		foreach ($fieldsMap as $fieldName => $field)
		{
			$entity->addField($field, $fieldName);
		}
	}
	else
	{
		$entity = ORMEntity::compileEntity($utmClass, $fieldsMap, array(
			'namespace' => $utmNamespace, 'table_name' => $utmTable
		));
	}

	// add utm fields being mapped on real column name
	foreach ($utmFields as $utmField)
	{
		$field = $USER_FIELD_MANAGER->getEntityField($utmField);

		if ($field instanceof ORMFieldsIntegerField)
		{
			$columnName = 'VALUE_INT';
		}
		elseif ($field instanceof ORMFieldsFloatField)
		{
			$columnName = 'VALUE_DOUBLE';
		}
		elseif ($field instanceof ORMFieldsDateField)
		{
			$columnName = 'VALUE_DATE';
		}
		else
		{
			$columnName = 'VALUE';
		}

		$field->setColumnName($columnName);

		$entity->addField($field);

		foreach ($USER_FIELD_MANAGER->getEntityReferences($utmField, $field) as $reference)
		{
			$entity->addField($reference);
		}

		// add back-reference
		$refField = new ORMFieldsRelationsReference(
			'PARENT_'.$utmField['FIELD_NAME'],
			$srcEntity->getDataClass(),
			array('=this.VALUE_ID' => 'ref.ID', '=this.FIELD_ID' => array('?i', $utmField['ID']))
		);

		$entity->addField($refField);
	}

	return $entity;
}