isFan($oGroupProfile->getContentId(), $iProfileId); } /** * Delete profile from fans and admins tables * @param $iProfileId profile id */ public function serviceDeleteProfileFromFansAndAdmins ($iProfileId) { $CNF = &$this->_oConfig->CNF; $this->_oDb->deleteAdminsByProfileId($iProfileId); if (isset($CNF['OBJECT_CONNECTIONS']) && ($oConnection = BxDolConnection::getObjectInstance($CNF['OBJECT_CONNECTIONS']))) $oConnection->onDeleteInitiatorAndContent($iProfileId); } /** * Reset group's author for particular group * @param $iContentId group id * @return false of error, or number of updated records on success */ public function serviceReassignEntityAuthor ($iContentId) { $aContentInfo = $this->_oDb->getContentInfoById((int)$iContentId); if (!$aContentInfo) return false; if (!($oGroupProfile = BxDolProfile::getInstanceByContentAndType($iContentId, $this->getName()))) return false; $aAdmins = $this->_oDb->getAdmins($oGroupProfile->id()); return $this->_oDb->updateAuthorById($iContentId, $aAdmins ? array_pop($aAdmins) : 0); } /** * Reset group's author when author profile is deleted * @param $iProfileId profile id * @return number of changed items */ public function serviceReassignEntitiesByAuthor ($iProfileId) { $a = $this->_oDb->getEntriesByAuthor((int)$iProfileId); if (!$a) return 0; $iCount = 0; foreach ($a as $aContentInfo) $iCount += ('' == $this->serviceReassignEntityAuthor($aContentInfo[$this->_oConfig->CNF['FIELD_ID']]) ? 1 : 0); return $iCount; } public function servicePrepareFields ($aFieldsProfile) { $CNF = &$this->_oConfig->CNF; $aFieldsProfile[$CNF['FIELD_NAME']] = $aFieldsProfile['name']; $aFieldsProfile[$CNF['FIELD_TEXT']] = isset($aFieldsProfile['description']) ? $aFieldsProfile['description'] : ''; unset($aFieldsProfile['name']); unset($aFieldsProfile['description']); return $aFieldsProfile; } public function serviceOnRemoveConnection ($iGroupProfileId, $iInitiatorId) { $CNF = &$this->_oConfig->CNF; list ($iProfileId, $iGroupProfileId, $oGroupProfile) = $this->_prepareProfileAndGroupProfile($iGroupProfileId, $iInitiatorId); if (!$oGroupProfile) return false; $this->_oDb->fromAdmins($iGroupProfileId, $iProfileId); if ($oConn = BxDolConnection::getObjectInstance('sys_profiles_subscriptions')) $oConn->removeConnection($iProfileId, $iGroupProfileId); } public function serviceAddMutualConnection ($iGroupProfileId, $iInitiatorId, $iIgnoreJoinConfirmation = false) { $CNF = &$this->_oConfig->CNF; list ($iProfileId, $iGroupProfileId, $oGroupProfile) = $this->_prepareProfileAndGroupProfile($iGroupProfileId, $iInitiatorId); if (!$oGroupProfile) return false; if (!($aContentInfo = $this->_oDb->getContentInfoById((int)BxDolProfile::getInstance($iGroupProfileId)->getContentId()))) return false; if (!($oConnection = BxDolConnection::getObjectInstance($CNF['OBJECT_CONNECTIONS']))) return false; $sEntryTitle = $aContentInfo[$CNF['FIELD_NAME']]; $sEntryUrl = BX_DOL_URL_ROOT . BxDolPermalinks::getInstance()->permalink('page.php?i=' . $CNF['URI_VIEW_ENTRY'] . '&id=' . $aContentInfo[$CNF['FIELD_ID']]); // send invitation to the group if ($iIgnoreJoinConfirmation && !$oConnection->isConnected((int)$iInitiatorId, $oGroupProfile->id()) && !$oConnection->isConnected($oGroupProfile->id(), (int)$iInitiatorId) && bx_get_logged_profile_id() != $iProfileId) { bx_alert($this->getName(), 'join_invitation', $aContentInfo[$CNF['FIELD_ID']], $iGroupProfileId, array('content' => $aContentInfo, 'entry_title' => $sEntryTitle, 'entry_url' => $sEntryUrl, 'group_profile' => $iGroupProfileId, 'profile' => $iProfileId, 'notification_subobject_id' => $iProfileId, 'object_author_id' => $iGroupProfileId)); } // send notification to group's admins that new connection is pending confirmation elseif (!$iIgnoreJoinConfirmation && $oConnection->isConnected((int)$iInitiatorId, $oGroupProfile->id()) && !$oConnection->isConnected($oGroupProfile->id(), (int)$iInitiatorId) && $aContentInfo['join_confirmation']) { bx_alert($this->getName(), 'join_request', $aContentInfo[$CNF['FIELD_ID']], $iGroupProfileId, array('content' => $aContentInfo, 'entry_title' => $sEntryTitle, 'entry_url' => $sEntryUrl, 'group_profile' => $iGroupProfileId, 'profile' => $iProfileId, 'notification_subobject_id' => $iProfileId, 'object_author_id' => $iGroupProfileId)); } // send notification that join request was accepted else if (!$iIgnoreJoinConfirmation && $oConnection->isConnected((int)$iInitiatorId, $oGroupProfile->id(), true) && $oGroupProfile->getModule() != $this->getName() && bx_get_logged_profile_id() != $iProfileId) { bx_alert($this->getName(), 'join_request_accepted', $aContentInfo[$CNF['FIELD_ID']], $iGroupProfileId, array('content' => $aContentInfo, 'entry_title' => $sEntryTitle, 'entry_url' => $sEntryUrl, 'group_profile' => $iGroupProfileId, 'profile' => $iProfileId, 'notification_subobject_id' => $iProfileId, 'object_author_id' => $iGroupProfileId)); } // new fan was added if ($oConnection->isConnected($oGroupProfile->id(), (int)$iInitiatorId, true)) { bx_alert($this->getName(), 'fan_added', $aContentInfo[$CNF['FIELD_ID']], $iGroupProfileId, array('content' => $aContentInfo, 'entry_title' => $sEntryTitle, 'entry_url' => $sEntryUrl, 'group_profile' => $iGroupProfileId, 'profile' => $iProfileId, 'notification_subobject_id' => $iProfileId, 'object_author_id' => $iGroupProfileId)); return false; } // don't automatically add back connection (mutual) if group requires manual join confirmation if (!$iIgnoreJoinConfirmation && $aContentInfo['join_confirmation']) return false; // check if connection already exists if ($oConnection->isConnected($oGroupProfile->id(), (int)$iInitiatorId, true) || $oConnection->isConnected($oGroupProfile->id(), (int)$iInitiatorId)) return false; if (!$oConnection->addConnection($oGroupProfile->id(), (int)$iInitiatorId)) return false; return true; } public function serviceFansTable () { $oGrid = BxDolGrid::getObjectInstance($this->_oConfig->CNF['OBJECT_GRID_CONNECTIONS']); if (!$oGrid) return false; return $oGrid->getCode(); } public function serviceFans ($iContentId = 0) { if (!$iContentId) $iContentId = bx_process_input(bx_get('id'), BX_DATA_INT); if (!$iContentId) return false; $aContentInfo = $this->_oDb->getContentInfoById($iContentId); if (!$aContentInfo) return false; if (!($oGroupProfile = BxDolProfile::getInstanceByContentAndType($iContentId, $this->getName()))) return false; bx_import('BxDolConnection'); $s = $this->serviceBrowseConnectionsQuick ($oGroupProfile->id(), $this->_oConfig->CNF['OBJECT_CONNECTIONS'], BX_CONNECTIONS_CONTENT_TYPE_CONTENT, true); if (!$s) return MsgBox(_t('_sys_txt_empty')); return $s; } public function serviceAdmins ($iContentId = 0) { $CNF = &$this->_oConfig->CNF; if(!$iContentId) $iContentId = bx_process_input(bx_get('id'), BX_DATA_INT); if(!$iContentId) return false; $oGroupProfile = BxDolProfile::getInstanceByContentAndType($iContentId, $this->getName()); if(!$oGroupProfile) return false; $aProfiles = $this->_oDb->getAdmins($oGroupProfile->id()); if(empty($aProfiles) || !is_array($aProfiles)) return false; $iStart = (int)bx_get('start'); $iLimit = !empty($CNF['PARAM_NUM_CONNECTIONS_QUICK']) ? getParam($CNF['PARAM_NUM_CONNECTIONS_QUICK']) : 4; if(!$iLimit) $iLimit = 4; return $this->_serviceBrowseQuick($aProfiles, $iStart, $iLimit); } public function serviceBrowseJoinedEntries ($iProfileId = 0, $bDisplayEmptyMsg = false) { if (!$iProfileId) $iProfileId = bx_process_input(bx_get('profile_id'), BX_DATA_INT); if (!$iProfileId) return ''; return $this->_serviceBrowse ('joined_entries', array('joined_profile' => $iProfileId), BX_DB_PADDING_DEF, $bDisplayEmptyMsg); } public function serviceEntityInvite ($iContentId = 0) { return $this->_serviceEntityForm ('editDataForm', $iContentId, $this->_oConfig->CNF['OBJECT_FORM_ENTRY_DISPLAY_INVITE']); } /** * Entry social sharing block */ public function serviceEntitySocialSharing ($iContentId = 0) { if (!$iContentId) $iContentId = bx_process_input(bx_get('id'), BX_DATA_INT); if (!$iContentId) return false; $aContentInfo = $this->_oDb->getContentInfoById($iContentId); if (!$aContentInfo) return false; $oGroupProfile = BxDolProfile::getInstanceByContentAndType((int)$iContentId, $this->getName()); if (!$oGroupProfile) return false; $CNF = &$this->_oConfig->CNF; return $this->_entitySocialSharing ($iContentId, array( 'id_timeline' => $iContentId, 'id_thumb' => 0, 'title' => $oGroupProfile->getDisplayName(), 'object_storage' => false, 'object_transcoder' => false, 'object_vote' => $CNF['OBJECT_VOTES'], 'object_favorite' => $CNF['OBJECT_FAVORITES'], 'object_feature' => $CNF['OBJECT_FEATURED'], 'object_report' => $CNF['OBJECT_REPORTS'], 'uri_view_entry' => $CNF['URI_VIEW_ENTRY'] )); } /** * Data for Notifications module */ public function serviceGetNotificationsData() { $sModule = $this->_aModule['name']; return array( 'handlers' => array( array('group' => $sModule . '_vote', 'type' => 'insert', 'alert_unit' => $sModule, 'alert_action' => 'doVote', 'module_name' => $sModule, 'module_method' => 'get_notifications_vote', 'module_class' => 'Module'), array('group' => $sModule . '_vote', 'type' => 'delete', 'alert_unit' => $sModule, 'alert_action' => 'undoVote'), array('group' => $sModule . '_fan_added', 'type' => 'insert', 'alert_unit' => $sModule, 'alert_action' => 'fan_added', 'module_name' => $sModule, 'module_method' => 'get_notifications_fan_added', 'module_class' => 'Module'), array('group' => $sModule . '_join_request', 'type' => 'insert', 'alert_unit' => $sModule, 'alert_action' => 'join_request', 'module_name' => $sModule, 'module_method' => 'get_notifications_join_request', 'module_class' => 'Module', 'module_event_privacy' => $this->_oConfig->CNF['OBJECT_PRIVACY_VIEW_NOTIFICATION_EVENT']), array('group' => $sModule . '_timeline_post_common', 'type' => 'insert', 'alert_unit' => $sModule, 'alert_action' => 'timeline_post_common', 'module_name' => $sModule, 'module_method' => 'get_notifications_timeline_post_common', 'module_class' => 'Module'), ), 'alerts' => array( array('unit' => $sModule, 'action' => 'doVote'), array('unit' => $sModule, 'action' => 'undoVote'), array('unit' => $sModule, 'action' => 'fan_added'), array('unit' => $sModule, 'action' => 'join_request'), array('unit' => $sModule, 'action' => 'timeline_post_common'), ) ); } /** * Notification about new member requst in the group */ public function serviceGetNotificationsJoinRequest($aEvent) { return $this->_serviceGetNotification($aEvent, $this->_oConfig->CNF['T']['txt_ntfs_join_request']); } /** * Notification about new member in the group */ public function serviceGetNotificationsFanAdded($aEvent) { return $this->_serviceGetNotification($aEvent, $this->_oConfig->CNF['T']['txt_ntfs_fan_added']); } /** * Entry post for Timeline module */ public function serviceGetTimelinePost($aEvent, $aBrowseParams = array()) { $a = parent::serviceGetTimelinePost($aEvent, $aBrowseParams); $oGroupProfile = BxDolProfile::getInstanceByContentAndType($aEvent['object_id'], $this->getName()); $a['content']['url'] = $oGroupProfile->getUrl(); $a['content']['title'] = $oGroupProfile->getDisplayName(); return $a; } /** * @return CHECK_ACTION_RESULT_ALLOWED if access is granted or error message if access is forbidden. */ public function checkAllowedViewCoverImage ($aDataEntry, $isPerformAction = false) { $oPrivacy = BxDolPrivacy::getObjectInstance($this->_oConfig->CNF['OBJECT_PRIVACY_VIEW']); if (CHECK_ACTION_RESULT_ALLOWED !== ($sMsg = parent::checkAllowedViewCoverImage($aDataEntry)) && $oPrivacy->isPartiallyVisible($aDataEntry[$this->_oConfig->CNF['FIELD_ALLOW_VIEW_TO']])) return CHECK_ACTION_RESULT_ALLOWED; return $sMsg; } /** * @return CHECK_ACTION_RESULT_ALLOWED if access is granted or error message if access is forbidden. */ public function checkAllowedViewProfileImage ($aDataEntry, $isPerformAction = false) { return $this->checkAllowedViewCoverImage($aDataEntry, $isPerformAction); } /** * @return CHECK_ACTION_RESULT_ALLOWED if access is granted or error message if access is forbidden. */ public function checkAllowedPost ($aDataEntry, $isPerformAction = false) { if ($this->isFan($aDataEntry[$this->_oConfig->CNF['FIELD_ID']])) return CHECK_ACTION_RESULT_ALLOWED; return _t('_sys_txt_access_denied'); } /** * @return CHECK_ACTION_RESULT_ALLOWED if access is granted or error message if access is forbidden. */ public function checkAllowedView ($aDataEntry, $isPerformAction = false) { if ($this->isFan($aDataEntry[$this->_oConfig->CNF['FIELD_ID']])) return CHECK_ACTION_RESULT_ALLOWED; return parent::checkAllowedView ($aDataEntry, $isPerformAction); } /** * @return CHECK_ACTION_RESULT_ALLOWED if access is granted or error message if access is forbidden. */ public function checkAllowedCompose (&$aDataEntry, $isPerformAction = false) { if (!$this->isFan($aDataEntry[$this->_oConfig->CNF['FIELD_ID']])) return _t('_sys_txt_access_denied'); return parent::checkAllowedCompose ($aDataEntry, $isPerformAction); } /** * @return CHECK_ACTION_RESULT_ALLOWED if access is granted or error message if access is forbidden. */ public function checkAllowedFanAdd (&$aDataEntry, $isPerformAction = false) { if ($this->isFan($aDataEntry[$this->_oConfig->CNF['FIELD_ID']]) || !isLogged()) return _t('_sys_txt_access_denied'); return $this->_checkAllowedConnect ($aDataEntry, $isPerformAction, $this->_oConfig->CNF['OBJECT_CONNECTIONS'], true, false); } /** * @return CHECK_ACTION_RESULT_ALLOWED if access is granted or error message if access is forbidden. */ public function checkAllowedFanRemove (&$aDataEntry, $isPerformAction = false) { if (CHECK_ACTION_RESULT_ALLOWED === $this->_checkAllowedConnect ($aDataEntry, $isPerformAction, $this->_oConfig->CNF['OBJECT_CONNECTIONS'], false, true, true)) return CHECK_ACTION_RESULT_ALLOWED; return $this->_checkAllowedConnect ($aDataEntry, $isPerformAction, $this->_oConfig->CNF['OBJECT_CONNECTIONS'], false, true, false); } public function checkAllowedManageAdmins ($mixedDataEntry, $isPerformAction = false) { if (is_array($mixedDataEntry)) { $aDataEntry = $mixedDataEntry; } else { $oGroupProfile = BxDolProfile::getInstance((int)$mixedDataEntry); $aDataEntry = $oGroupProfile && $this->getName() == $oGroupProfile->getModule() ? $this->_oDb->getContentInfoById($oGroupProfile->getContentId()) : array(); } return parent::checkAllowedEdit ($aDataEntry, $isPerformAction); } public function checkAllowedEdit ($aDataEntry, $isPerformAction = false) { $oGroupProfile = BxDolProfile::getInstanceByContentAndType($aDataEntry[$this->_oConfig->CNF['FIELD_ID']], $this->getName()); if ($this->_oDb->isAdmin($oGroupProfile->id(), bx_get_logged_profile_id(), $aDataEntry)) return CHECK_ACTION_RESULT_ALLOWED; return parent::checkAllowedEdit ($aDataEntry, $isPerformAction); } public function checkAllowedInvite ($aDataEntry, $isPerformAction = false) { return $this->checkAllowedEdit ($aDataEntry, $isPerformAction); } public function checkAllowedChangeCover ($aDataEntry, $isPerformAction = false) { $oGroupProfile = BxDolProfile::getInstanceByContentAndType($aDataEntry[$this->_oConfig->CNF['FIELD_ID']], $this->getName()); if ($this->_oDb->isAdmin($oGroupProfile->id(), bx_get_logged_profile_id(), $aDataEntry)) return CHECK_ACTION_RESULT_ALLOWED; return parent::checkAllowedChangeCover ($aDataEntry, $isPerformAction); } public function checkAllowedDelete (&$aDataEntry, $isPerformAction = false) { $oGroupProfile = BxDolProfile::getInstanceByContentAndType($aDataEntry[$this->_oConfig->CNF['FIELD_ID']], $this->getName()); if ($oGroupProfile && $this->_oDb->isAdmin($oGroupProfile->id(), bx_get_logged_profile_id(), $aDataEntry)) return CHECK_ACTION_RESULT_ALLOWED; return parent::checkAllowedDelete ($aDataEntry, $isPerformAction); } public function checkAllowedSubscribeAdd (&$aDataEntry, $isPerformAction = false) { if (!$this->isFan($aDataEntry[$this->_oConfig->CNF['FIELD_ID']])) return _t('_sys_txt_access_denied'); return parent::checkAllowedSubscribeAdd ($aDataEntry, $isPerformAction); } protected function _checkAllowedConnect (&$aDataEntry, $isPerformAction, $sObjConnection, $isMutual, $isInvertResult, $isSwap = false) { $sResult = $this->checkAllowedView($aDataEntry); $oPrivacy = BxDolPrivacy::getObjectInstance($this->_oConfig->CNF['OBJECT_PRIVACY_VIEW']); if (CHECK_ACTION_RESULT_ALLOWED !== $sResult && !$oPrivacy->isPartiallyVisible($aDataEntry[$this->_oConfig->CNF['FIELD_ALLOW_VIEW_TO']])) return $sResult; return parent::_checkAllowedConnect ($aDataEntry, $isPerformAction, $sObjConnection, $isMutual, $isInvertResult, $isSwap); } public function isFan ($iContentId, $iProfileId = false) { $oGroupProfile = BxDolProfile::getInstanceByContentAndType($iContentId, $this->getName()); return $oGroupProfile && ($oConnection = BxDolConnection::getObjectInstance($this->_oConfig->CNF['OBJECT_CONNECTIONS'])) && $oConnection->isConnected($iProfileId ? $iProfileId : bx_get_logged_profile_id(), $oGroupProfile->id(), true); } protected function _getImagesForTimelinePost($aEvent, $aContentInfo, $sUrl, $aBrowseParams = array()) { $CNF = &$this->_oConfig->CNF; if(empty($aContentInfo[$CNF['FIELD_PICTURE']])) return array(); $oGroupProfile = BxDolProfile::getInstanceByContentAndType($aEvent['object_id'], $this->getName()); return array( array('url' => $sUrl, 'src' => $oGroupProfile->getPicture()), ); } protected function _prepareProfileAndGroupProfile($iGroupProfileId, $iInitiatorId) { if (!($oGroupProfile = BxDolProfile::getInstance($iGroupProfileId))) return array(0, 0, null); if ($oGroupProfile->getModule() == $this->getName()) { $iProfileId = $iInitiatorId; $iGroupProfileId = $oGroupProfile->id(); } else { $iProfileId = $oGroupProfile->id(); $iGroupProfileId = $iInitiatorId; } return array($iProfileId, $iGroupProfileId, $oGroupProfile); } } /** @} */