/** * Show the point transactions a member has had. * * @param ID_TEXT The type of transactions we are looking for * @set from to * @param MEMBER Who we are looking at transactions for * @param MEMBER Who we are looking at transactions using the account of * @return tempcode The UI */ function points_get_transactions($type, $member_id_of, $member_id_viewing) { $where = array('gift_' . $type => $member_id_of); if ($type == 'from') { $where['anonymous'] = 0; } $start = get_param_integer('gift_start_' . $type, 0); $max = get_param_integer('gift_max_' . $type, 10); $sortables = array('date_and_time' => do_lang_tempcode('DATE'), 'amount' => do_lang_tempcode('AMOUNT')); $test = explode(' ', get_param('gift_sort_' . $type, 'date_and_time DESC')); if (count($test) == 1) { $test[1] = 'DESC'; } list($sortable, $sort_order) = $test; if (strtoupper($sort_order) != 'ASC' && strtoupper($sort_order) != 'DESC' || !array_key_exists($sortable, $sortables)) { log_hack_attack_and_exit('ORDERBY_HACK'); } global $NON_CANONICAL_PARAMS; $NON_CANONICAL_PARAMS[] = 'gift_sort_' . $type; $NON_CANONICAL_PARAMS[] = 'gift_start_' . $type; $max_rows = $GLOBALS['SITE_DB']->query_value('gifts', 'COUNT(*)', $where); $rows = $GLOBALS['SITE_DB']->query_select('gifts g LEFT JOIN ' . $GLOBALS['SITE_DB']->get_table_prefix() . 'translate t ON ' . db_string_equal_to('language', user_lang()) . ' AND t.id=g.reason', array('*'), $where, 'ORDER BY ' . $sortable . ' ' . $sort_order, $max, $start); $out = new ocp_tempcode(); $viewing_name = $GLOBALS['FORUM_DRIVER']->get_username($member_id_of); if (is_null($viewing_name)) { $viewing_name = do_lang('UNKNOWN'); } require_code('templates_results_table'); $fields_title = results_field_title(array(do_lang_tempcode('DATE'), do_lang_tempcode('AMOUNT'), do_lang_tempcode('FROM'), do_lang_tempcode('TO'), do_lang_tempcode('REASON')), $sortables, 'gift_sort_' . $type, $sortable . ' ' . $sort_order); foreach ($rows as $myrow) { if ($myrow['anonymous'] == 1 && $type == 'from') { continue; } // Their name $fromname = is_guest($myrow['gift_from']) ? get_site_name() : $GLOBALS['FORUM_DRIVER']->get_username($myrow['gift_from']); $toname = $GLOBALS['FORUM_DRIVER']->get_username($myrow['gift_to']); if (is_null($fromname)) { $fromname = do_lang('UNKNOWN'); } if ($myrow['anonymous'] == 1 && !is_guest($myrow['gift_from'])) { if (!has_specific_permission($member_id_viewing, 'trace_anonymous_gifts')) { $_fromname = do_lang_tempcode('ANON'); } else { $_fromname = hyperlink(build_url(array('page' => 'points', 'type' => 'member', 'id' => $myrow['gift_from']), get_module_zone('points')), do_lang_tempcode('ANON'), false, false, escape_html($fromname)); } } else { $_fromname = is_guest($myrow['gift_from']) ? make_string_tempcode(escape_html($fromname)) : hyperlink(build_url(array('page' => 'points', 'type' => 'member', 'id' => $myrow['gift_from']), get_module_zone('points')), escape_html($fromname), false, false, do_lang_tempcode('VIEW_POINTS')); } $_toname = hyperlink(build_url(array('page' => 'points', 'type' => 'member', 'id' => $myrow['gift_to']), get_module_zone('points')), escape_html($toname), false, false, do_lang_tempcode('VIEW_POINTS')); $date = get_timezoned_date($myrow['date_and_time']); $amount = $myrow['amount']; if (get_page_name() != 'search' && array_key_exists('text_parsed', $myrow) && !is_null($myrow['text_parsed']) && $myrow['text_parsed'] != '' && $myrow['reason'] != 0) { $reason = new ocp_tempcode(); if (!$reason->from_assembly($myrow['text_parsed'], true)) { $reason = get_translated_tempcode($myrow['reason']); } } else { $reason = get_translated_tempcode($myrow['reason']); } $out->attach(results_entry(array(escape_html($date), escape_html(integer_format($amount)), $_fromname, $_toname, $reason))); } $out = results_table(do_lang_tempcode('_POINTS', escape_html($viewing_name)), $start, 'gift_start_' . $type, $max, 'gift_max_' . $type, $max_rows, $fields_title, $out, $sortables, $sortable, $sort_order, 'gift_sort_' . $type, NULL, NULL, NULL, 8, 'gfhfghtrhhjghgfhfgf', false, 'tab__points'); if ($type == 'to') { $title = do_lang_tempcode('POINTS_TO'); } else { $title = do_lang_tempcode('POINTS_FROM'); } return do_template('POINTS_TRANSACTIONS_WRAP', array('_GUID' => 'f19e3eedeb0b8bf398251b24e8389723', 'CONTENT' => $out, 'TITLE' => $title)); }
/** * Show a post, isolated of the other posts in it's topic. * * @param array The post row. * @param boolean Whether to use the post title, as opposed to the post's topic's title. * @return tempcode The isolated post. */ function ocf_show_isolated_post($row, $use_post_title = false) { require_code('ocf_groups'); require_css('ocf'); // Poster title $primary_group = $GLOBALS['FORUM_DRIVER']->get_member_row_field($row['p_poster'], 'm_primary_group'); if (!is_null($primary_group)) { if (addon_installed('ocf_member_titles')) { $poster_title = $GLOBALS['OCF_DRIVER']->get_member_row_field($row['p_poster'], 'm_title'); if ($poster_title == '') { $poster_title = get_translated_text(ocf_get_group_property($primary_group, 'title'), $GLOBALS['FORUM_DB']); } } else { $poster_title = ''; } $avatar = $GLOBALS['FORUM_DRIVER']->get_member_avatar_url($row['p_poster']); $posters_groups = $GLOBALS['FORUM_DRIVER']->get_members_groups($row['p_poster'], true); } else { $poster_title = ''; $avatar = ''; $posters_groups = array(); } // Avatar if (is_guest($row['p_poster'])) { if ($row['p_poster_name_if_guest'] == do_lang('SYSTEM')) { $avatar = find_theme_image('ocf_default_avatars/default_set/ocp_fanatic', true); } } if ($avatar != '') { $post_avatar = do_template('OCF_TOPIC_POST_AVATAR', array('AVATAR' => $avatar)); } else { $post_avatar = new ocp_tempcode(); } // Rank images $rank_images = new ocp_tempcode(); foreach ($posters_groups as $group) { $rank_image = ocf_get_group_property($group, 'rank_image'); $group_leader = ocf_get_group_property($group, 'group_leader'); $group_name = ocf_get_group_name($group); $rank_image_pri_only = ocf_get_group_property($group, 'rank_image_pri_only'); if ($rank_image != '' && ($rank_image_pri_only == 0 || $group == $primary_group)) { $rank_images->attach(do_template('OCF_RANK_IMAGE', array('GROUP_NAME' => $group_name, 'USERNAME' => $GLOBALS['FORUM_DRIVER']->get_username($row['p_poster']), 'IMG' => $rank_image, 'IS_LEADER' => $group_leader == $row['p_poster']))); } } // Poster details if (!is_guest($row['p_poster']) && !is_null($primary_group)) { require_code('ocf_members2'); $poster_details = ocf_show_member_box($row['p_poster'], false, NULL, NULL, false); } else { $custom_fields = new ocp_tempcode(); $poster_details = new ocp_tempcode(); } if (!is_guest($row['p_poster']) && !is_null($primary_group)) { $poster = do_template('OCF_POSTER_MEMBER', array('ONLINE' => member_is_online($row['p_poster']), 'ID' => strval($row['p_poster']), 'POSTER_DETAILS' => $poster_details, 'PROFILE_URL' => $GLOBALS['FORUM_DRIVER']->member_profile_url($row['p_poster'], false, true), 'POSTER_USERNAME' => $GLOBALS['FORUM_DRIVER']->get_username($row['p_poster']), 'HIGHLIGHT_NAME' => NULL)); } else { $poster = do_template('OCF_POSTER_GUEST', array('IP_LINK' => '', 'POSTER_DETAILS' => $poster_details, 'POSTER_USERNAME' => $row['p_poster_name_if_guest'] != '' ? $row['p_poster_name_if_guest'] : do_lang('GUEST'))); } // Last edited if (!is_null($row['p_last_edit_time'])) { $last_edited = do_template('OCF_TOPIC_POST_LAST_EDITED', array('LAST_EDIT_DATE_RAW' => is_null($row['p_last_edit_time']) ? '' : strval($row['p_last_edit_time']), 'LAST_EDIT_DATE' => get_timezoned_date($row['p_last_edit_time']), 'LAST_EDIT_PROFILE_URL' => is_null($row['p_last_edit_by']) ? '' : $GLOBALS['FORUM_DRIVER']->member_profile_url($row['p_last_edit_by'], false, true), 'LAST_EDIT_USERNAME' => is_null($row['p_last_edit_by']) ? '' : $GLOBALS['FORUM_DRIVER']->get_username($row['p_last_edit_by']))); } else { $last_edited = new ocp_tempcode(); } $last_edited_raw = is_null($row['p_last_edit_time']) ? '' : strval($row['p_last_edit_time']); // Misc stuff $poster_id = $row['p_poster']; $tree = ocf_forum_breadcrumbs($row['p_cache_forum_id']); $post_url = build_url(array('page' => 'topicview', 'type' => 'findpost', 'id' => $row['id']), get_module_zone('topicview')); $post_url->attach('#post_' . strval($row['id'])); if (get_page_name() != 'search' && array_key_exists('text_parsed', $row) && !is_null($row['text_parsed']) && $row['text_parsed'] != '' && $row['p_post'] != 0) { $post = new ocp_tempcode(); if (!$post->from_assembly($row['text_parsed'], true)) { $post = get_translated_tempcode($row['p_post'], $GLOBALS['FORUM_DB']); } } else { $post = get_translated_tempcode($row['p_post'], $GLOBALS['FORUM_DB']); } $post_date = get_timezoned_date($row['p_time']); $post_date_raw = $row['p_time']; if ($use_post_title) { $post_title = $row['p_title']; } else { $post_title = $GLOBALS['FORUM_DB']->query_value('f_topics', 't_cache_first_title', array('id' => $row['p_topic_id'])); if ($row['p_title'] != $post_title) { $post_title .= ': ' . $row['p_title']; } } //if ($post_title=='') $post_title=do_lang_tempcode('ISOLATED_POST_TITLE',strval($row['id'])); $emphasis = new ocp_tempcode(); if ($row['p_is_emphasised'] == 1) { $emphasis = do_lang_tempcode('IMPORTANT'); } elseif (!is_null($row['p_intended_solely_for'])) { $pp_to_username = $GLOBALS['FORUM_DRIVER']->get_username($row['p_intended_solely_for']); if (is_null($pp_to_username)) { $pp_to_username = do_lang('UNKNOWN'); } $emphasis = do_lang('PP_TO', $pp_to_username); } require_code('feedback'); actualise_rating(true, 'post', strval($row['id']), get_self_url(), $row['p_title']); $rating = display_rating(get_self_url(), $row['p_title'], 'post', strval($row['id']), 'RATING_INLINE_DYNAMIC', $row['p_poster']); // Render return do_template('OCF_ISOLATED_POST', array('_GUID' => '9456f4fe4b8fb1bf34f606fcb2bcc9d7', 'URL' => $post_url, 'ID' => strval($row['id']), 'TREE' => $tree, 'POST' => do_template('OCF_TOPIC_POST', array('ID' => strval($row['id']), 'TOPIC_FIRST_POST_ID' => '', 'TOPIC_FIRST_POSTER' => '', 'POST_ID' => strval($row['id']), 'URL' => $post_url, 'CLASS' => $row['p_is_emphasised'] == 1 ? 'ocf_post_emphasis' : (!is_null($row['p_intended_solely_for']) ? 'ocf_post_personal' : ''), 'EMPHASIS' => $emphasis, 'FIRST_UNREAD' => '', 'POSTER_TITLE' => $poster_title, 'POST_TITLE' => $post_title, 'POST_DATE_RAW' => strval($post_date_raw), 'POST_DATE' => $post_date, 'POST' => $post, 'TOPIC_ID' => is_null($row['p_topic_id']) ? '' : strval($row['p_topic_id']), 'LAST_EDITED_RAW' => $last_edited_raw, 'LAST_EDITED' => $last_edited, 'POSTER_ID' => strval($poster_id), 'POSTER' => $poster, 'POSTER_DETAILS' => $poster_details, 'POST_AVATAR' => $post_avatar, 'RANK_IMAGES' => $rank_images, 'BUTTONS' => '', 'SIGNATURE' => '', 'UNVALIDATED' => '', 'DESCRIPTION' => '', 'PREVIEWING' => true, 'RATING' => $rating)))); }
/** * Get a tempcoded version of a normal XHTML template. It is perhaps the most common ocPortal function to load up templates using do_template, and then attach them together either as parameters to each other, or via the tempcode attach method. * * @param ID_TEXT The codename of the template being loaded * @param ?array A map of parameters for the template (key to value) (NULL: no parameters) * @param ?LANGUAGE_NAME The language to load the template in (templates can embed language references) (NULL: users own language) * @param boolean Whether to not produce a stack dump if the template is missing * @param ?ID_TEXT Alternate template to use if the primary one does not exist (NULL: none) * @param string File type suffix of template file (e.g. .tpl) * @param string Subdirectory type to look in * @set templates css * @param ID_TEXT Theme to use * @return tempcode The tempcode for this template */ function do_template($codename, $parameters = NULL, $lang = NULL, $light_error = false, $fallback = NULL, $suffix = '.tpl', $type = 'templates', $theme = NULL) { if (is_null($lang) || $lang == '') { global $USER_LANG_CACHED; $lang = isset($USER_LANG_CACHED) ? $USER_LANG_CACHED : (function_exists('user_lang') ? user_lang() : 'EN'); } if ($GLOBALS['SEMI_DEBUG_MODE']) { if ($codename != 'tempcode_test' && $codename != 'handle_conflict_resolution' && strtoupper($codename) != strtoupper($codename)) { fatal_exit('Template names should be in upper case, and the files should be stored in upper case.'); } if (substr($codename, -7) == '_SCREEN' || $codename == 'POOR_XHTML_WRAPPER' || $codename == 'OCF_WRAPPER') { $GLOBALS['SCREEN_TEMPLATE_CALLED'] = $codename; } } if (is_null($parameters)) { $parameters = array(); } global $RECORD_TEMPLATES_USED, $FILE_ARRAY, $MEM_CACHE, $CACHE_TEMPLATES, $KEEP_MARKERS, $SHOW_EDIT_LINKS, $XHTML_SPIT_OUT, $TEMPLATE_CACHE, $MOBILE, $FORUM_DRIVER; $special_treatment = ($KEEP_MARKERS || $SHOW_EDIT_LINKS) && is_null($XHTML_SPIT_OUT); // Is it already loaded? if ($RECORD_TEMPLATES_USED) { global $RECORDED_TEMPLATES_USED; $RECORDED_TEMPLATES_USED[] = $codename; } // Variables we'll need if (!isset($theme)) { $theme = isset($FORUM_DRIVER) && is_object($FORUM_DRIVER) && method_exists($FORUM_DRIVER, 'get_theme') ? filter_naughty($FORUM_DRIVER->get_theme()) : 'default'; } $_codename = $MOBILE ? $codename . '_mobile' : $codename; if (isset($TEMPLATE_CACHE[$theme][$codename][$lang])) { $_data = $TEMPLATE_CACHE[$theme][$codename][$lang]->bind($parameters, $codename); // Copy and pasted to remove need for an function call if ($special_treatment) { if ($KEEP_MARKERS) { $__data = make_string_tempcode('<!-- START-TEMPLATE=' . $codename . ' -->'); $__data->attach($_data); $__data->attach('<!-- END-TEMPLATE=' . $codename . ' -->'); $_data = $__data; } if ($SHOW_EDIT_LINKS) { $edit_url = build_url(array('page' => 'admin_themes', 'theme' => $FORUM_DRIVER->get_theme(), 'template' => $codename), 'adminzone'); $_data->attach('<br /><a href="' . escape_html($edit_url->evaluate()) . '">' . do_lang('EDIT') . ' ' . $codename . '</a>'); } } return $_data; } // Is it structurally cached on disk yet? $data = mixed(); if ($CACHE_TEMPLATES) { if (!is_null($MEM_CACHE)) { $data = persistant_cache_get(array('TEMPLATE', $theme, $lang, $_codename)); if (!is_null($data)) { $_data = new ocp_tempcode(); $_data->from_assembly($data); if ($_data->bits == array()) { $data = false; } // Corrupt somehow } else { $data = false; } } elseif (is_null($data)) { $_data = new ocp_tempcode(); $tcp_path = get_custom_file_base() . '/themes/' . $theme . '/templates_cached/' . $lang . '/' . $_codename . $suffix . '.tcd'; $data = @file_get_contents($tcp_path, FILE_BINARY); if ($data === '') { $data = false; } // '' needed for PHP4 - weird if ($data !== false) { $_data->from_assembly($data); if ($_data->bits == array()) { $data = false; } // Corrupt somehow } } } else { $data = false; } if ($data === false) { if (!isset($FILE_ARRAY)) { $_data = NULL; $prefix_default = get_file_base() . '/themes/'; $prefix = $theme == 'default' ? $prefix_default : get_custom_file_base() . '/themes/'; if (file_exists($prefix . $theme . '/' . $type . '_custom/' . $_codename . $suffix)) { $_data = _do_template($theme, '/' . $type . '_custom/', $_codename, $_codename, $lang, $suffix, $theme); } elseif (file_exists($prefix . $theme . '/' . $type . '/' . $_codename . $suffix)) { $_data = _do_template($theme, '/' . $type . '/', $_codename, $_codename, $lang, $suffix, $theme); } elseif (!is_null($GLOBALS['CURRENT_SHARE_USER']) && $theme != 'default' && file_exists($prefix_default . $theme . '/' . $type . '_custom/' . $_codename . $suffix)) { $_data = _do_template($theme, '/' . $type . '_custom/', $_codename, $_codename, $lang, $suffix, $theme); } elseif (!is_null($GLOBALS['CURRENT_SHARE_USER']) && $theme != 'default' && file_exists($prefix_default . $theme . '/' . $type . '/' . $_codename . $suffix)) { $_data = _do_template($theme, '/' . $type . '/', $_codename, $_codename, $lang, $suffix, $theme); } elseif (file_exists($prefix_default . 'default' . '/' . $type . '_custom/' . $_codename . $suffix)) { $_data = _do_template('default', '/' . $type . '_custom/', $_codename, $_codename, $lang, $suffix, $theme); } elseif (file_exists($prefix_default . 'default' . '/' . $type . '/' . $_codename . $suffix)) { $_data = _do_template('default', '/' . $type . '/', $_codename, $_codename, $lang, $suffix, $theme); } elseif ($codename != $_codename) { if (file_exists($prefix . $theme . '/' . $type . '_custom/' . $codename . $suffix)) { $_data = _do_template($theme, '/' . $type . '_custom/', $codename, $_codename, $lang, $suffix, $theme); } elseif (file_exists($prefix . $theme . '/' . $type . '/' . $codename . $suffix)) { $_data = _do_template($theme, '/' . $type . '/', $codename, $_codename, $lang, $suffix, $theme); } elseif (file_exists($prefix_default . 'default' . '/' . $type . '_custom/' . $codename . $suffix)) { $_data = _do_template('default', '/' . $type . '_custom/', $codename, $_codename, $lang, $suffix, $theme); } elseif (file_exists($prefix_default . 'default' . '/' . $type . '/' . $codename . $suffix)) { $_data = _do_template('default', '/' . $type . '/', $codename, $_codename, $lang, $suffix, $theme); } } if (is_null($_data)) { if (is_null($fallback)) { if ($light_error) { return paragraph(do_lang_tempcode('MISSING_TEMPLATE_FILE', escape_html($codename))); } fatal_exit(do_lang_tempcode('MISSING_TEMPLATE_FILE', escape_html($codename))); } else { $result = do_template($fallback, $parameters, $lang); $TEMPLATE_CACHE[$theme][$codename][$lang] = $TEMPLATE_CACHE[$fallback][$lang]; return $result; } } } else { $_data = _do_template('default', '/' . $type . '/', $codename, $codename, $lang, $suffix, $theme); } } $TEMPLATE_CACHE[$theme][$codename][$lang] = $_data; $ret = $_data->bind($parameters, $codename); if ($special_treatment) { if ($KEEP_MARKERS) { $__data = new ocp_tempcode(); $__data->attach('<!-- START-TEMPLATE=' . $codename . ' -->'); $__data->attach($ret); $__data->attach('<!-- END-TEMPLATE=' . $codename . ' -->'); $ret = $__data; } if ($SHOW_EDIT_LINKS && $codename != 'PARAM_INFO') { $param_info = do_template('PARAM_INFO', array('MAP' => $parameters)); $edit_url = build_url(array('page' => 'admin_themes', 'theme' => $FORUM_DRIVER->get_theme(), 'template' => $codename), 'adminzone'); $SHOW_EDIT_LINKS = false; $ret = do_template('TEMPLATE_EDIT_LINK', array('_GUID' => '511ae911d31a5b237a4371ff22fc78fd', 'PARAM_INFO' => $param_info, 'CONTENTS' => $ret, 'CODENAME' => $codename, 'EDIT_URL' => $edit_url)); $SHOW_EDIT_LINKS = true; } } return $ret; }
/** * Get an array of topics in the given forum. Each topic is an array with the following attributes: * - id, the topic ID * - title, the topic title * - lastusername, the username of the last poster * - lasttime, the timestamp of the last reply * - closed, a Boolean for whether the topic is currently closed or not * - firsttitle, the title of the first post * - firstpost, the first post (only set if $show_first_posts was true) * * @param object Link to the real forum driver * @param mixed The forum name or an array of forum IDs * @param integer The limit * @param integer The start position * @param integer The total rows (not a parameter: returns by reference) * @param SHORT_TEXT The topic title filter * @param SHORT_TEXT The topic description filter * @param boolean Whether to show the first posts * @param string The date key to sort by * @set lasttime firsttime * @param boolean Whether to limit to hot topics * @return ?array The array of topics (NULL: error/none) */ function _helper_show_forum_topics($this_ref, $name, $limit, $start, &$max_rows, $filter_topic_title, $filter_topic_description, $show_first_posts, $date_key, $hot) { if (is_integer($name)) { $id_list = 't_forum_id=' . strval((int) $name); } elseif (!is_array($name)) { $id = $this_ref->forum_id_from_name($name); if (is_null($id)) { return NULL; } $id_list = 't_forum_id=' . strval((int) $id); } else { $id_list = ''; foreach (array_keys($name) as $id) { if ($id_list != '') { $id_list .= ' OR '; } $id_list .= 't_forum_id=' . strval((int) $id); } if ($id_list == '') { return NULL; } } if ($hot) { $hot_topic_definition = intval(get_option('hot_topic_definition')); $topic_filter_sup = ' AND t_cache_num_posts/((t_cache_last_time-t_cache_first_time)/60/60/24+1)>' . strval($hot_topic_definition); } else { $topic_filter_sup = ''; } global $SITE_INFO; if (!(isset($SITE_INFO['mysql_old']) && $SITE_INFO['mysql_old'] == '1' || !isset($SITE_INFO['mysql_old']) && is_file(get_file_base() . '/mysql_old'))) { if ($filter_topic_title == '' && $filter_topic_description == '') { $query = 'SELECT * FROM ' . $this_ref->connection->get_table_prefix() . 'f_topics top WHERE (' . $id_list . ')' . $topic_filter_sup; } else { $query = ''; $topic_filters = array(); if ($filter_topic_title != '') { $topic_filters[] = 't_cache_first_title LIKE \'' . db_encode_like($filter_topic_title) . '\''; } if ($filter_topic_description != '') { $topic_filters[] = 't_description LIKE \'' . db_encode_like($filter_topic_description) . '\''; } foreach ($topic_filters as $topic_filter) { if ($query != '') { $query .= ' UNION '; } $query .= 'SELECT * FROM ' . $this_ref->connection->get_table_prefix() . 'f_topics top WHERE (' . $id_list . ') AND ' . $topic_filter . $topic_filter_sup; } } } else { $topic_filter = ''; if ($filter_topic_title != '') { $topic_filter .= 't_cache_first_title LIKE \'' . db_encode_like($filter_topic_title) . '\''; } if ($filter_topic_description != '') { $topic_filter .= ' OR t_description LIKE \'' . db_encode_like($filter_topic_description) . '\''; } if ($topic_filter != '') { $topic_filter = ' AND (' . $topic_filter . ')'; } $query = 'SELECT * FROM ' . $this_ref->connection->get_table_prefix() . 'f_topics top WHERE (' . $id_list . ') ' . $topic_filter . $topic_filter_sup; } $post_query_select = 'p.p_title,t.text_parsed,t.id,p.p_poster,p.p_poster_name_if_guest'; $post_query_where = 'p_validated=1 AND p_topic_id=top.id ' . not_like_spacer_posts('t.text_original'); $post_query_sql = 'SELECT ' . $post_query_select . ' FROM ' . $this_ref->connection->get_table_prefix() . 'f_posts p '; if (strpos(get_db_type(), 'mysql') !== false) { $post_query_sql .= 'USE INDEX(in_topic) '; } $post_query_sql .= 'LEFT JOIN ' . $this_ref->connection->get_table_prefix() . 'translate t ON t.id=p.p_post WHERE ' . $post_query_where . ' ORDER BY p_time,p.id'; if (strpos(get_db_type(), 'mysql') !== false) { // So topics with no validated posts, or only spacer posts, are not drawn out only to then be filtered layer (meaning we don't get enough result) $query .= ' AND EXISTS(' . $post_query_sql . ')'; } $max_rows = $this_ref->connection->query_value_null_ok_full(preg_replace('#(^| UNION )SELECT \\* #', '${1}SELECT COUNT(*) ', $query), false, true); if ($limit == 0) { return array(); } $rows = $this_ref->connection->query($query . ' ORDER BY ' . ($date_key == 'lasttime' ? 't_cache_last_time' : 't_cache_first_time') . ' DESC', $limit, $start, false, true); $out = array(); foreach ($rows as $i => $r) { $out[$i] = array(); $out[$i]['id'] = $r['id']; $out[$i]['num'] = $r['t_cache_num_posts']; $out[$i]['title'] = $r['t_cache_first_title']; $out[$i]['description'] = $r['t_description']; $out[$i]['firstusername'] = $r['t_cache_first_username']; $out[$i]['lastusername'] = $r['t_cache_last_username']; $out[$i]['firstmemberid'] = $r['t_cache_first_member_id']; $out[$i]['lastmemberid'] = $r['t_cache_last_member_id']; $out[$i]['firsttime'] = $r['t_cache_first_time']; $out[$i]['lasttime'] = $r['t_cache_last_time']; $out[$i]['closed'] = 1 - $r['t_is_open']; $out[$i]['forum_id'] = $r['t_forum_id']; $post_query_sql = str_replace('top.id', strval($out[$i]['id']), $post_query_sql); $fp_rows = $this_ref->connection->query($post_query_sql, 1); if (!array_key_exists(0, $fp_rows)) { unset($out[$i]); continue; } $out[$i]['firstusername'] = $fp_rows[0]['p_poster_name_if_guest']; $out[$i]['firstmemberid'] = $fp_rows[0]['p_poster']; $out[$i]['firsttitle'] = $fp_rows[0]['p_title']; if ($show_first_posts) { $message = new ocp_tempcode(); if (get_page_name() != 'search' && !is_null($fp_rows[0]['text_parsed']) && $fp_rows[0]['text_parsed'] != '' && $fp_rows[0]['id'] != 0) { if (!$message->from_assembly($fp_rows[0]['text_parsed'], true)) { $message = get_translated_tempcode($fp_rows[0]['id'], $GLOBALS['FORUM_DB']); } } else { $message = get_translated_tempcode($fp_rows[0]['id'], $GLOBALS['FORUM_DB']); } $out[$i]['firstpost'] = $message; } } if (count($out) != 0) { return $out; } return NULL; }
/** * Do the wrapper that fits around OCF module output. * * @param tempcode The title for the module output that we are wrapping. * @param tempcode The module output that we are wrapping. * @param boolean Whether to include the personal bar in the wrap. * @param boolean Whether to include statistics in the wrap. * @param ?AUTO_LINK The forum to make the search link search under (NULL: Users own PT forum/unknown). * @return tempcode The wrapped output. */ function ocf_wrapper($title, $content, $show_personal_bar = true, $show_stats = true, $forum_id = NULL) { global $ZONE; $wide = is_wide(); if ($wide == 0 && get_value('force_forum_bar') !== '1') { $show_personal_bar = false; $show_stats = false; } // Notifications if (!is_guest() && (get_page_name() == 'forumview' || get_page_name() == 'topicview' || get_page_name() == 'vforums')) { $cache_identifier = serialize(array(get_member())); $_notifications = NULL; if ((get_option('is_on_block_cache') == '1' || get_param_integer('keep_cache', 0) == 1 || get_param_integer('cache', 0) == 1) && (get_param_integer('keep_cache', NULL) !== 0 && get_param_integer('cache', NULL) !== 0)) { $_notifications = get_cache_entry('_new_pp', $cache_identifier, 10000); } if (is_null($_notifications)) { require_code('ocf_notifications'); list($notifications, $num_unread_pps) = generate_notifications($cache_identifier); } else { list($__notifications, $num_unread_pps) = $_notifications; $notifications = new ocp_tempcode(); if (!$notifications->from_assembly($__notifications, true)) { require_code('ocf_notifications'); list($notifications, $num_unread_pps) = generate_notifications($cache_identifier); } if (!$notifications->is_empty()) { require_javascript('javascript_ajax'); } } } else { $notifications = new ocp_tempcode(); $num_unread_pps = 0; } if ($show_personal_bar) { if (get_member() != $GLOBALS['OCF_DRIVER']->get_guest_id()) { $member_info = ocf_read_in_member_profile(get_member(), true); $profile_url = $GLOBALS['OCF_DRIVER']->member_profile_url(get_member(), true, true); $_new_topics = $GLOBALS['FORUM_DB']->query('SELECT COUNT(*) AS mycnt FROM ' . $GLOBALS['FORUM_DB']->get_table_prefix() . 'f_topics WHERE NOT t_forum_id IS NULL AND t_cache_first_time>' . strval((int) $member_info['last_visit_time'])); $new_topics = $_new_topics[0]['mycnt']; $_new_posts = $GLOBALS['FORUM_DB']->query('SELECT COUNT(*) AS mycnt FROM ' . $GLOBALS['FORUM_DB']->get_table_prefix() . 'f_posts WHERE NOT p_cache_forum_id IS NULL AND p_time>' . strval((int) $member_info['last_visit_time'])); $new_posts = $_new_posts[0]['mycnt']; $max_avatar_height = ocf_get_member_best_group_property(get_member(), 'max_avatar_height'); // Any unread PT-PPs? $pt_extra = $num_unread_pps == 0 ? new ocp_tempcode() : do_lang_tempcode('NUM_UNREAD', integer_format($num_unread_pps)); $personal_topic_url = build_url(array('page' => 'members', 'type' => 'view', 'id' => get_member()), get_module_zone('members'), NULL, true, false, false, 'tab__pts'); $head = do_template('OCF_MEMBER_BAR', array('_GUID' => 's3kdsadf0p3wsjlcfksdj', 'AVATAR' => array_key_exists('avatar', $member_info) ? $member_info['avatar'] : '', 'PROFILE_URL' => $profile_url, 'USERNAME' => $member_info['username'], 'LOGOUT_URL' => build_url(array('page' => 'login', 'type' => 'logout'), get_module_zone('login')), 'NUM_POINTS_ADVANCE' => array_key_exists('num_points_advance', $member_info) ? make_string_tempcode(integer_format($member_info['num_points_advance'])) : do_lang('NA'), 'NUM_POINTS' => array_key_exists('points', $member_info) ? integer_format($member_info['points']) : '', 'NUM_POSTS' => integer_format($member_info['posts']), 'PRIMARY_GROUP' => $member_info['primary_group_name'], 'LAST_VISIT_DATE_RAW' => strval($member_info['last_visit_time']), 'LAST_VISIT_DATE' => $member_info['last_visit_time_string'], 'PERSONAL_TOPIC_URL' => $personal_topic_url, 'NEW_POSTS_URL' => build_url(array('page' => 'vforums', 'type' => 'misc'), get_module_zone('vforums')), 'UNREAD_TOPICS_URL' => build_url(array('page' => 'vforums', 'type' => 'unread'), get_module_zone('vforums')), 'RECENTLY_READ_URL' => build_url(array('page' => 'vforums', 'type' => 'recently_read'), get_module_zone('vforums')), 'INLINE_PERSONAL_POSTS_URL' => build_url(array('page' => 'topicview'), get_module_zone('topicview')), 'PT_EXTRA' => $pt_extra, 'NEW_TOPICS' => integer_format($new_topics), 'NEW_POSTS' => integer_format($new_posts), 'MAX_AVATAR_HEIGHT' => strval($max_avatar_height))); } else { if (count($_POST) > 0) { $_this_url = build_url(array('page' => 'forumview'), 'forum', array('keep_session' => 1)); } else { $_this_url = build_url(array('page' => '_SELF'), '_SELF', array('keep_session' => 1), true); } $this_url = $_this_url->evaluate(); $login_url = build_url(array('page' => 'login', 'type' => 'login', 'redirect' => $this_url), get_module_zone('login')); $full_link = build_url(array('page' => 'login', 'type' => 'misc', 'redirect' => $this_url), get_module_zone('login')); $join_url = build_url(array('page' => 'join', 'redirect' => $this_url), get_module_zone('join')); $head = do_template('OCF_GUEST_BAR', array('NAVIGATION' => '', 'LOGIN_URL' => $login_url, 'JOIN_LINK' => $join_url, 'FULL_LINK' => $full_link)); } } else { $head = new ocp_tempcode(); } if ($show_stats) { $stats = ocf_get_forums_stats(); // Users online $users_online = new ocp_tempcode(); $count = 0; $members = get_online_members(false, NULL, $count); $groups_seen = array(); if (!is_null($members)) { //$members=collapse_2d_complexity('the_user','cache_username',$members); $guests = 0; foreach ($members as $bits) { $member = $bits['the_user']; $username = $bits['cache_username']; if ($member == $GLOBALS['OCF_DRIVER']->get_guest_id()) { $guests++; continue; } if (is_null($username)) { continue; } $url = $GLOBALS['OCF_DRIVER']->member_profile_url($member, false, true); if (!array_key_exists('m_primary_group', $bits)) { $bits['m_primary_group'] = $GLOBALS['FORUM_DRIVER']->get_member_row_field($member, 'm_primary_group'); } $pgid = $bits['m_primary_group']; //$GLOBALS['FORUM_DRIVER']->get_member_row_field($member,'m_primary_group'); if (is_null($pgid)) { continue; } // Deleted member $groups_seen[$pgid] = 1; $col = get_group_colour($pgid); $usergroup = ocf_get_group_name($pgid); if (get_value('disable_user_online_groups') === '1') { $usergroup = NULL; $col = NULL; $groups_seen = array(); } $users_online->attach(do_template('OCF_USER_MEMBER', array('_GUID' => 'a9cb1af2a04b14edd70749c944495bff', 'COLOUR' => $col, 'PROFILE_URL' => $url, 'USERNAME' => $username, 'USERGROUP' => $usergroup))); } if ($guests != 0) { if (!$users_online->is_empty()) { $users_online->attach(do_lang_tempcode('LIST_SEP')); } $users_online->attach(do_lang_tempcode('NUM_GUESTS', integer_format($guests))); } } // Birthdays $_birthdays = ocf_find_birthdays(); $birthdays = new ocp_tempcode(); foreach ($_birthdays as $_birthday) { $birthday_link = build_url(array('page' => 'topics', 'type' => 'birthday', 'id' => $_birthday['username']), get_module_zone('topics')); $birthday = do_template('OCF_BIRTHDAY_LINK', array('_GUID' => 'a98959187d37d80e134d47db7e3a52fa', 'AGE' => array_key_exists('age', $_birthday) ? integer_format($_birthday['age']) : NULL, 'PROFILE_URL' => $GLOBALS['OCF_DRIVER']->member_profile_url($_birthday['id'], false, true), 'USERNAME' => $_birthday['username'], 'BIRTHDAY_LINK' => $birthday_link)); $birthdays->attach($birthday); } if (!$birthdays->is_empty()) { $birthdays = do_template('OCF_BIRTHDAYS', array('_GUID' => '03da2c0d46e76407d63bff22aac354bd', 'BIRTHDAYS' => $birthdays)); } // Usergroup keys $groups = array(); $all_groups = $GLOBALS['FORUM_DRIVER']->get_usergroup_list(true, false, false, NULL, NULL, true); foreach ($all_groups as $gid => $gtitle) { if ($gid == db_get_first_id()) { continue; } // Throw out the first, guest if (array_key_exists($gid, $groups_seen)) { $groups[] = array('GCOLOUR' => get_group_colour($gid), 'GID' => strval($gid), 'GTITLE' => $gtitle); } } $foot = do_template('OCF_STATS', array('_GUID' => 'sdflkdlfd303frksdf', 'NEWEST_MEMBER_PROFILE_URL' => $GLOBALS['OCF_DRIVER']->member_profile_url($stats['newest_member_id'], false, true), 'NEWEST_MEMBER_USERNAME' => $stats['newest_member_username'], 'NUM_MEMBERS' => integer_format($stats['num_members']), 'NUM_TOPICS' => integer_format($stats['num_topics']), 'NUM_POSTS' => integer_format($stats['num_posts']), 'BIRTHDAYS' => $birthdays, 'USERS_ONLINE' => $users_online, 'USERS_ONLINE_URL' => has_actual_page_access(get_member(), 'onlinemembers') ? build_url(array('page' => 'onlinemembers'), get_module_zone('onlinemembers')) : new ocp_tempcode(), 'GROUPS' => $groups)); } else { $foot = new ocp_tempcode(); } $wrap = do_template('OCF_WRAPPER', array('_GUID' => '456c21db6c09ae260accfa4c2a59fce7', 'TITLE' => $title, 'NOTIFICATIONS' => $notifications, 'HEAD' => $head, 'FOOT' => $foot, 'CONTENT' => $content)); return $wrap; }
/** * Find the cached result of what is named by codename and the further constraints. * * @param ID_TEXT The codename to check for cacheing * @param LONG_TEXT The further restraints (a serialized map) * @param integer The TTL for the cache entry * @param boolean Whether we are cacheing Tempcode (needs special care) * @param boolean Whether to defer caching to CRON. Note that this option only works if the block's defined cache signature depends only on $map (timezone, bot-type, in-panel and interlock are automatically considered) * @param ?array Parameters to call up block with if we have to defer caching (NULL: none) * @return ?mixed The cached result (NULL: no cached result) */ function get_cache_entry($codename, $cache_identifier, $ttl = 10000, $tempcode = false, $caching_via_cron = false, $map = NULL) { if ($GLOBALS['MEM_CACHE'] !== NULL) { $pcache = persistant_cache_get(array('CACHE', $codename)); if ($pcache === NULL) { return NULL; } $theme = $GLOBALS['FORUM_DRIVER']->get_theme(); $lang = user_lang(); $pcache = isset($pcache[$cache_identifier][$lang][$theme]) ? $pcache[$cache_identifier][$lang][$theme] : NULL; if ($pcache === NULL) { if ($caching_via_cron) { request_via_cron($codename, $map, $tempcode); return paragraph(do_lang_tempcode('CACHE_NOT_READY_YET'), '', 'nothing_here'); } return NULL; } $cache_rows = array($pcache); } else { $cache_rows = $GLOBALS['SITE_DB']->query_select('cache', array('*'), array('lang' => user_lang(), 'cached_for' => $codename, 'the_theme' => $GLOBALS['FORUM_DRIVER']->get_theme(), 'identifier' => md5($cache_identifier)), '', 1); if (!isset($cache_rows[0])) { if ($caching_via_cron) { request_via_cron($codename, $map, $tempcode); return paragraph(do_lang_tempcode('CACHE_NOT_READY_YET'), '', 'nothing_here'); } return NULL; } if ($tempcode) { $ob = new ocp_tempcode(); if (!$ob->from_assembly($cache_rows[0]['the_value'], true)) { return NULL; } $cache_rows[0]['the_value'] = $ob; } else { $cache_rows[0]['the_value'] = unserialize($cache_rows[0]['the_value']); } } $stale = $ttl != -1 && time() > $cache_rows[0]['date_and_time'] + $ttl * 60; if (!$caching_via_cron && $stale) { return NULL; } else { if ($stale) { request_via_cron($codename, $map, $tempcode); } $cache = $cache_rows[0]['the_value']; if ($cache_rows[0]['langs_required'] != '') { $bits = explode('!', $cache_rows[0]['langs_required']); $langs_required = explode(':', $bits[0]); // Sometimes lang has got intertwinded with non cacheable stuff (and thus was itself not cached), so we need the lang files foreach ($langs_required as $lang) { if ($lang != '') { require_lang($lang, NULL, NULL, true); } } if (isset($bits[1])) { $javascripts_required = explode(':', $bits[1]); foreach ($javascripts_required as $javascript) { if ($javascript != '') { require_javascript($javascript); } } } if (isset($bits[2])) { $csss_required = explode(':', $bits[2]); foreach ($csss_required as $css) { if ($css != '') { require_css($css); } } } } return $cache; } }
/** * This function is an offshoot of get_translated_text, it instead returns parsed comcode that is linked to the specified language id. * * @param integer The id * @param ?object The database connection to use (NULL: standard site connection) * @param ?LANGUAGE_NAME The language (NULL: uses the current language) * @param boolean Whether to force it to the specified language * @param boolean Whether to force as_admin, even if the lang string isn't stored against an admin (designed for comcode page cacheing) * @param boolean Whether to remove from the Tempcode cache when we're done, for performance reasons (normally don't bother with this, but some code knows it won't be needed again -- esp Comcode cache layer -- and saves RAM by removing it) * @return ?tempcode The parsed comcode (NULL: the text couldn't be looked up) */ function get_translated_tempcode($entry, $connection = NULL, $lang = NULL, $force = false, $as_admin = false, $clear_away_from_cache = false) { if ($entry == 0) { return paragraph(do_lang_tempcode('FAILED_ENTRY'), 'rtgtedgrgd'); } if ($connection === NULL) { $connection = $GLOBALS['SITE_DB']; } global $RECORD_LANG_STRINGS_CONTENT; if ($RECORD_LANG_STRINGS_CONTENT) { global $RECORDED_LANG_STRINGS_CONTENT; $RECORDED_LANG_STRINGS_CONTENT[$entry] = $connection->connection_write != $GLOBALS['SITE_DB']->connection_write; } if ($lang === NULL) { $lang = user_lang(); } if ($lang == 'xxx') { return make_string_tempcode('!!!'); } // Helpful for testing language compliancy. We don't expect to see non x's/!'s if we're running this language if (isset($connection->text_lookup_cache[$entry]) && $lang == user_lang()) { $ret = $connection->text_lookup_cache[$entry]; if ($ret !== '') { if (is_string($ret)) { $connection->text_lookup_cache[$entry] = new ocp_tempcode(); $connection->text_lookup_cache[$entry]->from_assembly($ret); $ret = $connection->text_lookup_cache[$entry]; } if ($clear_away_from_cache) { unset($connection->text_lookup_cache[$entry]); unset($connection->text_lookup_original_cache[$entry]); } return $ret; } } global $SEARCH__CONTENT_BITS; if ($SEARCH__CONTENT_BITS !== NULL) { $_result = $connection->query_select('translate', array('text_original', 'source_user'), array('id' => $entry, 'language' => $lang), '', 1); if (array_key_exists(0, $_result)) { global $LAX_COMCODE; $temp = $LAX_COMCODE; $LAX_COMCODE = true; $result = $_result[0]; $ret = comcode_to_tempcode($result['text_original'], $result['source_user'], $as_admin, 60, NULL, $connection, false, false, false, false, false, $SEARCH__CONTENT_BITS); $LAX_COMCODE = $temp; return $ret; } } $_result = $connection->query_select('translate', array('text_parsed', 'text_original'), array('id' => $entry, 'language' => $lang), '', 1); $result = isset($_result[0]) ? $_result[0]['text_parsed'] : NULL; if (isset($_result[0])) { if ($lang == user_lang()) { $connection->text_lookup_original_cache[$entry] = $_result[0]['text_original']; } } if ($result === NULL || $result == '' || is_browser_decacheing()) { require_code('lang3'); return parse_translated_text($entry, $connection, $lang, $force, $as_admin); } $parsed = new ocp_tempcode(); if (!$parsed->from_assembly($result, true)) { require_code('lang3'); return parse_translated_text($entry, $connection, $lang, $force, $as_admin); } if ($lang == user_lang()) { $connection->text_lookup_cache[$entry] = $parsed; } return $parsed; }
/** * Convert a language string that is Comcode to tempcode, with potential cacheing in the db. * * @param ID_TEXT The language string ID * @return tempcode The parsed Comcode */ function _comcode_lang_string($lang_code) { global $COMCODE_LANG_STRING_CACHE; if (array_key_exists($lang_code, $COMCODE_LANG_STRING_CACHE)) { return $COMCODE_LANG_STRING_CACHE[$lang_code]; } $comcode_page = $GLOBALS['SITE_DB']->query_select('cached_comcode_pages p LEFT JOIN ' . $GLOBALS['SITE_DB']->get_table_prefix() . 'translate t ON t.id=string_index AND ' . db_string_equal_to('t.language', user_lang()), array('string_index', 'text_parsed'), array('the_page' => $lang_code, 'the_zone' => '!'), '', 1); if (array_key_exists(0, $comcode_page) && !is_browser_decacheing()) { if (!is_null($comcode_page[0]['text_parsed']) && $comcode_page[0]['text_parsed'] != '') { $parsed = new ocp_tempcode(); if (!$parsed->from_assembly($comcode_page[0]['text_parsed'], true)) { $ret = get_translated_tempcode($comcode_page[0]['string_index']); unset($GLOBALS['RECORDED_LANG_STRINGS_CONTENT'][$comcode_page[0]['string_index']]); } } else { $ret = get_translated_tempcode($comcode_page[0]['string_index'], NULL, NULL, true); if (is_null($ret)) { $looked_up = do_lang($lang_code, NULL, NULL, NULL, NULL, false); $GLOBALS['SITE_DB']->query_insert('translate', array('id' => $comcode_page[0]['string_index'], 'source_user' => get_member(), 'broken' => 0, 'importance_level' => 1, 'text_original' => $looked_up, 'text_parsed' => '', 'language' => user_lang()), true, false, true); $ret = get_translated_tempcode($comcode_page[0]['string_index']); } unset($GLOBALS['RECORDED_LANG_STRINGS_CONTENT'][$comcode_page[0]['string_index']]); return $ret; } $COMCODE_LANG_STRING_CACHE[$lang_code] = $parsed; return $parsed; } elseif (array_key_exists(0, $comcode_page)) { $GLOBALS['SITE_DB']->query_delete('cached_comcode_pages', array('the_page' => $lang_code, 'the_zone' => '!')); delete_lang($comcode_page[0]['string_index']); } $nql_backup = $GLOBALS['NO_QUERY_LIMIT']; $GLOBALS['NO_QUERY_LIMIT'] = true; $looked_up = do_lang($lang_code, NULL, NULL, NULL, NULL, false); if (is_null($looked_up)) { return make_string_tempcode(escape_html('{!' . $lang_code . '}')); } $index = insert_lang_comcode($looked_up, 4, NULL, true, NULL, 60, false, true); $GLOBALS['SITE_DB']->query_insert('cached_comcode_pages', array('the_zone' => '!', 'the_page' => $lang_code, 'string_index' => $index, 'the_theme' => $GLOBALS['FORUM_DRIVER']->get_theme(), 'cc_page_title' => NULL), false, true); // Race conditions $parsed = get_translated_tempcode($index); $COMCODE_LANG_STRING_CACHE[$lang_code] = $parsed; $GLOBALS['NO_QUERY_LIMIT'] = $nql_backup; return $parsed; }