Your IP : 18.189.14.251
<?php
namespace Bitrix\Disk;
use Bitrix\Disk\Internals\Error\ErrorCollection;
use Bitrix\Disk\Internals\RightTable;
use Bitrix\Main\Loader;
use Bitrix\Main\Localization\Loc;
class SocialnetworkHandlers
{
private static $lastGroupIdAddedOnHit;
private static $lastGroupOwnerIdAddedOnHit;
/**
* @param array $fields
* @return void
*/
public static function onAfterUserAdd($fields)
{
if(!Loader::includeModule('socialnetwork') || empty($fields['ID']))
{
return;
}
Driver::getInstance()->addUserStorage($fields['ID']);
}
/**
* @param array $fields
* @return void
*/
public static function onAfterUserUpdate($fields)
{
if(!Loader::includeModule('socialnetwork') || empty($fields['ID']))
{
return;
}
if(!empty($fields['NAME']) || !empty($fields['LAST_NAME']) || !empty($fields['SECOND_NAME']))
{
$user = User::loadById($fields['ID']);
if (!($user instanceof User))// || $user->isEmptyName())
{
return;
}
$userName = $user->getFormattedName();
if (empty($userName))
{
return;
}
$userStorage = Driver::getInstance()->getStorageByUserId($user->getId());
if (!($userStorage instanceof Storage))
{
return;
}
if ($userName != $userStorage->getName())
{
$userStorage->rename($userName);
}
}
}
public static function onUserDelete($userId)
{
$storage = Driver::getInstance()->getStorageByUserId($userId);
if(!$storage)
{
return true;
}
try
{
$storage->delete(self::getActivityUserId());
}
catch(\Exception $e)
{
global $APPLICATION;
if(is_object($APPLICATION))
{
$APPLICATION->throwException($e->getMessage());
}
return false;
}
return true;
}
public static function onSocNetGroupAdd($id, $fields)
{
self::$lastGroupIdAddedOnHit = $id;
self::$lastGroupOwnerIdAddedOnHit = !empty($fields['OWNER_ID'])? $fields['OWNER_ID'] : false;
}
public static function onSocNetGroupUpdate($groupId, $fields)
{
if(empty($fields['NAME']))
{
return;
}
$storage = Driver::getInstance()->getStorageByGroupId($groupId);
if(!$storage)
{
return;
}
$previousName = $storage->getName();
$correctedPreviousName = Ui\Text::correctFilename($previousName);
if($previousName === $fields['NAME'])
{
return;
}
if($storage->rename($fields['NAME']))
{
foreach($storage->getRootObject()->getSharingsAsReal() as $sharing)
{
if(!$sharing->isApproved())
{
continue;
}
$linkObject = $sharing->getLinkObject();
if(!$linkObject)
{
continue;
}
if($linkObject->getName() === $previousName || $linkObject->getName() === $correctedPreviousName)
{
$linkObject->rename($storage->getName());
}
}
unset($sharing);
}
}
public static function onBeforeSocNetGroupDelete($groupId)
{
$storage = Driver::getInstance()->getStorageByGroupId($groupId);
if (!$storage)
{
return true;
}
if ($storage->getRootObject()->countSizeOfVersions() > 0)
{
global $APPLICATION;
$APPLICATION->ThrowException(Loc::getMessage("DISK_SOCNET_HANDLERS_DECLINE_GROUP_DELETING_WITH_FILES"));
return false;
}
return true;
}
public static function onSocNetGroupDelete($groupId)
{
$storage = Driver::getInstance()->getStorageByGroupId($groupId);
if(!$storage)
{
return;
}
$storage->delete(self::getActivityUserId());
RightTable::deleteBatch(array('ACCESS_CODE' => "SG{$groupId}_" . SONET_ROLES_OWNER));
RightTable::deleteBatch(array('ACCESS_CODE' => "SG{$groupId}_" . SONET_ROLES_MODERATOR));
RightTable::deleteBatch(array('ACCESS_CODE' => "SG{$groupId}_" . SONET_ROLES_USER));
}
public static function onSocNetUserToGroupDelete($id, $fields)
{
if(
isset($fields['ROLE']) &&
(
$fields['ROLE'] == SONET_ROLES_USER ||
$fields['ROLE'] == SONET_ROLES_MODERATOR ||
$fields['ROLE'] == SONET_ROLES_OWNER
)
)
{
$userId = $fields['USER_ID'];
$groupId = $fields['GROUP_ID'];
if(empty($userId) || empty($groupId))
{
return;
}
$storage = Driver::getInstance()->getStorageByGroupId($groupId);
if(!$storage)
{
return;
}
/** @var Sharing $sharing */
$sharing = Sharing::load(array(
'=TO_ENTITY' => Sharing::CODE_USER . $userId,
'REAL_OBJECT_ID' => $storage->getRootObjectId(),
'REAL_STORAGE_ID' => $storage->getId(),
));
if(!$sharing)
{
return;
}
$sharing->delete(self::getActivityUserId());
}
}
public static function onSocNetUserToGroupUpdate($id, $fields, $fieldsOld = [])
{
if (!Loader::includeModule('socialnetwork'))
{
return;
}
$memberRolesList = \Bitrix\Socialnetwork\UserToGroupTable::getRolesMember();
if(
isset($fields['ROLE']) &&
in_array($fields['ROLE'], $memberRolesList) &&
(
empty($fieldsOld)
|| !in_array($fieldsOld['ROLE'], $memberRolesList)
)
)
{
if(!(isset($fields['USER_ID'])))
{
$query = \CSocNetUserToGroup::getList(array(), array('ID' => $id), false, false, array('USER_ID', 'GROUP_ID'));
if($query)
{
$row = $query->fetch();
if($row)
{
$userId = $row['USER_ID'];
$groupId = $row['GROUP_ID'];
}
}
}
/** @noinspection PhpDynamicAsStaticMethodCallInspection */
if(!empty($userId) && !empty($groupId) && \CSocNetFeatures::isActiveFeature(SONET_ENTITY_GROUP, $groupId, 'files'))
{
$storage = Driver::getInstance()->getStorageByGroupId($groupId);
if(!$storage)
{
return;
}
$rootObject = $storage->getRootObject();
if(!$rootObject->canRead($storage->getSecurityContext($userId)))
{
return;
}
$errorCollection = new ErrorCollection();
Sharing::connectStorageToUserStorage($userId, $userId, $storage, $errorCollection);
}
}
}
public static function onSocNetUserToGroupAdd($id, $fields)
{
if(
isset($fields['ROLE']) && isset($fields['USER_ID']) &&
(
$fields['ROLE'] == SONET_ROLES_USER ||
$fields['ROLE'] == SONET_ROLES_MODERATOR ||
$fields['ROLE'] == SONET_ROLES_OWNER
)
)
{
if(!(isset($fields['GROUP_ID'])))
{
$query = \CSocNetUserToGroup::getList(array(), array('ID' => $id), false, false, array('GROUP_ID', 'INITIATED_BY_USER_ID'));
if($query)
{
$row = $query->fetch();
if($row)
{
$groupId = $row['GROUP_ID'];
}
}
}
else
{
$groupId = $fields['GROUP_ID'];
}
/** @noinspection PhpDynamicAsStaticMethodCallInspection */
if(!empty($groupId) && \CSocNetFeatures::isActiveFeature(SONET_ENTITY_GROUP, $groupId, 'files'))
{
$storage = Driver::getInstance()->getStorageByGroupId($groupId);
if(!$storage)
{
return;
}
$rootObject = $storage->getRootObject();
if(!$rootObject->canRead($storage->getSecurityContext($fields['USER_ID'])))
{
return;
}
$errorCollection = new ErrorCollection();
$createdBy = empty($fields['INITIATED_BY_USER_ID']) ?
$fields['USER_ID'] : $fields['INITIATED_BY_USER_ID'];
Sharing::connectStorageToUserStorage($createdBy, $fields['USER_ID'], $storage, $errorCollection);
}
}
}
public static function onSocNetFeaturesAdd($id, $fields)
{
if($fields
&& isset($fields['ACTIVE'])
&& $fields['ACTIVE'] == 'Y'
&& isset($fields['FEATURE'])
&& $fields['FEATURE'] == 'files'
&& $fields['ENTITY_TYPE'] == 'G'
&& $fields['ENTITY_ID']
)
{
$groupId = $fields['ENTITY_ID'];
$storage = Driver::getInstance()->addGroupStorage($groupId);
if($storage && self::$lastGroupIdAddedOnHit == $groupId && self::$lastGroupOwnerIdAddedOnHit)
{
$rootObject = $storage->getRootObject();
if(!$rootObject->canRead($storage->getSecurityContext(self::$lastGroupOwnerIdAddedOnHit)))
{
return;
}
$errorCollection = new ErrorCollection();
Sharing::connectStorageToUserStorage(
self::$lastGroupOwnerIdAddedOnHit,
self::$lastGroupOwnerIdAddedOnHit,
$storage,
$errorCollection
);
}
}
}
public static function onSocNetFeaturesUpdate($id, $fields)
{
static $updateGroupFilesFeatures = false;
if(!$updateGroupFilesFeatures && isset($fields['ACTIVE']) && $fields['ACTIVE'] == 'N')
{
/** @noinspection PhpDynamicAsStaticMethodCallInspection */
$features = \CSocNetFeatures::getById($id);
if($features
&& isset($features['FEATURE'])
&& $features['FEATURE'] == 'files'
&& $features['ENTITY_TYPE'] == 'G'
&& $features['ENTITY_ID']
)
{
$updateGroupFilesFeatures = true;
$groupId = $features['ENTITY_ID'];
if(empty($groupId))
{
return;
}
$storage = Driver::getInstance()->getStorageByGroupId($groupId);
if(!$storage)
{
return;
}
$userId = self::getActivityUserId();
foreach(Sharing::getModelList(array('filter' => array(
'REAL_OBJECT_ID' => (int)$storage->getRootObjectId(),
'REAL_STORAGE_ID' => (int)$storage->getId(),
))) as $sharing)
{
$sharing->delete($userId);
}
unset($sharing);
}
}
elseif(isset($fields['ACTIVE']) && $fields['ACTIVE'] == 'Y')
{
/** @noinspection PhpDynamicAsStaticMethodCallInspection */
$features = \CSocNetFeatures::getById($id);
if($features
&& isset($features['FEATURE'])
&& $features['FEATURE'] == 'files'
&& $features['ENTITY_TYPE'] == 'G'
&& $features['ENTITY_ID']
)
{
$groupId = $features['ENTITY_ID'];
if(!empty($groupId))
{
Driver::getInstance()->addGroupStorage($groupId);
}
}
}
}
public static function onAfterFetchDiskUfEntity(array $entities)
{
foreach($entities as $name => $ids)
{
if($name === 'BLOG_POST')
{
if(is_array($ids))
{
Driver::getInstance()->getUserFieldManager()->loadBatchAttachedObjectInBlogPost($ids);
}
}
}
unset($name);
}
private static function getActivityUserId()
{
global $USER;
if($USER && $USER instanceof \CUser)
{
$userId = $USER->getId();
if(is_numeric($userId) && ((int)$userId > 0))
{
return $userId;
}
}
return SystemUser::SYSTEM_USER_ID;
}
}