/** * Turn a post row, into a detailed map of information that is suitable for use as display parameters for that post. * * @param array The post row. * @param boolean Whether the post is the only post in the topic. * @return array The detailed map. */ function ocf_get_details_to_show_post($_postdetails, $only_post = false) { $forum_id = $_postdetails['p_cache_forum_id']; $primary_group = ocf_get_member_primary_group($_postdetails['p_poster']); if (is_null($primary_group)) { $_postdetails['p_poster'] = db_get_first_id(); $primary_group = db_get_first_id(); } $post = array('id' => $_postdetails['id'], 'topic_id' => $_postdetails['p_topic_id'], 'title' => $_postdetails['p_title'], 'post' => $_postdetails['message'], 'time' => $_postdetails['p_time'], 'time_string' => get_timezoned_date($_postdetails['p_time']), 'validated' => $_postdetails['p_validated'], 'is_emphasised' => $_postdetails['p_is_emphasised'], 'poster_username' => $_postdetails['p_poster_name_if_guest'], 'poster' => $_postdetails['p_poster'], 'has_history' => !is_null($_postdetails['h_post_id'])); if (array_key_exists('message_comcode', $_postdetails)) { $post['message_comcode'] = $_postdetails['message_comcode']; } // Edited? if (!is_null($_postdetails['p_last_edit_by'])) { $post['last_edit_by'] = $_postdetails['p_last_edit_by']; $post['last_edit_time'] = $_postdetails['p_last_edit_time']; $post['last_edit_time_string'] = get_timezoned_date($_postdetails['p_last_edit_time']); $post['last_edit_by_username'] = $GLOBALS['OCF_DRIVER']->get_username($_postdetails['p_last_edit_by']); if ($post['last_edit_by_username'] == '') { $post['last_edit_by_username'] = do_lang('UNKNOWN'); } // Shouldn't happen, but imported data can be weird } // Find title $title = addon_installed('ocf_member_titles') ? $GLOBALS['OCF_DRIVER']->get_member_row_field($_postdetails['p_poster'], 'm_title') : ''; if ($title == '') { $title = get_translated_text(ocf_get_group_property($primary_group, 'title'), $GLOBALS['FORUM_DB']); } $post['poster_title'] = $title; // If this isn't guest posted, we can put some member details in if (!is_null($_postdetails['p_poster']) && $_postdetails['p_poster'] != $GLOBALS['OCF_DRIVER']->get_guest_id()) { if (addon_installed('points')) { require_code('points'); $post['poster_points'] = total_points($_postdetails['p_poster']); } $post['poster_posts'] = $GLOBALS['OCF_DRIVER']->get_member_row_field($_postdetails['p_poster'], 'm_cache_num_posts'); $post['poster_highlighted_name'] = $GLOBALS['OCF_DRIVER']->get_member_row_field($_postdetails['p_poster'], 'm_highlighted_name'); // Signature if (($GLOBALS['OCF_DRIVER']->get_member_row_field(get_member(), 'm_views_signatures') == 1 || get_value('disable_views_sigs_option') === '1') && $_postdetails['p_skip_sig'] == 0 && addon_installed('ocf_signatures')) { global $SIGNATURES_CACHE; if (array_key_exists($_postdetails['p_poster'], $SIGNATURES_CACHE)) { $sig = $SIGNATURES_CACHE[$_postdetails['p_poster']]; } else { $sig = get_translated_tempcode($GLOBALS['OCF_DRIVER']->get_member_row_field($_postdetails['p_poster'], 'm_signature'), $GLOBALS['FORUM_DB']); $SIGNATURES_CACHE[$_postdetails['p_poster']] = $sig; } $post['signature'] = $sig; } // Any custom fields to show? $post['custom_fields'] = ocf_get_all_custom_fields_match_member($_postdetails['p_poster'], get_member() != $_postdetails['p_poster'] && !has_specific_permission(get_member(), 'view_any_profile_field') ? 1 : NULL, get_member() == $_postdetails['p_poster'] && !has_specific_permission(get_member(), 'view_any_profile_field') ? 1 : NULL, NULL, NULL, NULL, 1); // Usergroup $post['primary_group'] = $primary_group; $post['primary_group_name'] = ocf_get_group_name($primary_group); // Find avatar $avatar = $GLOBALS['OCF_DRIVER']->get_member_avatar_url($_postdetails['p_poster']); if ($avatar != '') { $post['poster_avatar'] = $avatar; } // Any warnings? if (has_specific_permission(get_member(), 'see_warnings') && addon_installed('ocf_warnings')) { $num_warnings = $GLOBALS['OCF_DRIVER']->get_member_row_field($_postdetails['p_poster'], 'm_cache_warnings'); /*if ($num_warnings!=0)*/ $post['poster_num_warnings'] = $num_warnings; } // Join date $post['poster_join_date'] = $GLOBALS['OCF_DRIVER']->get_member_row_field($_postdetails['p_poster'], 'm_join_time'); $post['poster_join_date_string'] = get_timezoned_date($post['poster_join_date']); } elseif ($_postdetails['p_poster'] == $GLOBALS['OCF_DRIVER']->get_guest_id()) { if ($_postdetails['p_poster_name_if_guest'] == do_lang('SYSTEM')) { $post['poster_avatar'] = find_theme_image('ocf_default_avatars/default_set/ocp_fanatic', true); } } // Do we have any special controls over this post? require_code('ocf_posts'); if (ocf_may_edit_post_by($_postdetails['p_poster'], $forum_id)) { $post['may_edit'] = true; } if (ocf_may_delete_post_by($_postdetails['p_poster'], $forum_id) && !$only_post) { $post['may_delete'] = true; } // More if (has_specific_permission(get_member(), 'see_ip')) { $post['ip_address'] = $_postdetails['p_ip_address']; } if (!is_null($_postdetails['p_intended_solely_for'])) { $post['intended_solely_for'] = $_postdetails['p_intended_solely_for']; } return $post; }
/** * The UI to edit a post. * * @return tempcode The UI */ function edit_post() { $post_id = get_param_integer('id'); $post_details = $GLOBALS['FORUM_DB']->query_select('f_posts', array('*'), array('id' => $post_id), '', 1); if (!array_key_exists(0, $post_details)) { warn_exit(do_lang_tempcode('MISSING_RESOURCE')); } $forum_id = $post_details[0]['p_cache_forum_id']; if (!is_null($forum_id)) { $_comments_forum = get_option('comments_forum_name'); if (is_numeric($_comments_forum)) { $comments_forum = $_comments_forum; } else { $comments_forum = $GLOBALS['FORUM_DRIVER']->forum_id_from_name($_comments_forum); } if (!has_category_access(get_member(), 'forums', strval($forum_id)) && $forum_id != $comments_forum) { access_denied('CATEGORY_ACCESS'); } // Can happen if trying to reply to a stated whisper made to you in a forum you don't have access to } if (!ocf_may_edit_post_by($post_details[0]['p_poster'], $forum_id)) { access_denied('I_ERROR'); } $topic_info = $GLOBALS['FORUM_DB']->query_select('f_topics', array('*'), array('id' => $post_details[0]['p_topic_id']), '', 1); if (!array_key_exists(0, $topic_info)) { warn_exit(do_lang_tempcode('MISSING_RESOURCE')); } $this->handle_topic_breadcrumbs($forum_id, $post_details[0]['p_topic_id'], $topic_info[0]['t_cache_first_title'], do_lang_tempcode('EDIT_POST')); $hidden_fields = new ocp_tempcode(); $intended_solely_for = $post_details[0]['p_intended_solely_for']; if (!is_null($intended_solely_for)) { $hidden_fields->attach(form_input_hidden('intended_solely_for', strval($intended_solely_for))); } $hidden_fields->attach(form_input_hidden('from_url', get_self_url(true))); $hidden_fields->attach(form_input_hidden('post_id', strval($post_id))); $map = array('page' => '_SELF', 'type' => '_edit_post'); $redirect = get_param('redirect', ''); if ($redirect != '') { $map['redirect'] = $redirect; } $test = get_param_integer('kfs' . (is_null($forum_id) ? '' : strval($forum_id)), -1); if ($test != -1 && $test != 0) { $map['kfs' . (is_null($forum_id) ? '' : strval($forum_id))] = $test; } $test = get_param_integer('threaded', -1); if ($test != -1) { $map['threaded'] = $test; } $post_url = build_url($map, '_SELF'); $post = post_param('post', get_translated_text($post_details[0]['p_post'], $GLOBALS['FORUM_DB'])); // Certain aspects relating to the posting system $specialisation = new ocp_tempcode(); if (get_option('is_on_post_titles') == '1' || $post_details[0]['p_title'] != '' || $post_id == $topic_info[0]['t_cache_first_post_id']) { $specialisation->attach(form_input_line(do_lang_tempcode('TITLE'), '', 'title', post_param('title', $post_details[0]['p_title']), false, 1)); } $specialisation->attach(form_input_line(do_lang_tempcode('REASON'), '', 'reason', '', false, 2)); if (ocf_may_moderate_forum($forum_id, get_member())) { $moderation_options = array(array(do_lang_tempcode('EMPHASISED'), 'is_emphasised', $post_details[0]['p_is_emphasised'] == 1, do_lang_tempcode('DESCRIPTION_EMPHASISED'))); if (addon_installed('unvalidated')) { if ($post_details[0]['p_validated'] == 0) { $post_details[0]['p_validated'] = get_param_integer('validated', 0); if ($post_details[0]['p_validated'] == 1) { attach_message(do_lang_tempcode('WILL_BE_VALIDATED_WHEN_SAVING')); } } $moderation_options[] = array(do_lang_tempcode('VALIDATED'), 'validated', $post_details[0]['p_validated'] == 1, do_lang_tempcode('DESCRIPTION_VALIDATED')); } } else { $moderation_options = array(); $hidden_fields->attach(form_input_hidden('validated', '1')); } $specialisation2 = new ocp_tempcode(); require_code('fields'); if (has_tied_catalogue('post')) { append_form_custom_fields('post', strval($post_id), $specialisation2, $hidden_fields); } if (count($moderation_options) != 0) { $specialisation2->attach(form_input_various_ticks($moderation_options, '', NULL, do_lang_tempcode('MODERATION_OPTIONS'))); } $specialisation2->attach(do_template('FORM_SCREEN_FIELD_SPACER', array('TITLE' => do_lang_tempcode('ACTIONS')))); $options = array(); $options[] = array(do_lang_tempcode('MARK_UNREAD'), 'mark_as_unread', false, do_lang_tempcode('DESCRIPTION_MARK_UNREAD')); $options[] = array(do_lang_tempcode('SHOW_AS_EDITED'), 'show_as_edited', time() - $post_details[0]['p_time'] > 60 * 3, do_lang_tempcode('DESCRIPTION_POST_SHOW_AS_EDITED')); $specialisation2->attach(form_input_various_ticks($options, '')); if (ocf_may_delete_post_by($post_details[0]['p_poster'], $forum_id)) { $specialisation2->attach(form_input_tick(do_lang_tempcode('DELETE'), do_lang_tempcode('DESCRIPTION_DELETE'), 'delete', false)); } // Awards? if (addon_installed('awards')) { require_code('awards'); $specialisation->attach(get_award_fields('post', strval($post_id))); } if (is_null(get_param('post', NULL))) { $parsed = get_translated_tempcode($post_details[0]['p_post'], $GLOBALS['FORUM_DB']); } else { $parsed = NULL; } $posting_form = get_posting_form(do_lang('SAVE'), $post, $post_url, $hidden_fields, $specialisation, NULL, '', $specialisation2, $parsed, $this->_post_javascript()); list($warning_details, $ping_url) = handle_conflict_resolution(); $title = get_page_title('EDIT_POST'); return do_template('POSTING_SCREEN', array('_GUID' => '347e469de58882bf77722bba6ed4aba4', 'STAFF_HELP_URL' => brand_base_url() . '/docs' . strval(ocp_version()) . '/pg/tut_mod', 'TITLE' => $title, 'PING_URL' => $ping_url, 'WARNING_DETAILS' => $warning_details, 'POSTING_FORM' => $posting_form)); }
/** * Delete posts from a topic. * * @param AUTO_LINK The ID of the topic we're deleting posts from. * @param array A list of posts to delete. * @param LONG_TEXT The reason for this action. * @return boolean Whether the topic was deleted, due to all posts in said topic being deleted. */ function ocf_delete_posts_topic($topic_id, $posts, $reason) { // Info about source $info = $GLOBALS['FORUM_DB']->query_select('f_topics', array('t_forum_id'), array('id' => $topic_id), '', 1); if (!array_key_exists(0, $info)) { warn_exit(do_lang_tempcode('MISSING_RESOURCE')); } $forum_id = $info[0]['t_forum_id']; $or_list = ''; foreach ($posts as $post) { if ($or_list != '') { $or_list .= ' OR '; } $or_list .= 'id=' . strval((int) $post); } // Check access $_postdetails = $GLOBALS['FORUM_DB']->query('SELECT id,p_post,p_poster,p_time,p_intended_solely_for,p_validated FROM ' . $GLOBALS['FORUM_DB']->get_table_prefix() . 'f_posts WHERE ' . $or_list); $num_posts_counted = 0; foreach ($_postdetails as $post) { if (is_null($post['p_intended_solely_for']) && $post['p_validated'] == 1) { $num_posts_counted++; } $post_owner = $post['p_poster']; if (!ocf_may_delete_post_by($post_owner, $forum_id)) { access_denied('I_ERROR'); } } // Save in history foreach ($_postdetails as $post) { $GLOBALS['FORUM_DB']->query_insert('f_post_history', array('h_create_date_and_time' => $post['p_time'], 'h_action_date_and_time' => time(), 'h_owner_member_id' => $post['p_poster'], 'h_alterer_member_id' => get_member(), 'h_post_id' => $post['id'], 'h_topic_id' => $topic_id, 'h_before' => get_translated_text($post['p_post'], $GLOBALS['FORUM_DB']), 'h_action' => 'DELETE_POST')); } // Update member post counts $post_counts = is_null($forum_id) ? 1 : $GLOBALS['FORUM_DB']->query_value('f_forums', 'f_post_count_increment', array('id' => $forum_id)); if ($post_counts == 1) { $sql = 'SELECT p_poster FROM ' . $GLOBALS['FORUM_DB']->get_table_prefix() . 'f_posts WHERE (' . $or_list . ')'; if (addon_installed('unvalidated')) { $sql .= ' AND p_validated=1'; } $_member_post_counts = $GLOBALS['FORUM_DB']->query($sql); $member_post_counts = array(); foreach ($_member_post_counts as $_member_post_count) { $_member = $_member_post_count['p_poster']; if (!array_key_exists($_member, $member_post_counts)) { $member_post_counts[$_member] = 0; } $member_post_counts[$_member]++; } foreach ($member_post_counts as $member_id => $member_post_count) { if (!is_null($forum_id)) { ocf_force_update_member_post_count($member_id, -$member_post_count); } } } // Clean up lang require_code('attachments2'); require_code('attachments3'); foreach ($_postdetails as $post) { delete_lang_comcode_attachments($post['p_post'], 'ocf_post', $post['id'], $GLOBALS['FORUM_DB']); } $GLOBALS['FORUM_DB']->query('DELETE FROM ' . $GLOBALS['FORUM_DB']->get_table_prefix() . 'f_posts WHERE ' . $or_list); $GLOBALS['SITE_DB']->query('DELETE FROM ' . $GLOBALS['SITE_DB']->get_table_prefix() . 'review_supplement WHERE ' . str_replace('id=', 'r_post_id=', $or_list)); $test = $GLOBALS['FORUM_DB']->query_value('f_posts', 'COUNT(*)', array('p_topic_id' => $topic_id)); if ($test == 0) { require_code('ocf_topics_action'); require_code('ocf_topics_action2'); ocf_delete_topic($topic_id, do_lang('DELETE_POSTS')); $ret = true; } else { $ret = false; // Update cacheing ocf_force_update_topic_cacheing($topic_id, -$num_posts_counted, true, true); } if (!is_null($forum_id)) { ocf_force_update_forum_cacheing($forum_id, 0, -$num_posts_counted); } require_code('ocf_general_action2'); if (count($posts) == 1) { ocf_mod_log_it('DELETE_POST', strval($topic_id), strval($posts[0]), $reason); } else { ocf_mod_log_it('DELETE_POSTS', strval($topic_id), strval(count($posts)), $reason); } if (!is_null($forum_id)) { ocf_decache_ocp_blocks($forum_id); } else { decache('side_ocf_personal_topics'); decache('_new_pp'); } return $ret; }