예제 #1
0
 /**
  * The actualiser to delete a poll.
  *
  * @return tempcode		The UI
  */
 function _delete_poll()
 {
     $topic_id = get_param_integer('id');
     $poll_id = $GLOBALS['FORUM_DB']->query_value_null_ok('f_topics', 't_poll_id', array('id' => $topic_id));
     if (is_null($poll_id)) {
         warn_exit(do_lang_tempcode('MISSING_RESOURCE'));
     }
     require_code('ocf_polls_action');
     require_code('ocf_polls_action2');
     ocf_delete_poll($poll_id, post_param('reason'));
     return $this->redirect_to('DELETE_TOPIC_POLL', $topic_id);
 }
예제 #2
0
/**
 * Delete a topic.
 *
 * @param  AUTO_LINK  The ID of the topic to delete.
 * @param  LONG_TEXT  The reason for this action .
 * @param  ?AUTO_LINK Where topic to move posts in this topic to (NULL: delete the posts).
 * @return AUTO_LINK  The forum ID the topic is in (could be found without calling the function, but as we've looked it up, it is worth keeping).
 */
function ocf_delete_topic($topic_id, $reason = '', $post_target_topic_id = NULL)
{
    // Info about source
    $info = $GLOBALS['FORUM_DB']->query_select('f_topics', array('t_pt_to', 't_pt_from', 't_cache_first_title', 't_cache_first_member_id', 't_poll_id', 't_forum_id', 't_cache_num_posts', 't_validated'), array('id' => $topic_id));
    if (!array_key_exists(0, $info)) {
        warn_exit(do_lang_tempcode('MISSING_RESOURCE'));
    }
    $name = $info[0]['t_cache_first_title'];
    $poll_id = $info[0]['t_poll_id'];
    $forum_id = $info[0]['t_forum_id'];
    $num_posts = $info[0]['t_cache_num_posts'];
    $validated = $info[0]['t_validated'];
    if (!ocf_may_delete_topics_by($forum_id, get_member(), $info[0]['t_cache_first_member_id']) || !is_null($info[0]['t_pt_from']) && $info[0]['t_pt_from'] != get_member() && (!is_null($info[0]['t_pt_to']) && $info[0]['t_pt_to'] != get_member()) && !ocf_has_special_pt_access($topic_id) && !has_specific_permission(get_member(), 'view_other_pt') && is_null($forum_id)) {
        access_denied('I_ERROR');
    }
    if (!is_null($post_target_topic_id)) {
        $to = $GLOBALS['FORUM_DB']->query_value_null_ok('f_topics', 't_forum_id', array('id' => $post_target_topic_id));
        if (is_null($to)) {
            warn_exit(do_lang_tempcode('MISSING_RESOURCE'));
        }
    }
    if (!is_null($forum_id)) {
        // Update member post counts if we've switched between post-count countable forums
        $post_count_info = $GLOBALS['FORUM_DB']->query('SELECT id,f_post_count_increment FROM ' . $GLOBALS['FORUM_DB']->get_table_prefix() . 'f_forums WHERE id=' . strval((int) $forum_id) . (!is_null($post_target_topic_id) ? ' OR id=' . strval((int) $to) : ''), 2);
        if ($post_count_info[0]['id'] == $forum_id) {
            $from_cnt = $post_count_info[0]['f_post_count_increment'];
            $to_cnt = array_key_exists(1, $post_count_info) ? $post_count_info[1]['f_post_count_increment'] : 0;
        } else {
            $from_cnt = $post_count_info[1]['f_post_count_increment'];
            $to_cnt = $post_count_info[0]['f_post_count_increment'];
        }
        require_code('ocf_posts_action');
        if ($from_cnt != $to_cnt) {
            $sql = 'SELECT p_poster FROM ' . $GLOBALS['FORUM_DB']->get_table_prefix() . 'f_posts WHERE p_topic_id=' . strval((int) $topic_id);
            if (addon_installed('unvalidated')) {
                $sql .= ' AND p_validated=1';
            }
            $_member_post_counts = collapse_1d_complexity('p_poster', $GLOBALS['FORUM_DB']->query($sql));
            $member_post_counts = array_count_values($_member_post_counts);
            foreach ($member_post_counts as $member_id => $member_post_count) {
                if ($to_cnt == 0) {
                    $member_post_count = -$member_post_count;
                }
                ocf_force_update_member_post_count($member_id, $member_post_count);
            }
        }
    }
    // What to do with our posts
    if (!is_null($post_target_topic_id)) {
        $GLOBALS['FORUM_DB']->query_update('f_posts', array('p_cache_forum_id' => $to, 'p_topic_id' => $post_target_topic_id), array('p_topic_id' => $topic_id));
        require_code('ocf_posts_action2');
        ocf_force_update_topic_cacheing($post_target_topic_id);
        if (!is_null($forum_id)) {
            ocf_force_update_forum_cacheing($forum_id, $to, 1, $num_posts);
        }
    } else {
        $_postdetails = $GLOBALS['FORUM_DB']->query('SELECT p_post FROM ' . $GLOBALS['FORUM_DB']->get_table_prefix() . 'f_posts WHERE p_topic_id=' . strval((int) $topic_id));
        foreach ($_postdetails as $post) {
            delete_lang($post['p_post'], $GLOBALS['FORUM_DB']);
        }
        $GLOBALS['FORUM_DB']->query_delete('f_posts', array('p_topic_id' => $topic_id));
    }
    // Delete stuff
    if (!is_null($poll_id)) {
        require_code('ocf_polls_action');
        require_code('ocf_polls_action2');
        ocf_delete_poll($poll_id, '');
    }
    $GLOBALS['FORUM_DB']->query_delete('f_topics', array('id' => $topic_id), '', 1);
    $GLOBALS['FORUM_DB']->query_delete('f_read_logs', array('l_topic_id' => $topic_id));
    require_code('notifications');
    delete_all_notifications_on('ocf_topics', strval($topic_id));
    // Delete the ticket row if it's a ticket
    if (addon_installed('tickets')) {
        require_code('tickets');
        if (!is_null($forum_id) && is_ticket_forum($forum_id)) {
            require_code('tickets2');
            delete_ticket_by_topic_id($topic_id);
        }
    }
    // Update forum view cacheing
    if (!is_null($forum_id)) {
        require_code('ocf_posts_action2');
        ocf_force_update_forum_cacheing($forum_id, $validated == 0 ? 0 : -1, -$num_posts);
    }
    require_code('ocf_general_action2');
    ocf_mod_log_it('DELETE_TOPIC', strval($topic_id), $name, $reason);
    if (!is_null($forum_id)) {
        require_code('ocf_posts_action');
        ocf_decache_ocp_blocks($forum_id);
    } else {
        decache('side_ocf_personal_topics');
        decache('_new_pp');
    }
    return $forum_id;
}
예제 #3
0
파일: poll.php 프로젝트: erico-deh/ocPortal
 function tearDown()
 {
     ocf_delete_poll($poll_id = $this->poll_id, $reason = 'Simple');
     ocf_delete_topic($this->topic_id);
     parent::tearDown();
 }