/** * Alter multiple topics at once * * @return @e void [Outputs to screen] */ protected function _multiAlterTopics($mod_action = "", $sql = "") { if (!$mod_action) { $this->_showError('mod_um_what_now', 103109); } $this->_genericPermissionCheck($mod_action); //----------------------------------------- // Make sure we can moderate EACH topic //----------------------------------------- $topics = array(); $forums = array(); $this->DB->build(array('select' => 'tid, forum_id, title', 'from' => 'topics', 'where' => 'tid IN (' . implode(",", $this->tids) . ')')); $this->DB->execute(); while ($r = $this->DB->fetch()) { $topics[$r['tid']] = $r; } foreach ($topics as $topic) { $forums[$topic['forum_id']] = $topic['forum_id']; $this->_resetModerator($topic['forum_id']); $this->_genericPermissionCheck($mod_action); } if ($mod_action != 'delete_topic') { $this->DB->buildAndFetch(array('update' => 'topics', 'set' => $sql, 'where' => "tid IN(" . implode(",", $this->tids) . ") AND state!='link'")); $this->_addModeratorLog(sprintf($this->lang->words['acp_altered_topics'], $sql, implode(", ", $this->tids))); if ($mod_action == 'topic_q' and trim($sql) == 'approved=1') { $this->modLibrary->clearModQueueTable('topic', $this->tids, true); } } else { $this->modLibrary->topicDelete($this->tids); foreach ($this->tids as $_tid) { $this->request['t'] = $_tid; $this->request['f'] = $topics[$_tid]['forum_id']; $this->topic['title'] = $topics[$_tid]['title']; $this->_addModeratorLog(sprintf($this->lang->words['acp_deleted_topics'], $_tid)); } $this->request['t'] = 0; $this->request['f'] = 0; $this->topic['title'] = ''; $this->modLibrary->clearModQueueTable('topic', $this->tids); } if ($mod_action == 'delete_topic' or $mod_action == 'topic_q') { foreach ($forums as $forum) { $this->registry->class_forums->allForums[$forum]['_update_deletion'] = 1; $this->modLibrary->forumRecount($forum); } $this->cache->rebuildCache('stats', 'global'); } /* Tags */ if ($mod_action == 'topic_q') { if ($sql == 'approved=1') { $this->registry->tags->updateVisibilityByMetaId($this->tids, 1); } else { $this->registry->tags->updateVisibilityByMetaId($this->tids, 0); } } }
/** * Class entry point * * @param object Registry reference * @return @e void [Outputs to screen/redirects] */ public function doExecute(ipsRegistry $registry) { //----------------------------------------- // Load modules... //----------------------------------------- ipsRegistry::getClass('class_localization')->loadLanguageFile(array('public_mod')); $classToLoad = IPSLib::loadLibrary(IPSLib::getAppDir('forums') . '/sources/classes/moderate.php', 'moderatorLibrary', 'forums'); $this->modLibrary = new $classToLoad($this->registry); //----------------------------------------- // Clean the incoming //----------------------------------------- $this->request['t'] = intval($this->request['t']); $this->mm_id = intval($this->request['mm_id']); if ($this->request['t'] < 0) { $this->registry->output->showError('multimod_no_topic', 103121, null, null, 404); } //----------------------------------------- // Get the topic id / forum id //----------------------------------------- $this->topic = $this->DB->buildAndFetch(array('select' => '*', 'from' => 'topics', 'where' => "tid=" . intval($this->request['t']))); $this->forum = $this->registry->class_forums->allForums[$this->topic['forum_id']]; //----------------------------------------- // Error out if we can not find the topic //----------------------------------------- if (!$this->topic['tid']) { $this->registry->output->showError('multimod_no_topic', 103122, null, null, 404); } //----------------------------------------- // Error out if we can not find the forum //----------------------------------------- if (!$this->forum['id']) { $this->registry->output->showError('multimod_no_topic', 103123, null, null, 404); } //----------------------------------------- // Are we a moderator? //----------------------------------------- if ($this->memberData['member_id'] && !$this->memberData['g_is_supmod']) { /** * @link http://community.invisionpower.com/tracker/issue-37736-multi-moderationsecondary-group-permissions/ */ $this->moderator = empty($this->memberData['forumsModeratorData'][$this->forum['id']]) ? array() : $this->memberData['forumsModeratorData'][$this->forum['id']]; /*$this->moderator = $this->DB->buildAndFetch( array( 'select' => '*', 'from' => 'moderators', 'where' => "forum_id LIKE '%,{$this->forum['id']},%' AND (member_id=" . $this->memberData['member_id'] . " OR (is_group=1 AND group_id='" . $this->memberData['member_group_id'] . "'))" ) );*/ } //----------------------------------------- // Init modfunc module //----------------------------------------- $this->modLibrary->init($this->forum, $this->topic, $this->moderator); //----------------------------------------- // Do we have permission? //----------------------------------------- if ($this->modLibrary->mmAuthorize() != TRUE) { $this->registry->output->showError('multimod_no_perms', 2038, null, null, 403); } //----------------------------------------- // Get MM data //----------------------------------------- $this->mm_data = $this->caches['multimod'][$this->mm_id]; if (!$this->mm_data['mm_id']) { $this->registry->output->showError('multimod_not_found', 103124); } //----------------------------------------- // Does this forum have this mm_id //----------------------------------------- if ($this->modLibrary->mmCheckIdInForum($this->forum['id'], $this->mm_data) != TRUE) { $this->registry->output->showError('multimod_no_perms', 2039, null, null, 403); } $this->modLibrary->stmInit(); //----------------------------------------- // Open close? //----------------------------------------- if ($this->mm_data['topic_state'] != 'leave') { if ($this->mm_data['topic_state'] == 'close') { $this->modLibrary->stmAddClose(); } else { if ($this->mm_data['topic_state'] == 'open') { $this->modLibrary->stmAddOpen(); } } } //----------------------------------------- // pin no-pin? //----------------------------------------- if ($this->mm_data['topic_pin'] != 'leave') { if ($this->mm_data['topic_pin'] == 'pin') { $this->modLibrary->stmAddPin(); } else { if ($this->mm_data['topic_pin'] == 'unpin') { $this->modLibrary->stmAddUnpin(); } } } //----------------------------------------- // Approve / Unapprove //----------------------------------------- if ($this->mm_data['topic_approve']) { if ($this->mm_data['topic_approve'] == 1) { $this->modLibrary->stmAddApprove(); /* Bug #36869: Approving a topic doesn't increment user post count */ $this->modLibrary->clearModQueueTable('topic', $this->topic['tid'], true); } else { if ($this->mm_data['topic_approve'] == 2) { $this->modLibrary->stmAddUnapprove(); } } } //----------------------------------------- // Topic title // Regexes clean title up //----------------------------------------- $title = $this->topic['title']; if ($this->mm_data['topic_title_st']) { $title = preg_replace("/^" . preg_quote($this->mm_data['topic_title_st'], '/') . "/", "", $title); } if ($this->mm_data['topic_title_end']) { $title = preg_replace("/" . preg_quote($this->mm_data['topic_title_end'], '/') . "\$/", "", $title); } $this->modLibrary->stmAddTitle(IPSText::UNhtmlspecialchars($this->mm_data['topic_title_st']) . $title . IPSText::UNhtmlspecialchars($this->mm_data['topic_title_end'])); //----------------------------------------- // Update what we have so far... //----------------------------------------- $this->modLibrary->stmExec($this->topic['tid']); //----------------------------------------- // Add reply? //----------------------------------------- if ($this->mm_data['topic_reply'] and $this->mm_data['topic_reply_content']) { IPSText::getTextClass('bbcode')->parse_smilies = 1; IPSText::getTextClass('bbcode')->parse_bbcode = 1; IPSText::getTextClass('bbcode')->parse_html = 1; IPSText::getTextClass('bbcode')->parse_nl2br = 1; IPSText::getTextClass('bbcode')->parsing_section = 'topics'; $this->modLibrary->topicAddReply(IPSText::getTextClass('bbcode')->preDbParse(str_replace(array("\n", "\r"), '', nl2br($this->mm_data['topic_reply_content']))), array(0 => array($this->topic['tid'], $this->forum['id'])), $this->mm_data['topic_reply_postcount']); } //----------------------------------------- // Move topic? //----------------------------------------- if ($this->mm_data['topic_move']) { //----------------------------------------- // Move to forum still exist? //----------------------------------------- $r = $this->registry->class_forums->allForums[$this->mm_data['topic_move']]; if ($r['id']) { if ($r['sub_can_post'] != 1) { $this->DB->update('topic_mmod', array('topic_move' => 0), 'mm_id=' . $this->mm_id); } else { if ($r['id'] != $this->forum['id']) { $this->modLibrary->topicMove($this->topic['tid'], $this->forum['id'], $r['id'], $this->mm_data['topic_move_link']); $this->modLibrary->forumRecount($r['id']); } } } else { $this->DB->update('topic_mmod', array('topic_move' => 0), 'mm_id=' . $this->mm_id); } } //----------------------------------------- // Recount root forum //----------------------------------------- $this->modLibrary->forumRecount($this->forum['id']); $this->cache->rebuildCache('stats', 'global'); //----------------------------------------- // Add mod log //----------------------------------------- $this->modLibrary->addModerateLog($this->forum['id'], $this->topic['tid'], "", $this->topic['title'], "Applied multi-mod: " . $this->mm_data['mm_title']); //----------------------------------------- // Redirect back with nice fluffy message //----------------------------------------- $this->registry->output->redirectScreen(sprintf($this->lang->words['mm_applied'], $this->mm_data['mm_title']), $this->settings['base_url'] . "showforum=" . $this->forum['id'], $this->forum['name_seo'], 'showforum'); }
/** * Complete the topic move * * @access private * @return void [Outputs to screen] */ private function _multiCompleteCheckedMove() { $this->_genericPermissionCheck('move_topic'); $add_link = $this->request['leave'] == 'y' ? 1 : 0; $dest_id = intval($this->request['df']); $source_id = $this->forum['id']; //----------------------------------------- // Make sure we can moderate EACH topic //----------------------------------------- $this->DB->build(array('select' => 'tid, forum_id', 'from' => 'topics', 'where' => 'tid IN (' . implode(",", $this->tids) . ')', 'order' => 'start_date asc')); $this->DB->execute(); while ($r = $this->DB->fetch()) { $topics[] = $r; } foreach ($topics as $topic) { $this->_resetModerator($topic['forum_id']); $this->_genericPermissionCheck('move_topic'); } //----------------------------------------- // Check for input.. //----------------------------------------- if (!$source_id or !$dest_id or $dest_id == -1) { $this->_showError('mod_no_forum_move', 103110); } if ($source_id == $dest_id) { $this->_showError('mod_no_move_save', 103111); } //----------------------------------------- $this->DB->build(array('select' => 'id, sub_can_post, name, redirect_on', 'from' => 'forums', 'where' => "id IN(" . $source_id . ',' . $dest_id . ")")); $this->DB->execute(); if ($this->DB->getTotalRows() != 2) { $this->_showError('mod_no_move_save', 103112); } $source_name = ""; $dest_name = ""; //----------------------------------------- // Check for an attempt to move into a subwrap forum //----------------------------------------- while ($f = $this->DB->fetch()) { if ($f['id'] == $source_id) { $source_name = $f['name']; } else { $dest_name = $f['name']; } if ($f['sub_can_post'] != 1 or $f['redirect_on'] == 1) { $this->_showError('mod_forum_no_posts', 103113); } } $this->modLibrary->topicMove($this->tids, $source_id, $dest_id, $add_link); if ($dest_id == $this->settings['forum_trash_can_id']) { $this->modLibrary->clearModQueueTable('topic', $this->tids); } //----------------------------------------- // Resync the forums.. //----------------------------------------- $this->registry->class_forums->allForums[$source_id]['_update_deletion'] = 1; $this->registry->class_forums->allForums[$dest_id]['_update_deletion'] = 1; $this->modLibrary->forumRecount($source_id); $this->modLibrary->forumRecount($dest_id); $this->_addModeratorLog(sprintf($this->lang->words['acp_moved_topics'], $source_name, $dest_name)); }