/** * * @see XenResource_DataWriter_Resource::_insertDiscussionThread() */ protected function _insertDiscussionThread($nodeId, $prefixId = 0) { /* @var $nodeModel XenForo_Model_Node */ $nodeModel = $this->getModelFromCache('XenForo_Model_Node'); $node = $nodeModel->getNodeById($nodeId); if (!$node) { return false; } if ($node['node_type_id'] == 'SocialCategory') { $socialForumId = 0; if (isset($GLOBALS['XenResource_ControllerPublic_Resource'])) { /* @var $controller XenResource_ControllerPublic_Resource */ $controller = $GLOBALS['XenResource_ControllerPublic_Resource']; $socialForumId = $controller->getInput()->filterSingle('social_forum_id', XenForo_Input::UINT); } if ($socialForumId) { $socialForumModel = ThemeHouse_SocialGroups_SocialForum::getSocialForumModel(); $socialForum = $socialForumModel->getSocialForumById($socialForumId); } if (!empty($socialForum) && $socialForum['node_id'] == $node['node_id']) { ThemeHouse_SocialGroups_SocialForum::setup($socialForum); // TODO check permissions } else { $writer = XenForo_DataWriter::create('ThemeHouse_SocialGroups_DataWriter_SocialForum'); $writer->bulkSet(array('node_id' => $nodeId, 'user_id' => XenForo_Visitor::getUserId(), 'title' => $this->_getThreadTitle(), 'description' => $this->get('tag_line'), 'social_forum_type' => 'resource')); $writer->save(); ThemeHouse_SocialGroups_SocialForum::setup($writer->getMergedData()); $this->set('social_forum_id', $writer->get('social_forum_id'), '', array('setAfterPreSave' => true)); } } return parent::_insertDiscussionThread($nodeId, $prefixId); }
public function rebuildSocialForumCombination(array $socialForumCombination, array $socialForums = null) { $socialForumIds = explode(',', $socialForumCombination['social_forum_ids']); if (is_null($socialForums)) { $socialForumModel = ThemeHouse_SocialGroups_SocialForum::getSocialForumModel(); $socialForums = $socialForumModel->getSocialForumsByIds($socialForumIds); $socialForums = $this->_prepareSocialForumsForCombination($socialForums); } else { foreach ($socialForums as $socialForumId => $socialForum) { if (!in_array($socialForumId, $socialForumIds)) { unset($socialForums[$socialForumId]); } } if ($socialForums) { $socialForums = $this->_prepareSocialForumsForCombination($socialForums); } } $socialForumCombination['social_forum_ids'] = implode(',', array_keys($socialForums)); $cacheValue = serialize($socialForums); $this->_getDb()->query(' INSERT INTO xf_social_forum_combination (social_forum_combination_id, social_forum_ids, cache_value) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE social_forum_ids = VALUES(social_forum_ids), cache_value = VALUES(cache_value) ', array($socialForumCombination['social_forum_combination_id'], $socialForumCombination['social_forum_ids'], $cacheValue)); }
/** * Rebuilds the data. * * @see XenForo_CacheRebuilder_Abstract::rebuild() */ public function rebuild($position = 0, array &$options = array(), &$detailedMessage = '') { $options['batch'] = max(1, isset($options['batch']) ? $options['batch'] : 10); $socialForumModel = ThemeHouse_SocialGroups_SocialForum::getSocialForumModel(); if ($position == 0) { $socialForumModel->unlinkMovedThreads(); } $socialForums = $socialForumModel->getSocialForums(array(), array('limit' => $options['batch'], 'offset' => $position)); XenForo_Db::beginTransaction(); foreach ($socialForums as $socialForum) { $position++; /* @var $socialForumDw ThemeHouse_SocialGroups_DataWriter_SocialForum */ $socialForumDw = XenForo_DataWriter::create('ThemeHouse_SocialGroups_DataWriter_SocialForum', XenForo_DataWriter::ERROR_SILENT); if ($socialForumDw->setExistingData($socialForum, true)) { $socialForumDw->rebuildCounters(); $socialForumDw->save(); } } XenForo_Db::commit(); $detailedMessage = XenForo_Locale::numberFormat($position); if (!$socialForums) { return true; } else { return $position; } }
/** * * @see XenForo_Model_ThreadWatch::getUsersWatchingThread() */ public function getUsersWatchingThread($threadId, $nodeId) { $users = parent::getUsersWatchingThread($threadId, $nodeId); /* @var $threadModel XenForo_Model_Thread */ $threadModel = $this->getModelFromCache('XenForo_Model_Thread'); $thread = $threadModel->getThreadById($threadId); if (!empty($thread['social_forum_id'])) { /* @var $socialForumMemberModel ThemeHouse_SocialGroups_Model_SocialForumMember */ $socialForumMemberModel = $this->getModelFromCache('ThemeHouse_SocialGroups_Model_SocialForumMember'); $socialForumMembers = $socialForumMemberModel->getSocialForumUsers(array('user_ids' => array_keys($users), 'social_forum_id' => $thread['social_forum_id'])); $socialForumModel = ThemeHouse_SocialGroups_SocialForum::getSocialForumModel(); foreach ($users as $userId => &$user) { if (!empty($socialForumMembers[$userId])) { $user = array_merge($user, $socialForumMembers[$userId]); } else { continue; } $permissions = array(); if (!empty($user['node_permission_cache'])) { $permissions = unserialize($user['node_permission_cache']); } $nodePermissionCache = $socialForumModel->getSocialForumPermissions($user, $permissions); $user['node_permission_cache'] = serialize($nodePermissionCache); } } return $users; }
/** * @param array $options * @param int $page * @return array */ public function getModule($options, $page) { $socialForumModel = ThemeHouse_SocialGroups_SocialForum::getSocialForumModel(); $params['socialForums'] = $socialForumModel->getSocialForums(array(), array('limit' => isset($options['limit']) ? $options['limit'] : 5, 'order' => 'created_date')); foreach ($params['socialForums'] as &$forum) { $forum['urls'] = ThemeHouse_SocialGroups_Template_Helper_SocialForum::getAvatarUrls($forum); } return $params; }
/** * * @see XenForo_ControllerAdmin_Notice::_getNoticeAddEditResponse() */ protected function _getNoticeAddEditResponse(array $notice) { /* @var $response XenForo_ControllerResponse_View */ $response = parent::_getNoticeAddEditResponse($notice); /* @var $socialForumModel ThemeHouse_SocialGroups_Model_SocialForum */ $socialForumModel = ThemeHouse_SocialGroups_SocialForum::getSocialForumModel(); $response->params['pageCriteriaData']['socialForums'] = $socialForumModel->getSocialForums(array()); return $response; }
/** * * @see XenForo_DataWriter_User::_preSave() */ protected function _preSave() { parent::_preSave(); if (!empty($GLOBALS['XenForo_ControllerAdmin_Tools']) || !empty($GLOBALS['XenForo_Deferred_User'])) { if ($this->get('user_id')) { /* @var $socialForumModel ThemeHouse_SocialGroups_Model_SocialForum */ $socialForumModel = ThemeHouse_SocialGroups_SocialForum::getSocialForumModel(); $this->set('social_forums_joined', $socialForumModel->countJoinedSocialForumsForUser($this->get('user_id'))); $this->set('social_forums_created', $socialForumModel->countSocialForums(array('creator_id' => $this->get('user_id')))); } } if (!empty($GLOBALS['XenForo_ControllerPublic_Account'])) { /* @var $controller XenForo_ControllerPublic_Account */ $controller = $GLOBALS['XenForo_ControllerPublic_Account']; if ($controller->getRouteMatch()->getAction() == 'personal-details-save') { $primarySocialForumId = 0; $secondarySocialForumIds = array(); $xenOptions = XenForo_Application::get('options'); if ($xenOptions->th_socialGroups_allowPrimary) { $primarySocialForumId = $controller->getInput()->filterSingle('primary_social_forum_id', XenForo_Input::UINT); } if ($xenOptions->th_socialGroups_allowSecondary) { $secondarySocialForumIds = $controller->getInput()->filterSingle('secondary_social_forum_ids', XenForo_Input::ARRAY_SIMPLE); } if ($primarySocialForumId && in_array($primarySocialForumId, $secondarySocialForumIds)) { unset($secondarySocialForumIds[array_search($primarySocialForumId, $secondarySocialForumIds)]); } $maxSecondarySocialForums = $this->_getUserModel()->getMaximumSecondarySocialForums(); if (count($secondarySocialForumIds) > $maxSecondarySocialForums) { $secondarySocialForumIds = array_slice($secondarySocialForumIds, 0, $maxSecondarySocialForums); } $secondarySocialForumIds = implode(",", $secondarySocialForumIds); $this->set('primary_social_forum_id', $primarySocialForumId); $this->set('secondary_social_forum_ids', $secondarySocialForumIds); } } if ($this->isChanged('secondary_social_forum_ids') || !empty($GLOBALS['XenForo_Deferred_User'])) { $secondarySocialForumIds = $this->get('secondary_social_forum_ids'); /* @var $socialForumCombinationModel ThemeHouse_SocialGroups_Model_SocialForumCombination */ $socialForumCombinationModel = XenForo_Model::create('ThemeHouse_SocialGroups_Model_SocialForumCombination'); $socialForumCombinationId = $socialForumCombinationModel->getSocialForumCombinationBySocialForumIds($secondarySocialForumIds); $this->set('social_forum_combination_id', $socialForumCombinationId); if ($socialForumCombinationId) { $socialForumCombination = array('social_forum_combination_id' => $socialForumCombinationId, 'social_forum_ids' => $secondarySocialForumIds); $socialForumCombinationModel->rebuildSocialForumCombination($socialForumCombination); } } }
/** * List of all new watched content. * * @return XenForo_ControllerResponse_Abstract */ public function actionSocialForums() { /* @var $socialForumModel ThemeHouse_SocialGroups_Model_SocialForum */ $socialForumModel = ThemeHouse_SocialGroups_SocialForum::getSocialForumModel(); $forumWatchModel = $this->_getForumWatchModel(); $visitor = XenForo_Visitor::getInstance(); $socialForumsWatched = $forumWatchModel->getUserSocialForumWatchByUser($visitor['user_id']); $socialForumIds = array_keys($socialForumsWatched); $fetchOptions = array('join' => ThemeHouse_SocialGroups_Model_SocialForum::FETCH_SOCIAL_MEMBER | ThemeHouse_SocialGroups_Model_SocialForum::FETCH_AVATAR, 'readUserId' => $visitor['user_id']); $socialForums = $socialForumModel->getSocialForumsByIds($socialForumIds, $fetchOptions); foreach ($socialForums as &$socialForum) { $socialForum = $socialForumModel->prepareSocialForum($socialForum); } $viewParams = array('socialForums' => $socialForums, 'socialForumsWatched' => $socialForumsWatched); return $this->responseView('ThemeHouse_SocialGroups_ViewPublic_Watched_SocialForums', 'th_watch_social_forums_socialgroups', $viewParams); }
/** * * @see XenForo_Model_Post::canViewPostAndContainer() */ public function canViewPostAndContainer(array $post, array $thread, array $forum, &$errorPhraseKey = '', array $nodePermissions = null, array $viewingUser = null) { if (isset($thread['social_forum_id']) && $thread['social_forum_id']) { $socialForumModel = ThemeHouse_SocialGroups_SocialForum::getSocialForumModel(); $fetchOptions = array('join' => ThemeHouse_SocialGroups_Model_SocialForum::FETCH_SOCIAL_MEMBER); $socialForum = $socialForumModel->getCurrentSocialForumById($thread['social_forum_id'], $fetchOptions); if (isset($socialForum['social_forum_id'])) { $socialForumMembers = XenForo_Model::create('ThemeHouse_SocialGroups_Model_SocialForumMember')->getSocialForumUsers(array('social_forum_id' => $socialForum['social_forum_id'])); $resetNodePermissions = XenForo_Visitor::getInstance()->getNodePermissions($forum['node_id']); $nodePermissions = $socialForumModel->getNodePermissions($socialForum, $socialForumMembers); XenForo_Visitor::getInstance()->setNodePermissions($forum['node_id'], $nodePermissions); } } $return = parent::canViewPostAndContainer($post, $thread, $forum, $errorPhraseKey, $nodePermissions, $viewingUser); if (isset($resetNodePermissions)) { XenForo_Visitor::getInstance()->setNodePermissions($forum['node_id'], $resetNodePermissions); } return $return; }
/** * Gets visible moderation queue entries for specified user. * * @see XenForo_ModerationQueueHandler_Abstract::getVisibleModerationQueueEntriesForUser() */ public function getVisibleModerationQueueEntriesForUser(array $contentIds, array $viewingUser) { $socialForumModel = ThemeHouse_SocialGroups_SocialForum::getSocialForumModel(); $socialForums = $socialForumModel->getSocialForumsByIds($contentIds, array('join' => ThemeHouse_SocialGroups_Model_SocialForum::FETCH_FORUM | ThemeHouse_SocialGroups_Model_SocialForum::FETCH_USER, 'permissionCombinationId' => $viewingUser['permission_combination_id'])); $output = array(); foreach ($socialForums as $socialForum) { $socialForum['permissions'] = XenForo_Permission::unserializePermissions($socialForum['node_permission_cache']); $canManage = true; if (!$socialForumModel->canViewSocialForum($socialForum, $null, $socialForum['permissions'], $viewingUser)) { $canManage = false; } elseif (!XenForo_Permission::hasContentPermission($socialForum['permissions'], 'editSocialForum') || !XenForo_Permission::hasContentPermission($socialForum['permissions'], 'deleteSocialForum')) { $canManage = false; } if ($canManage) { $output[$socialForum['social_forum_id']] = array('message' => $socialForum['description'], 'user' => array('user_id' => $socialForum['user_id'], 'username' => $socialForum['username']), 'title' => $socialForum['title'], 'link' => XenForo_Link::buildPublicLink('social-forums', $socialForum), 'contentTypeTitle' => new XenForo_Phrase('th_social_forum_socialgroups'), 'titleEdit' => true); } } return $output; }
protected function _preSave() { if (isset($GLOBALS['ThemeHouse_SocialGroups_ControllerPublic_SocialForum']) || isset($GLOBALS['ThemeHouse_SocialGroups_ControllerPublic_SocialCategory'])) { if (isset($GLOBALS['ThemeHouse_SocialGroups_ControllerPublic_SocialForum'])) { /* @var $controller ThemeHouse_SocialGroups_ControllerPublic_SocialForum */ $controller = $GLOBALS['ThemeHouse_SocialGroups_ControllerPublic_SocialForum']; } else { /* @var $controller ThemeHouse_SocialGroups_ControllerPublic_SocialCategory */ $controller = $GLOBALS['ThemeHouse_SocialGroups_ControllerPublic_SocialCategory']; } $socialPermissionSetId = $controller->getInput()->filterSingle('social_permission_set_id', XenForo_Input::UINT); $this->set('social_permission_set_id_th', $socialPermissionSetId); } if ($this->isChanged('social_permission_set_id_th') && !$this->get('social_permission_set_id_th')) { $socialForumModel = ThemeHouse_SocialGroups_SocialForum::getSocialForumModel(); $socialCategory = $this->_getSocialCategoryData(); if (!$socialForumModel->canManageSocialPermissions(array(), $socialCategory)) { $this->error(new XenForo_Phrase('th_must_select_social_permission_set_socialperms')); } } parent::_preSave(); }
/** * * @return ThemeHouse_SocialGroups_Model_SocialForum */ protected function _getSocialForumModel() { return ThemeHouse_SocialGroups_SocialForum::getSocialForumModel(); }
/** * Rebuilds the counters for this forum. */ public function rebuildCounters() { $this->updateLastPost(); $this->updateMemberCount(); $this->bulkSet(ThemeHouse_SocialGroups_SocialForum::getSocialForumModel()->getSocialForumCounters($this->get('social_forum_id'))); }
public static function getSocialForumCacheItem($socialForumId) { if (!self::isSocialForumCacheItem($socialForumId)) { $socialForum = ThemeHouse_SocialGroups_SocialForum::getSocialForumModel()->getSocialForumById($socialForumId); if (!$socialForum) { self::$socialForumCache[$socialForumId] = false; } else { self::setSocialForumCacheItem($socialForum); } } return self::$socialForumCache[$socialForumId]; }
/** * * @see XenForo_Model_ForumWatch::getUsersWatchingForum() */ public function getUsersWatchingForum($nodeId, $threadId, $isReply = false) { $users = parent::getUsersWatchingForum($nodeId, $threadId, $isReply); $autoReadDate = XenForo_Application::$time - XenForo_Application::get('options')->readMarkingDataLifetime * 86400; if ($isReply) { $notificationLimit = "AND social_forum_watch.notify_on = 'message'"; } else { $notificationLimit = "AND social_forum_watch.notify_on IN ('thread', 'message')"; } $activeLimitOption = XenForo_Application::getOptions()->watchAlertActiveOnly; if (!empty($activeLimitOption['enabled'])) { $activeLimit = ' AND user.last_activity >= ' . (XenForo_Application::$time - 86400 * $activeLimitOption['days']); } else { $activeLimit = ''; } if (ThemeHouse_SocialGroups_SocialForum::hasInstance()) { $socialForum = ThemeHouse_SocialGroups_SocialForum::getInstance(); if ($socialForum['node_id'] == $nodeId) { $socialForumUsers = $this->fetchAllKeyed(' SELECT user.*, user_option.*, user_profile.*, social_forum_watch.notify_on, social_forum_watch.send_alert, social_forum_watch.send_email, permission.cache_value AS node_permission_cache, GREATEST(COALESCE(thread_read.thread_read_date, 0), COALESCE(social_forum_read.social_forum_read_date, 0), ' . $autoReadDate . ') AS read_date FROM xf_social_forum_watch AS social_forum_watch INNER JOIN xf_user AS user ON (user.user_id = social_forum_watch.user_id AND user.user_state = \'valid\' AND user.is_banned = 0' . $activeLimit . ') INNER JOIN xf_user_option AS user_option ON (user_option.user_id = user.user_id) INNER JOIN xf_user_profile AS user_profile ON (user_profile.user_id = user.user_id) LEFT JOIN xf_permission_cache_content AS permission ON (permission.permission_combination_id = user.permission_combination_id AND permission.content_type = \'node\' AND permission.content_id = ?) LEFT JOIN xf_social_forum_read AS social_forum_read ON (social_forum_read.social_forum_id = social_forum_watch.social_forum_id AND social_forum_read.user_id = user.user_id) LEFT JOIN xf_thread_read AS thread_read ON (thread_read.thread_id = ? AND thread_read.user_id = user.user_id) WHERE social_forum_watch.social_forum_id = ? ' . $notificationLimit . ' AND (social_forum_watch.send_alert <> 0 OR social_forum_watch.send_email <> 0) ', 'user_id', array($nodeId, $threadId, $socialForum['social_forum_id'])); $users = $users + $socialForumUsers; if (!empty($socialForum['social_forum_id'])) { /* @var $socialForumMemberModel ThemeHouse_SocialGroups_Model_SocialForumMember */ $socialForumMemberModel = $this->getModelFromCache('ThemeHouse_SocialGroups_Model_SocialForumMember'); $socialForumMembers = $socialForumMemberModel->getSocialForumUsers(array('user_ids' => array_keys($users), 'social_forum_id' => $socialForum['social_forum_id'])); $socialForumModel = ThemeHouse_SocialGroups_SocialForum::getSocialForumModel(); foreach ($users as $userId => &$user) { if (!empty($socialForumMembers[$userId])) { $user = array_merge($user, $socialForumMembers[$userId]); } else { continue; } $permissions = array(); if (!empty($user['node_permission_cache'])) { $permissions = unserialize($user['node_permission_cache']); } $nodePermissionCache = $socialForumModel->getSocialForumPermissions($user, $permissions); $user['node_permission_cache'] = serialize($nodePermissionCache); } } } } return $users; }
/** * Fetches the content required by alerts. * * @param array $contentIds * @param XenForo_Model_Alert $model Alert model invoking this * @param integer $userId User ID the alerts are for * @param array $viewingUser Information about the viewing user (keys: * user_id, permission_combination_id, permissions) * * @return array */ public function getContentByIds(array $contentIds, $model, $userId, array $viewingUser) { $socialForumModel = ThemeHouse_SocialGroups_SocialForum::getSocialForumModel(); return $socialForumModel->getSocialForums(array('social_forum_ids' => $contentIds)); }