• Модуль: highloadblock
  • Путь к файлу: ~/bitrix/modules/highloadblock/lib/highloadblocktable.php
  • Класс: BitrixHighloadblockHighloadBlockTable
  • Вызов: HighloadBlockTable::compileUtmEntity
static function compileUtmEntity(EntityBase $hlentity, $userfield)
{
	global $USER_FIELD_MANAGER;

	// build utm entity
	/** @var DataManager $hlDataClass */
	$hlDataClass = $hlentity->getDataClass();
	$hlblock = $hlDataClass::getHighloadBlock();

	$utmClassName = static::getUtmEntityClassName($hlentity, $userfield);
	$utmTableName = static::getMultipleValueTableName($hlblock, $userfield);

	if (class_exists($utmClassName.'Table'))
	{
		// rebuild if it already exists
		EntityBase::destroy($utmClassName.'Table');
		$utmEntity = EntityBase::getInstance($utmClassName);
	}
	else
	{
		// create entity from scratch
		$utmEntity = EntityBase::compileEntity($utmClassName, array(), array(
			'table_name' => $utmTableName,
			'namespace' => $hlentity->getNamespace()
		));
	}

	// main fields
	$utmValueField = $USER_FIELD_MANAGER->getEntityField($userfield, 'VALUE');

	$utmEntityFields = array(
		new EntityIntegerField('ID'),
		$utmValueField
	);

	// references
	$references = $USER_FIELD_MANAGER->getEntityReferences($userfield, $utmValueField);

	foreach ($references as $reference)
	{
		$utmEntityFields[] = $reference;
	}

	foreach ($utmEntityFields as $field)
	{
		$utmEntity->addField($field);
	}

	// add original entity reference
	$referenceField = new EntityReferenceField(
		'OBJECT',
		$hlentity,
		array('=this.ID' => 'ref.ID')
	);

	$utmEntity->addField($referenceField);

	// add short alias for back-reference
	$aliasField = new EntityExpressionField(
		$userfield['FIELD_NAME'].'_SINGLE',
		'%s',
		$utmEntity->getFullName().':'.'OBJECT.VALUE',
		array(
				'data_type' => get_class($utmEntity->getField('VALUE')),
				'required' => $userfield['MANDATORY'] == 'Y'
			)
	);

	$hlentity->addField($aliasField);

	// add aliases to references
	/*foreach ($references as $reference)
	{
		// todo after #44924 is resolved
		// actually no. to make it work expression should support linking to references
	}*/

	// add serialized cache-field
	$cacheField = new MainORMFieldsArrayField($userfield['FIELD_NAME'], array(
		'required' => $userfield['MANDATORY'] == 'Y'
	));

	MainUserFieldTable::setMultipleFieldSerialization($cacheField, $userfield);

	$hlentity->addField($cacheField);

	return $utmEntity;
}