- Модуль: disk
- Путь к файлу: ~/bitrix/modules/disk/lib/uf/versionusertype.php
- Класс: BitrixDiskUfVersionUserType
- Вызов: VersionUserType::onBeforeSave
static function onBeforeSave($userField, $value, $userId = false)
{
$userFieldManager = Driver::getInstance()->getUserFieldManager();
list($connectorClass, $moduleId) = $userFieldManager->getConnectorDataByEntityType($userField['ENTITY_ID']);
list($type, $realValue) = static::detectType($value);
if(empty($value))
{
$alreadyExistsValues = $userField['VALUE'];
if(!is_array($alreadyExistsValues))
{
$alreadyExistsValues = array($userField['VALUE']);
}
AttachedObject::detachByFilter(array('ID' => $alreadyExistsValues));
return $value;
}
if($type == self::TYPE_NEW_OBJECT)
{
$errorCollection = new ErrorCollection();
$version = static::getVersionById($realValue);
if(!$version)
{
return '';
}
$file = $version->getObject();
if (!$file)
{
return '';
}
if ($userId === false)
{
$securityContext = $file->getStorage()->getCurrentUserSecurityContext();
}
else
{
$securityContext = $file->getStorage()->getSecurityContext($userId);
}
$canUpdate = $allowEdit = false;
//todo this is great hack for disk_version and sync IS_EDITABLE, ALLOW_EDIT by parent AttachedObject
$hackData = AttachedObject::getStoredDataByObjectId($file->getId());
if($hackData !== null)
{
if(isset($hackData['IS_EDITABLE']))
{
$canUpdate = $hackData['IS_EDITABLE'];
}
if(isset($hackData['ALLOW_EDIT']))
{
$allowEdit = $hackData['ALLOW_EDIT'];
}
}
$canUpdate = $canUpdate || $file->canUpdate($securityContext);
$attachedModel = AttachedObject::add(array(
'MODULE_ID' => $moduleId,
'OBJECT_ID' => $file->getId(),
'VERSION_ID' => $version->getId(),
'ENTITY_ID' => $userField['VALUE_ID'],
'ENTITY_TYPE' => $connectorClass,
'IS_EDITABLE' => (int)$canUpdate,
'ALLOW_EDIT' => (int)$allowEdit,
'CREATED_BY' => $userId === false? self::getActivityUserId() : $userId,
), $errorCollection);
if(!$attachedModel || $errorCollection->hasErrors())
{
$errorCollection->add(array(new Error(Loc::getMessage('DISK_VERSION_USER_TYPE_ERROR_COULD_NOT_FIND_ATTACHED_OBJECT'), self::ERROR_COULD_NOT_FIND_ATTACHED_OBJECT)));
return '';
}
return $attachedModel->getId();
}
else
{
return $realValue;
}
}