%PDF- %PDF-
Direktori : /home/bitrix/www/bitrix/modules/socialnetwork/lib/item/ |
Current File : //home/bitrix/www/bitrix/modules/socialnetwork/lib/item/usertogroup.php |
<?php /** * Bitrix Framework * @package bitrix * @subpackage socialnetwork * @copyright 2001-2012 Bitrix */ namespace Bitrix\Socialnetwork\Item; use Bitrix\Main\Config\Option; use Bitrix\Main\Loader; use Bitrix\Main\Localization\Loc; use Bitrix\Main\ModuleManager; use Bitrix\Socialnetwork\WorkgroupTable; use Bitrix\Socialnetwork\UserToGroupTable; use Bitrix\Socialnetwork\Integration; Loc::loadMessages(__FILE__); class UserToGroup { const CHAT_ACTION_IN = 'in'; const CHAT_ACTION_OUT = 'out'; public static function addRelationAutoMembership($params) { global $USER; if (!is_object($USER)) { return; } static $helper = false; $userId = (isset($params['USER_ID']) ? intval($params['USER_ID']) : false); $groupId = (isset($params['GROUP_ID']) ? intval($params['GROUP_ID']) : false); $value = (isset($params['VALUE']) && in_array($params['VALUE'], WorkgroupTable::getAutoMembershipValuesAll()) ? $params['VALUE'] : "Y"); $notyfy = (isset($params['NOTIFY']) && $params['NOTIFY'] == "N" ? $params['NOTIFY'] : "Y"); if ( intval($userId) > 0 && intval($groupId) > 0 ) { if (!$helper) { $connection = \Bitrix\Main\Application::getConnection(); $helper = $connection->getSqlHelper(); } $addFields = array( 'AUTO_MEMBER' => $value, 'USER_ID' => $userId, 'GROUP_ID' => $groupId, 'ROLE' => (isset($params['ROLE']) && in_array($params['ROLE'], UserToGroupTable::getRolesAll()) ? $params['ROLE'] : UserToGroupTable::ROLE_USER), 'INITIATED_BY_TYPE' => UserToGroupTable::INITIATED_BY_GROUP, 'INITIATED_BY_USER_ID' => $USER->getId(), "=DATE_CREATE" => $helper->getCurrentDateTimeFunction(), "=DATE_UPDATE" => $helper->getCurrentDateTimeFunction(), ); $relationId = \CSocNetUserToGroup::add($addFields); if ( $notyfy && $relationId && $userId && $groupId && $value == 'Y' ) { self::notifyAutoMembership(array( 'GROUP_ID' => $groupId, 'USER_ID' => $userId, 'RELATION_ID' => $relationId )); self::addInfoToChat(array( 'group_id' => $groupId, 'user_id' => $userId, 'action' => self::CHAT_ACTION_IN )); } } } public static function changeRelationAutoMembership($params) { static $helper = false; $relationId = (isset($params['RELATION_ID']) ? intval($params['RELATION_ID']) : false); $userId = (isset($params['USER_ID']) ? intval($params['USER_ID']) : false); $groupId = (isset($params['GROUP_ID']) ? intval($params['GROUP_ID']) : false); $value = (isset($params['VALUE']) && in_array($params['VALUE'], WorkgroupTable::getAutoMembershipValuesAll()) ? $params['VALUE'] : 'Y'); $notyfy = (isset($params['NOTIFY']) && $params['NOTIFY'] == "N" ? $params['NOTIFY'] : "Y"); if (intval($relationId) > 0) { if (!$helper) { $connection = \Bitrix\Main\Application::getConnection(); $helper = $connection->getSqlHelper(); } $updateFields = array( 'AUTO_MEMBER' => $value, '=DATE_UPDATE' => $helper->getCurrentDateTimeFunction(), ); if ( isset($params['ROLE']) && in_array($params['ROLE'], UserToGroupTable::getRolesAll()) ) { $updateFields['ROLE'] = $params['ROLE']; } \CSocNetUserToGroup::update($relationId, $updateFields); if ( $notyfy && $userId && $groupId && $value == 'Y' ) { self::notifyAutoMembership(array( 'GROUP_ID' => $groupId, 'USER_ID' => $userId, 'RELATION_ID' => $relationId )); self::addInfoToChat(array( 'group_id' => $groupId, 'user_id' => $userId, 'action' => self::CHAT_ACTION_IN )); } } } private static function notifyAutoMembership($params) { $userId = (isset($params['USER_ID']) ? intval($params['USER_ID']) : false); $groupId = (isset($params['GROUP_ID']) ? intval($params['GROUP_ID']) : false); $relationId = (isset($params['RELATION_ID']) ? intval($params['RELATION_ID']) : false); if ( $userId && $groupId && $relationId && Loader::includeModule('im') ) { $groupItem = \Bitrix\Socialnetwork\Item\Workgroup::getById($groupId); $groupFields = $groupItem->getFields(); $groupUrlData = $groupItem->getGroupUrlData(array( 'USER_ID' => $userId )); $messageFields = array( "MESSAGE_TYPE" => IM_MESSAGE_SYSTEM, "NOTIFY_TYPE" => IM_NOTIFY_SYSTEM, "FROM_USER_ID" => $groupFields["OWNER_ID"], "TO_USER_ID" => $userId, "NOTIFY_MODULE" => "socialnetwork", "NOTIFY_EVENT" => "invite_group", "NOTIFY_TAG" => "SOCNET|INVITE_GROUP|".$userId."|".$relationId, "NOTIFY_MESSAGE" => Loc::getMessage(($groupItem->isProject() ? "SOCIALNETWORK_ITEM_USERTOGROUP_AUTO_MEMBER_ADD_IM_PROJECT" : "SOCIALNETWORK_ITEM_USERTOGROUP_AUTO_MEMBER_ADD_IM"), array( "#GROUP_NAME#" => "<a href=\"".$groupUrlData['DOMAIN'].$groupUrlData['URL']."\" class=\"bx-notifier-item-action\">".htmlspecialcharsEx($groupFields["NAME"])."</a>" ) ), "NOTIFY_MESSAGE_OUT" => Loc::getMessage("SOCIALNETWORK_ITEM_USERTOGROUP_AUTO_MEMBER_ADD_IM", array( "#GROUP_NAME#" => htmlspecialcharsEx($groupFields["NAME"]) ) )." (".$groupUrlData['SERVER_NAME'].$groupUrlData['URL'].")" ); \CIMNotify::deleteBySubTag("SOCNET|REQUEST_GROUP|".$userId."|".$groupId."|".$relationId); \CIMNotify::add($messageFields); } } public static function onAfterUserAdd(&$fields) { if (!self::checkUF()) { return; } if ( $fields['ID'] > 0 && (!isset($fields['ACTIVE']) || $fields['ACTIVE'] == 'Y') && isset($fields['UF_DEPARTMENT']) && is_array($fields['UF_DEPARTMENT']) && intval($fields['UF_DEPARTMENT'][0]) > 0 && ModuleManager::isModuleInstalled('intranet') && Loader::includeModule('iblock') ) { $groupList = self::getConnectedGroups($fields['UF_DEPARTMENT']); if (!empty($groupList)) { foreach($groupList as $groupId) { self::addRelationAutoMembership(array( 'USER_ID' => $fields['ID'], 'GROUP_ID' => $groupId, 'NOTIFY' => 'N' )); } } } } public static function onAfterUserUpdate(&$userFields) { if (!self::checkUF()) { return; } if ( intval($userFields['ID']) > 0 && isset($userFields['UF_DEPARTMENT']) && ModuleManager::isModuleInstalled('intranet') && Loader::includeModule('iblock') ) { $oldGroupList = $oldGroupAutoList = $newGroupList = array(); $res = UserToGroupTable::getList(array( 'filter' => array( 'USER_ID' => intval($userFields['ID']) ), 'select' => array('GROUP_ID', 'AUTO_MEMBER') )); while($relation = $res->fetch()) { $oldGroupList[] = $relation['GROUP_ID']; if ($relation['AUTO_MEMBER'] == 'Y') { $oldGroupAutoList[] = $relation['GROUP_ID']; } } $oldGroupList = array_unique($oldGroupList); $oldGroupAutoList = array_unique($oldGroupAutoList); if ( !empty($userFields['UF_DEPARTMENT']) && is_array($userFields['UF_DEPARTMENT']) ) { $userFields['UF_DEPARTMENT'] = array_values($userFields['UF_DEPARTMENT']); } $departmentList = ( !is_array($userFields['UF_DEPARTMENT']) || empty($userFields['UF_DEPARTMENT']) || intval($userFields['UF_DEPARTMENT'][0]) <= 0 ? array() : $userFields['UF_DEPARTMENT'] ); if (!empty($departmentList)) { $newGroupList = self::getConnectedGroups($userFields['UF_DEPARTMENT']); } $groupListPlus = array_diff($newGroupList, $oldGroupList); $groupListMinus = array_diff($oldGroupAutoList, $newGroupList); $groupListMinus = array_diff($groupListMinus, $groupListPlus); if (!empty($groupListMinus)) { $res = UserToGroupTable::getList(array( 'filter' => array( '=USER_ID' => intval($userFields["ID"]), '@GROUP_ID' => $groupListMinus, '@ROLE' => array(UserToGroupTable::ROLE_OWNER, UserToGroupTable::ROLE_MODERATOR, UserToGroupTable::ROLE_USER), 'AUTO_MEMBER' => 'Y' ), 'select' => array('ID') )); while($relation = $res->fetch()) { \CSocNetUserToGroup::delete($relation['ID']); } } $changeList = $addList = $noChangeList = $setAutoList = array(); if (!empty($groupListPlus)) { $res = UserToGroupTable::getList(array( 'filter' => array( '=USER_ID' => intval($userFields["ID"]), '@GROUP_ID' => $groupListPlus, '@ROLE' => array(UserToGroupTable::ROLE_OWNER, UserToGroupTable::ROLE_MODERATOR, UserToGroupTable::ROLE_USER), ), 'select' => array('ID', 'GROUP_ID', 'AUTO_MEMBER') )); while($relation = $res->fetch()) { if ( $relation['AUTO_MEMBER'] == 'Y' || $relation['ROLE'] == UserToGroupTable::ROLE_OWNER ) { $noChangeList[] = $relation['GROUP_ID']; } else // UserToGroupTable::ROLE_MODERATOR, UserToGroupTable::ROLE_USER, AUTO_MEMBER = 'N' { $noChangeList[] = $relation['GROUP_ID']; UserToGroup::changeRelationAutoMembership(array( 'RELATION_ID' => intval($relation['ID']), 'USER_ID' => intval($userFields["ID"]), 'GROUP_ID' => intval($relation['GROUP_ID']), 'ROLE' => $relation['ROLE'], 'VALUE' => 'Y', 'NOTIFY' => 'N' )); } } $groupListPlus = array_diff($groupListPlus, $noChangeList); } if (!empty($groupListPlus)) { $res = UserToGroupTable::getList(array( 'filter' => array( '=USER_ID' => intval($userFields["ID"]), '@GROUP_ID' => $groupListPlus, '@ROLE' => array(UserToGroupTable::ROLE_REQUEST, UserToGroupTable::ROLE_BAN), 'AUTO_MEMBER' => 'N' ), 'select' => array('ID', 'USER_ID', 'GROUP_ID') )); while($relation = $res->fetch()) { $changeList[] = intval($relation['GROUP_ID']); UserToGroup::changeRelationAutoMembership(array( 'RELATION_ID' => intval($relation['ID']), 'USER_ID' => intval($relation['USER_ID']), 'GROUP_ID' => intval($relation['GROUP_ID']), 'ROLE' => UserToGroupTable::ROLE_USER, 'VALUE' => 'Y' )); } $addList = array_diff($groupListPlus, $changeList); } foreach($addList as $addGroupId) { UserToGroup::addRelationAutoMembership(array( 'USER_ID' => intval($userFields["ID"]), 'GROUP_ID' => $addGroupId, 'ROLE' => UserToGroupTable::ROLE_USER, 'VALUE' => 'Y' )); } } } public static function getConnectedGroups($departmentList) { static $structureIBlockId = false; static $departmentChainCache = array(); $result = array(); if ($structureIBlockId === false) { $structureIBlockId = intval(Option::get('intranet', 'iblock_structure', 0)); } if (intval($structureIBlockId) > 0) { $userDepartmentList = array(); foreach($departmentList as $departmentId) { $departmentChain = array(); if (isset($departmentChainCache[$departmentId])) { $departmentChain = $departmentChainCache[$departmentId]; } else { $res = \CIBlockSection::getNavChain($structureIBlockId, $departmentId, array("ID")); while ($section = $res->fetch()) { if (intval($section['ID']) > 0) { $departmentChain[] = intval($section['ID']); } } $departmentChainCache[$departmentId] = $departmentChain; } $userDepartmentList = array_merge($userDepartmentList, $departmentChain); } $userDepartmentList = array_unique($userDepartmentList); if (!empty($userDepartmentList)) { $res = WorkgroupTable::getList(array( 'filter' => array( '@UF_SG_DEPT' => $userDepartmentList ), 'select' => array('ID') )); while ($group = $res->fetch()) { if (intval($group['ID']) > 0) { $result[] = intval($group['ID']); } } } $result = array_unique($result); } return $result; } private static function checkUF() { $res = \CUserTypeEntity::getList(array(), array("ENTITY_ID" => "SONET_GROUP", "FIELD_NAME" => "UF_SG_DEPT")); return ($res && ($uf = $res->fetch())); } public static function addInfoToChat($params = array()) { $result = false; if ( !array($params) || !isset($params['group_id']) || intval($params['group_id']) <= 0 || !isset($params['user_id']) || intval($params['user_id']) <= 0 || !isset($params['action']) || !in_array($params['action'], self::getChatActionList()) || !Integration\Im\Chat\Workgroup::getUseChat() || !Loader::includeModule('im') ) { return $result; } $groupId = intval($params['group_id']); $userId = intval($params['user_id']); $sendMessage = ( !isset($params['sendMessage']) || $params['sendMessage'] ); $chatData = Integration\Im\Chat\Workgroup::getChatData(array( 'group_id' => $groupId, 'skipAvailabilityCheck' => true )); if ( empty($chatData) || empty($chatData[$groupId]) || intval($chatData[$groupId]) <= 0 ) { return $result; } $res = \CUser::getById($userId); $user = $res->fetch(); if ( empty($user) || ( isset($user['ACTIVE']) && $user['ACTIVE'] == 'N' ) ) { return $result; } $groupItem = \Bitrix\Socialnetwork\Item\Workgroup::getById($groupId); $projectSuffix = ($groupItem->isProject() ? '_PROJECT' : ''); $userName = \CUser::formatName(\CSite::getNameFormat(), $user, true); switch($user['PERSONAL_GENDER']) { case "M": $genderSuffix = '_M'; break; case "F": $genderSuffix = '_F'; break; default: $genderSuffix = ''; } $chatId = $chatData[$groupId]; $chat = new \CIMChat(0); switch($params['action']) { case self::CHAT_ACTION_IN: if ($chat->addUser($chatId, $userId, false, true, true)) { $chatMessage = str_replace('#USER_NAME#', $userName, Loc::getMessage("SOCIALNETWORK_ITEM_USERTOGROUP_CHAT_USER_ADD".$projectSuffix.$genderSuffix)); } else { $sendMessage = false; } break; case self::CHAT_ACTION_OUT: if ($chat->deleteUser($chatId, $userId, false, true)) { $chatMessage = str_replace('#USER_NAME#', $userName, Loc::getMessage("SOCIALNETWORK_ITEM_USERTOGROUP_CHAT_USER_DELETE".$projectSuffix.$genderSuffix)); } else { $sendMessage = false; } break; default: $chatMessage = ''; $sendMessage = false; } if ($sendMessage) { $chatMessageFields = array( "MESSAGE" => $chatMessage, "SYSTEM" => "Y", "INCREMENT_COUNTER" => "N", "PUSH" => "N" ); $availableChatData = Integration\Im\Chat\Workgroup::getChatData(array( 'group_id' => $groupId )); if ( !empty($availableChatData) && !empty($availableChatData[$groupId]) && intval($availableChatData[$groupId]) > 0 ) { return \CIMChat::addMessage(array_merge( $chatMessageFields, array( "TO_CHAT_ID" => $chatId ) )); } } else { return true; } return false; } private static function getChatActionList() { return array(self::CHAT_ACTION_IN, self::CHAT_ACTION_OUT); } public static function addModerators($params = array()) { global $USER, $DB; $result = false; if ( !array($params) || !isset($params['group_id']) || intval($params['group_id']) <= 0 || !isset($params['user_id']) || empty($params['user_id']) ) { return $result; } $groupId = intval($params['group_id']); $userIdList = ( is_array($params['user_id']) ? $params['user_id'] : array($params['user_id']) ); $currentUserId = ( isset($params['current_user_id']) && intval($params['current_user_id']) > 0 ? intval($params['current_user_id']) : ( is_object($USER) && $USER->isAuthorized() ? $USER->getId() : false ) ); if (!$currentUserId) { return $result; } $ownerRelationIdList = $memberRelationIdList = $otherRelationIdList = array(); $resRelation = UserToGroupTable::getList(array( 'filter' => array( 'GROUP_ID' => $groupId, '@USER_ID' => $userIdList ), 'select' => array('ID', 'USER_ID', 'ROLE') )); while($relation = $resRelation->fetch()) { if ($relation['ROLE'] == UserToGroupTable::ROLE_USER) { $memberRelationIdList[$relation['USER_ID']] = $relation['ID']; } elseif ($relation['ROLE'] == UserToGroupTable::ROLE_OWNER) { $ownerRelationIdList[$relation['USER_ID']] = $relation['ID']; } else { $otherRelationIdList[$relation['USER_ID']] = $relation['ID']; } } if (!empty($memberRelationIdList)) { \CSocNetUserToGroup::transferMember2Moderator($currentUserId, $groupId, $memberRelationIdList, \CSocNetUser::isCurrentUserModuleAdmin()); } foreach($userIdList as $userId) { if ( !array_key_exists($userId, $memberRelationIdList) && !array_key_exists($userId, $ownerRelationIdList) ) { if (array_key_exists($userId, $otherRelationIdList)) { \CSocNetUserToGroup::update($otherRelationIdList[$userId], array( "ROLE" => UserToGroupTable::ROLE_MODERATOR, "=DATE_UPDATE" => $DB->currentTimeFunction(), )); } else { \CSocNetUserToGroup::add(array( "USER_ID" => $userId, "GROUP_ID" => $groupId, "ROLE" => UserToGroupTable::ROLE_MODERATOR, "=DATE_CREATE" => $DB->currentTimeFunction(), "=DATE_UPDATE" => $DB->currentTimeFunction(), "MESSAGE" => "", "INITIATED_BY_TYPE" => UserToGroupTable::INITIATED_BY_GROUP, "INITIATED_BY_USER_ID" => $currentUserId, "SEND_MAIL" => "N" )); } } } $result = true; return $result; } }