/** * A hook that adds the subject prefixes to phpBB pages without modifying the page itself * @param phpbb_hook $phpbb_hook The phpBB hook object * @return void * @todo Change this method to a more flexible one. The current method is really * static and there is a lot of code duplication around here. */ public static function add_subject_prefix_to_page(&$hook) { // Only on regular pages if (!empty(sp_phpbb::$user->page['page_dir'])) { return; } // This is kinda nasty, viewforum.php?f=. should be handled as index.php if (sp_phpbb::$user->page['page_name'] == 'viewforum.' . PHP_EXT && isset(sp_phpbb::$template->_tpldata['forumrow'])) { sp_phpbb::$user->page['page_name'] = 'index.' . PHP_EXT; } // Add the prefix to certain pages switch (sp_phpbb::$user->page['page_name']) { case 'index.' . PHP_EXT: if (empty(sp_phpbb::$template->_tpldata['forumrow'])) { return; } // This MOD also supports Joas his "last post topic title MOD". if (isset(sp_phpbb::$config['altt_active']) && sp_phpbb::$config['altt_active']) { $blockvar = 'ALTT_LINK_NAME_SHORT'; } else { $blockvar = 'LAST_POST_SUBJECT'; } // To fetch the subject prefixes we'll need the last post ids $last_post_ids = array(); foreach (sp_phpbb::$template->_tpldata['forumrow'] as $row => $data) { // Need the last post link if (empty($data['U_LAST_POST'])) { continue; } $last_post_ids[$row] = substr(strrchr($data['U_LAST_POST'], 'p'), 1); } // Get the prefixes $sql = 'SELECT topic_last_post_id, subject_prefix_id FROM ' . TOPICS_TABLE . ' WHERE ' . sp_phpbb::$db->sql_in_set('topic_last_post_id', $last_post_ids); $result = sp_phpbb::$db->sql_query($sql); $last_post_ids = array_flip($last_post_ids); while ($row = sp_phpbb::$db->sql_fetchrow($result)) { $last_post_subject = sp_core::generate_prefix_string($row['subject_prefix_id']) . ' ' . sp_phpbb::$template->_tpldata['forumrow'][$last_post_ids[$row['topic_last_post_id']]][$blockvar]; // Alter the array sp_phpbb::$template->alter_block_array('forumrow', array($blockvar => $last_post_subject), $key = $last_post_ids[$row['topic_last_post_id']], 'change'); } sp_phpbb::$db->sql_freeresult($result); break; case 'mcp.' . PHP_EXT: break; case 'memberlist.' . PHP_EXT: // Most active topic if (!empty(sp_phpbb::$template->_tpldata['.'][0]['ACTIVE_TOPIC'])) { // Strip the topic id from link $topic_id = substr(strrchr(sp_phpbb::$template->_tpldata['.'][0]['U_ACTIVE_TOPIC'], '='), 1); // Get the subject prefix $sql = 'SELECT subject_prefix_id FROM ' . TOPICS_TABLE . ' WHERE topic_id = ' . (int) $topic_id; $result = sp_phpbb::$db->sql_query($sql); $pid = sp_phpbb::$db->sql_fetchfield('subject_prefix_id', false, $result); sp_phpbb::$db->sql_freeresult($result); // Send to the template $active_title = sp_core::generate_prefix_string($pid) . ' ' . sp_phpbb::$template->_tpldata['.'][0]['ACTIVE_TOPIC']; sp_phpbb::$template->assign_var('ACTIVE_TOPIC', $active_title); } break; case 'posting.' . PHP_EXT: global $preview; // When previewing this add the tag if (!empty($preview)) { $pid = request_var('subjectprefix', 0); $topic_title = sp_phpbb::$template->_tpldata['.'][0]['TOPIC_TITLE']; $topic_title = sp_core::generate_prefix_string($pid) . ' ' . $topic_title; sp_phpbb::$template->assign_var('TOPIC_TITLE', $topic_title); } break; case 'search.' . PHP_EXT: if (empty(sp_phpbb::$template->_tpldata['searchresults'])) { return; } $sr = request_var('sr', ''); // Collect the post ids $row_id = array(); foreach (sp_phpbb::$template->_tpldata['searchresults'] as $row => $data) { if ($sr == 'topics') { if (empty($data['U_VIEW_TOPIC'])) { continue; } $row_id[$row] = (int) substr(strrchr(sp_phpbb::$template->_tpldata['searchresults'][$row]['U_VIEW_TOPIC'], '='), 1); } else { if (empty($data['POST_ID'])) { continue; } $row_id[$row] = $data['POST_ID']; } } // Fetch the prefixes switch ($sr) { case 'topics': $sql = 'SELECT topic_id, subject_prefix_id FROM ' . TOPICS_TABLE . ' WHERE ' . sp_phpbb::$db->sql_in_set('topic_id', $row_id); $rowfield = 'topic_id'; break; default: $sql = 'SELECT p.post_id, t.subject_prefix_id FROM (' . POSTS_TABLE . ' p, ' . TOPICS_TABLE . ' t) WHERE ' . sp_phpbb::$db->sql_in_set('p.post_id', $row_id) . ' AND t.topic_id = p.topic_id'; $rowfield = 'post_id'; } $result = sp_phpbb::$db->sql_query($sql); $row_id = array_flip($row_id); while ($row = sp_phpbb::$db->sql_fetchrow($result)) { $topic_title = sp_core::generate_prefix_string($row['subject_prefix_id']) . ' ' . sp_phpbb::$template->_tpldata['searchresults'][$row_id[$row[$rowfield]]]['TOPIC_TITLE']; // Update the template sp_phpbb::$template->alter_block_array('searchresults', array('TOPIC_TITLE' => $topic_title), $row_id[$row[$rowfield]], 'change'); } sp_phpbb::$db->sql_freeresult($result); break; case 'ucp.' . PHP_EXT: // Bookmarks and subscriptions if (!empty(sp_phpbb::$template->_tpldata['topicrow'])) { $topic_ids_rows = array(); foreach (sp_phpbb::$template->_tpldata['topicrow'] as $row => $data) { $topic_ids_rows[$row] = $data['TOPIC_ID']; } $sql = 'SELECT topic_id, subject_prefix_id FROM ' . TOPICS_TABLE . ' WHERE ' . sp_phpbb::$db->sql_in_set('topic_id', $topic_ids_rows) . ' AND subject_prefix_id > 0'; $result = sp_phpbb::$db->sql_query($sql); $topic_ids_rows = array_flip($topic_ids_rows); while ($row = sp_phpbb::$db->sql_fetchrow($result)) { $topic_title = sp_core::generate_prefix_string($row['subject_prefix_id']) . ' ' . sp_phpbb::$template->_tpldata['topicrow'][$topic_ids_rows[$row['topic_id']]]['TOPIC_TITLE']; // Alter the array sp_phpbb::$template->alter_block_array('topicrow', array('TOPIC_TITLE' => $topic_title), $key = $topic_ids_rows[$row['topic_id']], 'change'); } sp_phpbb::$db->sql_freeresult($result); } // Most active topic if (!empty(sp_phpbb::$template->_tpldata['.'][0]['ACTIVE_TOPIC'])) { // Strip the topic id from link $topic_id = substr(strrchr(sp_phpbb::$template->_tpldata['.'][0]['U_ACTIVE_TOPIC'], '='), 1); // Get the subject prefix $sql = 'SELECT subject_prefix_id FROM ' . TOPICS_TABLE . ' WHERE topic_id = ' . (int) $topic_id; $result = sp_phpbb::$db->sql_query($sql); $pid = sp_phpbb::$db->sql_fetchfield('subject_prefix_id', false, $result); sp_phpbb::$db->sql_freeresult($result); // Send to the template $active_title = sp_core::generate_prefix_string($pid) . ' ' . sp_phpbb::$template->_tpldata['.'][0]['ACTIVE_TOPIC']; sp_phpbb::$template->assign_var('ACTIVE_TOPIC', $active_title); } break; case 'viewforum.' . PHP_EXT: // As the topic data is unset once its used we'll have to introduce an query to // fetch the prefixes if (empty(sp_phpbb::$template->_tpldata['topicrow'])) { return; } $topic_ids_rows = array(); foreach (sp_phpbb::$template->_tpldata['topicrow'] as $row => $data) { $topic_ids_rows[$row] = $data['TOPIC_ID']; } $sql = 'SELECT topic_id, subject_prefix_id FROM ' . TOPICS_TABLE . ' WHERE ' . sp_phpbb::$db->sql_in_set('topic_id', $topic_ids_rows) . ' AND subject_prefix_id > 0'; $result = sp_phpbb::$db->sql_query($sql); $topic_ids_rows = array_flip($topic_ids_rows); while ($row = sp_phpbb::$db->sql_fetchrow($result)) { $topic_title = sp_core::generate_prefix_string($row['subject_prefix_id']) . ' ' . sp_phpbb::$template->_tpldata['topicrow'][$topic_ids_rows[$row['topic_id']]]['TOPIC_TITLE']; // Alter the array sp_phpbb::$template->alter_block_array('topicrow', array('TOPIC_TITLE' => $topic_title), $key = $topic_ids_rows[$row['topic_id']], 'change'); } sp_phpbb::$db->sql_freeresult($result); break; case 'viewtopic.' . PHP_EXT: global $forum_id, $topic_id; global $viewtopic_url, $topic_data; // Add to the page title $page_title = sp_phpbb::$template->_tpldata['.'][0]['PAGE_TITLE']; $page_title = substr_replace($page_title, ' ' . sp_core::generate_prefix_string($topic_data['subject_prefix_id'], false), strpos($page_title, '-') + 1, 0); sp_phpbb::$template->assign_var('PAGE_TITLE', $page_title); // Add to the topic title $topic_title = sp_phpbb::$template->_tpldata['.'][0]['TOPIC_TITLE']; $topic_title = sp_core::generate_prefix_string($topic_data['subject_prefix_id']) . ' ' . $topic_title; sp_phpbb::$template->assign_var('TOPIC_TITLE', $topic_title); // The quick MOD box if (sp_phpbb::$auth->acl_get('m_subject_prefix', $forum_id)) { sp_phpbb::$template->assign_vars(array('S_SUBJECT_PREFIX_QUICK_MOD' => sp_core::generate_prefix_options($forum_id, $topic_data['subject_prefix_id']), 'S_SUBJECT_PREFIX_QUICK_MOD_ACTION' => append_sid(PHPBB_ROOT_PATH . 'mcp.' . PHP_EXT, array('i' => 'subject_prefix', 'mode' => 'quick_edit', 'f' => $forum_id, 't' => $topic_id, 'redirect' => urlencode(str_replace('&', '&', $viewtopic_url))), true, sp_phpbb::$user->session_id))); } break; } }
public function main($id, $mode) { global $phpbb_admin_path; // Anoyingly can't use a constant due to phpBB :/ // Set some stuff we *really* need $this->tpl_name = 'acp_subject_prefix'; $this->page_title = 'ACP_SUBJECT_PREFIX'; add_form_key('acp_subject_prefix'); $action = request_var('action', ''); switch ($mode) { case 'add': $pid = request_var('pid', 0); // Handle if (isset($_POST['submit'])) { // Get the data $colour = request_var('prefix_colour', ''); $forum_ids = request_var('prefix_forums_id', array(0 => 0)); $title = request_var('prefix_title', '', true); // Create or edit if ($pid > 0) { sp_core::prefix_update($pid, $title, $colour, $forum_ids, $this->error); $msg = 'PREFIX_SUCCESSFULLY_EDITED'; } else { $pid = sp_core::prefix_add($title, $colour, $forum_ids, $this->error); $msg = 'PREFIX_SUCCESSFULLY_ADDED'; } // Redirect meta_refresh(5, $this->u_action); trigger_error(sp_phpbb::$user->lang[$msg] . adm_back_link($this->u_action)); } // Editing if ($pid > 0) { $prefixes = sp_phpbb::$cache->obtain_subject_prefixes(); if (!empty($prefixes[$pid])) { sp_phpbb::$template->assign_vars(array('COLOUR' => $prefixes[$pid]['colour'], 'TITLE' => $prefixes[$pid]['title'])); // The forum select $selected = array(); $sql = 'SELECT forum_id FROM ' . SUBJECT_PREFIX_FORUMS_TABLE . ' WHERE prefix_id = ' . $pid; $result = sp_phpbb::$db->sql_query($sql); while ($row = sp_phpbb::$db->sql_fetchrow($result)) { $selected[] = $row['forum_id']; } sp_phpbb::$db->sql_freeresult($result); $forum_select = make_forum_select($selected, false, true, false, false); } } if (!isset($forum_select)) { $forum_select = make_forum_select(false, false, true, false, false); } // Display page sp_phpbb::$template->assign_vars(array('L_SUBJECT_PREFIX_ADD_EDIT' => sp_phpbb::$user->lang('SUBJECT_PREFIX_ADD_EDIT', $mode == 'add' ? 0 : 1), 'PREFIX_FORUMS_OPTIONS' => $forum_select, 'S_EDIT' => true, 'U_ACTION' => $this->u_action . '&pid=' . $pid, 'U_SWATCH' => append_sid($phpbb_admin_path . 'swatch.' . PHP_EXT, array('form' => 'acp_subject_prefix', 'name' => 'prefix_colour')))); break; case 'main': // Quick actions if (method_exists($this, 'qa_' . $action)) { call_user_func(array($this, 'qa_' . $action)); } $data = $forums = array(); sp_phpbb::$cache->obtain_prefix_forum_tree($data, $forums); if (is_array($data) && is_array($forums)) { ksort($data); // Output the list foreach ($data as $forum_id => $prefixes) { // The forum block sp_phpbb::$template->assign_block_vars('forumrow', array('FORUMNAME' => $forums[$forum_id], 'FORUM_ID' => $forum_id)); // The prefixes foreach ($prefixes as $prefix) { sp_phpbb::$template->assign_block_vars('forumrow.prefixrow', array('PREFIX_ID' => $prefix['prefix_id'], 'PREFIX_NAME' => $prefix['prefix_title'], 'PREFIX_COLOUR' => $prefix['prefix_colour'], 'PREFIX_FULL' => sp_core::generate_prefix_string($prefix['prefix_id']), 'U_DELETE' => sp_phpbb::$auth->acl_get('a_subject_prefix_create') ? $this->u_action . "&action=delete&pid={$prefix['prefix_id']}&fid={$forum_id}" : false, 'U_EDIT' => sp_phpbb::$auth->acl_get('a_subject_prefix_create') ? $this->u_action . "&mode=add&pid={$prefix['prefix_id']}" : false, 'U_MOVE_DOWN' => $this->u_action . '&action=move&direction=down&prefix_order=' . $prefix['prefix_order'] . '&f=' . $forum_id, 'U_MOVE_UP' => $this->u_action . '&action=move&direction=up&prefix_order=' . $prefix['prefix_order'] . '&f=' . $forum_id)); } } } // Some common stuff sp_phpbb::$template->assign_vars(array('U_SUBJECT_PREFIX_AJAX_REQUEST' => append_sid(PHPBB_ROOT_PATH . 'sp_ajax.' . PHP_EXT))); break; } }