- Модуль: 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;
}