/** * Empty a forum * * @access public * @return void Outputs to screen **/ public function doEmpty() { /* INI */ $this->request['f'] = intval($this->request['f']); //----------------------------------------- // Get module //----------------------------------------- require_once IPSLib::getAppDir('forums') . '/sources/classes/moderate.php'; $modfunc = new moderatorLibrary($this->registry); if ($this->request['f'] == "") { $this->registry->output->showError($this->lang->words['for_noid_source'], 1139); } //----------------------------------------- // Check to make sure its a valid forum. //----------------------------------------- $this->DB->build(array('select' => 'id, posts, topics', 'from' => 'forums', 'where' => "id=" . $this->request['f'])); $this->DB->execute(); if (!($forum = $this->DB->fetch())) { $this->registry->output->showError($this->lang->words['for_nodetails'], 11310); } $this->DB->build(array('select' => 'tid', 'from' => 'topics', 'where' => "forum_id=" . $this->request['f'])); $outer = $this->DB->execute(); //----------------------------------------- // What to do.. //----------------------------------------- while ($t = $this->DB->fetch($outer)) { $modfunc->topicDelete($t['tid']); } //----------------------------------------- // Rebuild stats //----------------------------------------- $modfunc->forumRecount($this->request['f']); $modfunc->statsRecount(); //----------------------------------------- // Rebuild forum cache //----------------------------------------- $this->recacheForums(); $this->registry->adminFunctions->saveAdminLog(sprintf($this->lang->words['for_emptiedlog'], $this->request['name'])); $this->request['f'] = $this->forum_functions->forum_by_id[$this->request['f']]['parent_id']; $this->registry->output->global_message = $this->lang->words['for_emptied']; $this->showForums(); }
/** * Delete a member's posts [process] * * @access private * @return void [Outputs to screen] */ private function _deletePostsDo() { //----------------------------------------- // INIT //----------------------------------------- $member_id = intval($this->request['member_id']); $delete_posts = intval($this->request['dposts']); $delete_topics = intval($this->request['dtopics']); $end = intval($this->request['dpergo']) ? intval($this->request['dpergo']) : 50; $init = intval($this->request['init']); $done = 0; $start = intval($this->request['st']) >= 0 ? intval($this->request['st']) : 0; $forums_affected = array(); $topics_affected = array(); $img = '<img src="' . $this->settings['skin_acp_url'] . '/images/aff_tick_small.png" border="0" alt="-" /> '; $posts_deleted = 0; $topics_deleted = 0; //-------------------------------------------- // NOT INIT YET? //-------------------------------------------- if (!$init) { $url = $this->settings['base_url'] . '&' . $this->form_code_js . "&do=deleteposts_process&dpergo=" . $this->request['dpergo'] . "&st=0" . "&init=1" . "&dposts={$delete_posts}" . "&dtopics={$delete_topics}" . "&use_trash_can=" . intval($this->request['use_trash_can']) . "&member_id={$member_id}"; $this->registry->output->multipleRedirectInit($url); } //-------------------------------------------- // Not loaded the func? //-------------------------------------------- if (!is_object($mod_func)) { require_once IPS_ROOT_PATH . 'sources/classes/itemmarking/classItemMarking.php'; $this->registry->setClass('classItemMarking', new classItemMarking($this->registry)); require_once IPSLib::getAppDir('forums') . '/sources/classes/moderate.php'; $mod_func = new moderatorLibrary($this->registry); } //----------------------------------------- // Trash-can set up //----------------------------------------- $trash_append = ''; if ($this->settings['forum_trash_can_enable'] and $this->settings['forum_trash_can_id']) { if ($this->registry->class_forums->forum_by_id[$this->settings['forum_trash_can_id']]['sub_can_post']) { if ($this->request['use_trash_can']) { $this->trash_forum = $this->settings['forum_trash_can_id']; $trash_append = " AND forum_id<>{$this->trash_forum}"; } } } //----------------------------------------- // Get member //----------------------------------------- $member = IPSMember::load($member_id, 'core'); //----------------------------------------- // Avoid limit... //----------------------------------------- $this->DB->build(array('select' => 'p.*', 'from' => array('posts' => 'p'), 'where' => "p.author_id={$member_id}{$trash_append}", 'order' => 'p.pid ASC', 'limit' => array($start, $end), 'add_join' => array(array('select' => 't.*', 'from' => array('topics' => 't'), 'where' => 't.tid=p.topic_id', 'type' => 'left')))); $outer = $this->DB->execute(); //----------------------------------------- // Process... //----------------------------------------- while ($r = $this->DB->fetch($outer)) { //----------------------------------------- // Copy record to topic array //----------------------------------------- $topic = $r; //----------------------------------------- // No longer a topic? //----------------------------------------- if (!$topic['tid']) { continue; } $done++; //----------------------------------------- // Get number of MID posters //----------------------------------------- $topic_i_posted = $this->DB->buildAndFetch(array('select' => 'COUNT(*) as count', 'from' => 'posts', 'where' => 'author_id=' . $member_id . ' AND topic_id=' . $r['topic_id'])); //----------------------------------------- // Aready deleted this topic? //----------------------------------------- if (!$topic_i_posted['count']) { continue; } //----------------------------------------- // First check: Our topic and no other replies? //----------------------------------------- if ($topic['starter_id'] == $member_id and $topic_i_posted['count'] == $topic['posts'] + 1) { //----------------------------------------- // Ok, deleting topics or posts? //----------------------------------------- if (($delete_posts or $delete_topics) and ($this->trash_forum and $this->trash_forum != $topic['forum_id'])) { //----------------------------------------- // Move, don't delete //----------------------------------------- $mod_func->topicMove($r['topic_id'], $topic['forum_id'], $this->trash_forum); $forums_affected[$topic['forum_id']] = $topic['forum_id']; $forums_affected[$this->trash_forum] = $this->trash_forum; $topics_deleted++; $posts_deleted += $topic_i_posted['count']; } else { if ($delete_posts or $delete_topics) { $this->DB->delete('posts', 'author_id=' . $member_id . ' AND topic_id=' . $r['topic_id']); $this->DB->delete('topics', 'tid=' . $r['topic_id']); $forums_affected[$topic['forum_id']] = $topic['forum_id']; $topics_deleted++; $posts_deleted += $topic_i_posted['count']; } } } else { if ($topic['starter_id'] == $member_id and $delete_topics) { if ($this->trash_forum and $this->trash_forum != $topic['forum_id']) { //----------------------------------------- // Move, don't delete //----------------------------------------- $mod_func->topicMove($r['topic_id'], $topic['forum_id'], $this->trash_forum); $forums_affected[$topic['forum_id']] = $topic['forum_id']; $forums_affected[$this->trash_forum] = $this->trash_forum; $topics_deleted++; $posts_deleted += $topic_i_posted['count']; } else { $this->DB->delete('posts', 'topic_id=' . $r['topic_id']); $this->DB->delete('topics', 'tid=' . $r['topic_id']); $forums_affected[$topic['forum_id']] = $topic['forum_id']; $topics_deleted++; $posts_deleted += $topic['posts'] + 1; } } else { if ($delete_posts and !$r['new_topic']) { if ($this->trash_forum and $this->trash_forum != $topic['forum_id']) { //----------------------------------------- // Set up and pass to split topic handler //----------------------------------------- $new_title = $this->lang->words['acp_posts_deleted_from'] . $topic['title']; $new_desc = $this->lang->words['acp_posts_deleted_from_tid'] . $topic['tid']; //----------------------------------------- // Is first post queued? //----------------------------------------- $topic_approved = 1; $first_post = $this->DB->buildAndFetch(array('select' => 'pid, queued', 'from' => 'posts', 'where' => "pid=" . $r['pid'])); if ($first_post['queued']) { $topic_approved = 0; $this->DB->update('posts', array('queued' => 0), 'pid=' . $first_post['pid']); } //----------------------------------------- // Complete a new dummy topic //----------------------------------------- $this->DB->insert('topics', array('title' => $new_title, 'description' => $new_desc, 'state' => 'open', 'posts' => 0, 'starter_id' => $member_id, 'starter_name' => $member['members_display_name'], 'start_date' => time(), 'last_poster_id' => $member_id, 'last_poster_name' => $member['members_display_name'], 'last_post' => time(), 'icon_id' => 0, 'author_mode' => 1, 'poll_state' => 0, 'last_vote' => 0, 'views' => 0, 'forum_id' => $this->trash_forum, 'approved' => $topic_approved, 'pinned' => 0)); $new_topic_id = $this->DB->getInsertId(); //----------------------------------------- // Move the posts //----------------------------------------- $this->DB->update('posts', array('topic_id' => $new_topic_id, 'new_topic' => 0, 'queued' => 0), "pid={$r['pid']}"); $this->DB->update('posts', array('new_topic' => 0), "topic_id={$topic['tid']}"); $forums_affected[$topic['forum_id']] = $topic['forum_id']; $forums_affected[$this->trash_forum] = $this->trash_forum; $topics_affected[$topic['tid']] = $topic['tid']; $topics_affected[$new_topic_id] = $new_topic_id; $posts_deleted++; } else { $this->DB->delete('posts', 'pid=' . $r['pid']); $forums_affected[$topic['forum_id']] = $topic['forum_id']; $topics_affected[$topic['tid']] = $topic['tid']; $posts_deleted++; } } } } } //----------------------------------------- // Rebuild topics and forums //----------------------------------------- if (count($topics_affected)) { foreach ($topics_affected as $tid) { $mod_func->rebuildTopic($tid, 0); } } if (count($forums_affected)) { foreach ($forums_affected as $fid) { $mod_func->forumRecount($fid); } } //----------------------------------------- // Finish - or more?... //----------------------------------------- if (!$done) { //----------------------------------------- // Recount stats.. //----------------------------------------- $mod_func->statsRecount(); //----------------------------------------- // Reset member's posts //----------------------------------------- $forums = array(); foreach ($this->registry->class_forums->forum_by_id as $data) { if (!$data['inc_postcount']) { $forums[] = $data['id']; } } if (!count($forums)) { $count = $this->DB->buildAndFetch(array('select' => 'count(*) as count', 'from' => 'posts', 'where' => 'queued != 1 AND author_id=' . $member_id)); } else { $count = $this->DB->buildAndFetch(array('select' => 'count(p.pid) as count', 'from' => array('posts' => 'p'), 'where' => 'p.queued <> 1 AND p.author_id=' . $member_id . ' AND t.forum_id NOT IN (' . implode(",", $forums) . ')', 'add_join' => array(array('type' => 'left', 'from' => array('topics' => 't'), 'where' => 't.tid=p.topic_id')))); } $new_post_count = intval($count['count']); $this->registry->adminFunctions->saveAdminLog(sprintf($this->lang->words['member_posts_deleted'], $member['members_display_name'])); IPSMember::save($member_id, array('core' => array('posts' => $new_post_count))); $this->registry->output->multipleRedirectFinish($this->lang->words['mem_posts_process_done']); } else { //----------------------------------------- // More.. //----------------------------------------- $next = $start + $end; $url = $this->settings['base_url'] . '&' . $this->form_code_js . "&do=deleteposts_process&dpergo={$end}" . "&st={$next}" . "&init=1" . "&dposts={$delete_posts}" . "&dtopics={$delete_topics}" . "&use_trash_can=" . intval($this->request['use_trash_can']) . "&member_id={$member_id}"; $text = sprintf($this->lang->words['mem_posts_process_more'], $end, $posts_deleted, $topics_deleted); $this->registry->output->multipleRedirectHit($url, $img . ' ' . $text); } }