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