From 863d7a7614a09dac545d3c3201e67c3beddb3960 Mon Sep 17 00:00:00 2001 From: Meik Sievertsen Date: Fri, 12 Jun 2009 14:41:03 +0000 Subject: First ATOM Feed commit/integration - Idea and original RSS Feed 2.0 MOD (Version 1.0.8/9) by leviatan21 git-svn-id: file:///svn/phpbb/branches/phpBB-3_0_0@9575 89ea8834-ac86-4346-8a33-228a782c2dd0 --- phpBB/feed.php | 1001 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1001 insertions(+) create mode 100644 phpBB/feed.php (limited to 'phpBB/feed.php') diff --git a/phpBB/feed.php b/phpBB/feed.php new file mode 100644 index 0000000000..1d4e26aaab --- /dev/null +++ b/phpBB/feed.php @@ -0,0 +1,1001 @@ +session_begin(); +$auth->acl($user->data); +$user->setup(); + +// Initial var setup +$forum_id = request_var('f', 0); +$topic_id = request_var('t', 0); +$mode = request_var('mode', ''); + +// Feed date format for PHP > 5 and PHP4 +$feed_date_format = (PHP_VERSION >= 5) ? 'c' : "Y-m-d\TH:i:sO"; +$params = false; + +// We do not use a template, therefore we simply define the global template variables here +$global_vars = $item_vars = array(); + +// Generate params array for use in append_sid() to correctly link back to this page +if ($forum_id || $topic_id || $mode) +{ + $params = array( + 'f' => ($forum_id) ? $forum_id : NULL, + 't' => ($topic_id) ? $topic_id : NULL, + 'mode' => ($mode) ? $mode : NULL, + ); +} + +// This boards URL +$board_url = generate_board_url(); + +// Get correct feed object +$feed = phpbb_feed_factory::init($mode, $forum_id, $topic_id); + +// No feed found +if ($feed === false) +{ + trigger_error('NO_FEED'); +} + +// Open Feed +$feed->open(); + +// Some default assignments +// FEED_IMAGE is not used (atom) +$global_vars = array( + 'FEED_IMAGE' => ($user->img('site_logo', '', false, '', 'src')) ? $board_url . '/' . substr($user->img('site_logo', '', false, '', 'src'), strlen($phpbb_root_path)) : '', + 'SELF_LINK' => feed_append_sid('/feed.' . $phpEx, $params), + 'FEED_LINK' => $board_url . '/index.' . $phpEx, + 'FEED_TITLE' => $config['sitename'], + 'FEED_SUBTITLE' => $config['site_desc'], + 'FEED_UPDATED' => $user->format_date(time(), $feed_date_format, true), + 'FEED_LANG' => $user->lang['USER_LANG'], + 'FEED_AUTHOR' => $config['sitename'], +); + +// Iterate through items +while ($row = $feed->get_item()) +{ + // BBCode options to correctly disable urls, smilies, bbcode... + if ($feed->get('options') === NULL) + { + // Allow all combinations + $options = 7; + + if ($feed->get('enable_bbcode') !== NULL && $feed->get('enable_smilies') !== NULL && $feed->get('enable_magic_url') !== NULL) + { + $options = (($row[$feed->get('enable_bbcode')]) ? OPTION_FLAG_BBCODE : 0) + (($row[$feed->get('enable_smilies')]) ? OPTION_FLAG_SMILIES : 0) + (($row[$feed->get('enable_magic_url')]) ? OPTION_FLAG_LINKS : 0); + } + } + else + { + $options = $row[$feed->get('options')]; + } + + $title = ($row[$feed->get('title')]) ? $row[$feed->get('title')] : ((isset($row[$feed->get('title2')])) ? $row[$feed->get('title2')] : ''); + $title = censor_text($title); + + $item_row = array( + 'author' => ($feed->get('creator') !== NULL) ? $row[$feed->get('creator')] : '', + 'pubdate' => $user->format_date($row[$feed->get('date')], $feed_date_format, true), + 'link' => '', + 'title' => censor_text($title), + 'category' => ($config['feed_item_statistics']) ? $board_url . '/viewforum.' . $phpEx . '?f=' . $row['forum_id'] : '', + 'category_name' => ($config['feed_item_statistics']) ? utf8_htmlspecialchars($row['forum_name']) : '', + 'description' => censor_text(feed_generate_content($row[$feed->get('text')], $row[$feed->get('bbcode_uid')], $row[$feed->get('bitfield')], $options)), + 'statistics' => '', + ); + + // Adjust items, fill link, etc. + $feed->adjust_item($item_row, $row); + + $item_vars[] = $item_row; +} + +$feed->close(); + +// Output page + +// gzip_compression +if ($config['gzip_compress']) +{ + if (@extension_loaded('zlib') && !headers_sent()) + { + ob_start('ob_gzhandler'); + } +} + +// IF debug extra is enabled and admin want to "explain" the page we need to set other headers... +if (!defined('DEBUG_EXTRA') || !request_var('explain', 0) || !$auth->acl_get('a_')) +{ + header("Content-Type: application/atom+xml; charset=UTF-8"); + header("Last-Modified: " . gmdate('D, d M Y H:i:s', time()) . ' GMT'); +} +else +{ + header('Content-type: text/html; charset=UTF-8'); + header('Cache-Control: private, no-cache="set-cookie"'); + header('Expires: 0'); + header('Pragma: no-cache'); + + $mtime = explode(' ', microtime()); + $totaltime = $mtime[0] + $mtime[1] - $starttime; + + if (method_exists($db, 'sql_report')) + { + $db->sql_report('display'); + } + + garbage_collection(); + exit_handler(); +} + +echo '' . "\n"; +echo '' . "\n"; +echo '' . "\n\n"; + +echo (!empty($global_vars['FEED_TITLE'])) ? '' . $global_vars['FEED_TITLE'] . '' . "\n" : ''; +echo (!empty($global_vars['FEED_SUBTITLE'])) ? '' . $global_vars['FEED_SUBTITLE'] . '' . "\n" : ''; +echo (!empty($global_vars['FEED_LINK'])) ? '' . "\n" : ''; +echo '' . $global_vars['FEED_UPDATED'] . '' . "\n\n"; + +echo '' . $global_vars['FEED_AUTHOR'] . '' . "\n"; +echo '' . $global_vars['SELF_LINK'] . '' . "\n"; + +foreach ($item_vars as $row) +{ + echo '' . "\n"; + + if (!empty($row['author'])) + { + echo '' . $row['author'] . '' . "\n"; + } + + echo '' . $row['pubdate'] . '' . "\n"; + echo '' . $row['link'] . '' . "\n"; + echo '' . "\n"; + echo '' . $row['title'] . '' . "\n\n"; + + if (!empty($row['category'])) + { + echo '' . "\n"; + } + + echo '' . "\n"; + echo '
' . "\n"; + echo $row['description']; + + if (!empty($row['statistics'])) + { + echo '

' . $user->lang['STATISTICS'] . ': ' . $row['statistics'] . '

'; + } + + echo '
' . "\n" . '
' . "\n"; + echo '
' . "\n"; +} + +echo '
'; + +garbage_collection(); +exit_handler(); + +/** +* Run links through append_sid(), prepend generate_board_url() and remove session id +**/ +function feed_append_sid($url, $params) +{ + global $board_url; + + $link = append_sid($board_url . $url, $params); + + // Remove added sid - not as easy as it sounds. ;) + return (strpos($link, 'sid=') !== false) ? trim(preg_replace('/(&|&|\?)sid=[a-z0-9]+(&|&)?/', '\1', $link), '?& ') : $link; +} + +/** +* Generate text content +**/ +function feed_generate_content($content, $uid, $bitfield, $options) +{ + global $user, $config, $phpbb_root_path, $phpEx, $board_url; + + if (empty($content)) + { + return ''; + } + + // Prepare some bbcodes for better parsing + $content = preg_replace("#\[quote(=".*?")?:$uid\]\s*(.*?)\s*\[/quote:$uid\]#si", "[quote$1:$uid]
$2
[/quote:$uid]", $content); + + $content = generate_text_for_display($content, $uid, $bitfield, $options); + + // Relative Path to Absolute path, Windows style + $content = str_replace('./', $board_url . '/', $content); + + // Remove "Select all" link and mouse events + $content = str_replace('' .$user->lang['SELECT_ALL_CODE'] . '', '', $content); + $content = preg_replace('#(onkeypress|onclick)="(.*?)"#si', '', $content); + + // Remove font sizes + $content = preg_replace('#([^>]+)#iU', '\1', $content); + + // Make text strong :P + $content = preg_replace('#([^<]+)#iU', '\1', $content); + + // Italic + $content = preg_replace('#([^<]+)#iU', '\1', $content); + + // Underline + $content = preg_replace('#([^<]+)#iU', '\1', $content); + + // Remove embed Windows Media Streams + $content = preg_replace( '#<\!--\[if \!IE\]>-->([^[]+)<\!--#si', '', $content); + + // Do not use < and >, because we want to retain code contained in [code][/code] + + // Remove embed and objects + $content = preg_replace( '#<(object|embed)(.*?) (value|src)=(.*?) ([^[]+)(object|embed)>#si',' $1 ',$content); + + // Remove some specials html tag, because somewhere there are a mod to allow html tags ;) + $content = preg_replace( '#<(script|iframe)([^[]+)\1>#siU', ' $1 ', $content); + + // Remove Comments from inline attachments [ia] + $content = preg_replace('#
(.*?)(.*?)(.*?)
#si','$4',$content); + + // Replace some entities with their unicode counterpart + $entities = array( + ' ' => ' ', + '•' => '•', + '·' => '·', + '©' => '©', + ); + + $content = str_replace(array_keys($entities), array_values($entities), $content); + + // Other control characters + // $content = preg_replace('#(?:[\x00-\x1F\x7F]+|(?:\xC2[\x80-\x9F])+)#', '', $content); + + return $content; +} + +/** +* Factory class to return correct object +* @package phpBB3 +*/ +class phpbb_feed_factory +{ + /** + * Return correct object for specified mode + * + * @param string $mode The feeds mode. + * @param int $forum_id Forum id specified by the script if forum feed provided. + * @param int $topic_id Topic id specified by the script if topic feed provided. + * + * @return object Returns correct feeds object for specified mode. + */ + function init($mode, $forum_id, $topic_id) + { + global $config; + + switch ($mode) + { + case 'forums': + if (!$config['feed_overall_forums']) + { + return false; + } + + return new phpbb_feed_forums(); + break; + + case 'topics': + if (!$config['feed_overall_topics']) + { + return false; + } + + return new phpbb_feed_topics(); + break; + + case 'news': + if (empty($config['feed_news_id'])) + { + return false; + } + + return new phpbb_feed_news(); + break; + + default: + // Forum and/or topic specified? + if ($topic_id && !$config['feed_topic']) + { + return false; + } + + if ($forum_id && !$topic_id && !$config['feed_forum']) + { + return false; + } + + return new phpbb_feed($forum_id, $topic_id); + break; + } + } +} + +/** +* Base/default Feed class if no mode is specified. +* This can be the overall site feed or a forum/topic feed. +* @package phpBB3 +*/ +class phpbb_feed +{ + /** + * Forum id specified for forum feed. + */ + var $forum_id = 0; + + /** + * Topic id specified for topic feed. + */ + var $topic_id = 0; + + /** + * SQL Query to be executed to get feed items + */ + var $sql; + + /** + * Keys specified for retrieval of title, content, etc. + */ + var $keys = array(); + + /** + * An array of excluded forum ids. + */ + var $excluded_forums_ary = NULL; + + /** + * Number of items to fetch + */ + var $num_items; + + /** + * boolean to determine if items array is filled or not + */ + var $items_filled = false; + + /** + * array holding items + */ + var $items = array(); + + /** + * Default setting for last x days + */ + var $sort_days = 100; + + /** + * Default cache time of entries in seconds + */ + var $cache_time = 300; + + /** + * Constructor. Set standard keys. + */ + function phpbb_feed($forum_id = 0, $topic_id = 0) + { + global $config; + + $this->forum_id = $forum_id; + $this->topic_id = $topic_id; + + $this->sql = array(); + + // Set some values for pagination + $this->num_items = $config['feed_limit']; + $this->set_keys(); + } + + function set_keys() + { + // Set keys for items... + $this->set('title', 'post_subject'); + $this->set('title2', 'topic_title'); + $this->set('author_id', 'user_id'); + $this->set('creator', 'username'); + $this->set('text', 'post_text'); + $this->set('bitfield', 'bbcode_bitfield'); + $this->set('bbcode_uid','bbcode_uid'); + $this->set('date', 'post_time'); + + $this->set('enable_bbcode', 'enable_bbcode'); + $this->set('enable_smilies', 'enable_smilies'); + $this->set('enable_magic_url', 'enable_magic_url'); + } + + function open() + { + if (!$this->forum_id && !$this->topic_id) + { + return; + } + else if ($this->forum_id && !$this->topic_id) + { + global $db, $user, $global_vars; + + $sql = 'SELECT forum_name + FROM ' . FORUMS_TABLE . ' + WHERE forum_id = ' . $this->forum_id; + $result = $db->sql_query($sql); + + $global_vars['FEED_MODE'] = $user->lang['FORUM'] . ': ' . $db->sql_fetchfield('forum_name'); + + $db->sql_freeresult($result); + } + else if ($this->topic_id) + { + global $db, $user, $global_vars; + + $sql = 'SELECT topic_title + FROM ' . TOPICS_TABLE . ' + WHERE topic_id = ' . $this->topic_id; + $result = $db->sql_query($sql); + + $global_vars['FEED_MODE'] = $user->lang['TOPIC'] . ': ' . $db->sql_fetchfield('topic_title'); + + $db->sql_freeresult($result); + } + } + + function close() + { + if (!empty($this->result)) + { + global $db; + + $db->sql_freeresult($this->result); + } + } + + /** + * Set key + */ + function set($key, $value) + { + $this->keys[$key] = $value; + } + + /** + * Get key + */ + function get($key) + { + return (isset($this->keys[$key])) ? $this->keys[$key] : NULL; + } + + /** + * Return array of excluded forums + */ + function excluded_forums() + { + if ($this->excluded_forums_ary !== NULL) + { + return $this->excluded_forums_ary; + } + + global $auth, $db, $config, $phpbb_root_path, $phpEx, $user; + + // Which forums should not be searched ? + $exclude_forums = (!empty($config['feed_exclude_id'])) ? unserialize(trim($config['feed_exclude_id'])) : array(); + + // Exclude forums the user is not able to read + $this->excluded_forums_ary = array_keys($auth->acl_getf('!f_read', true)); + $this->excluded_forums_ary = (sizeof($exclude_forums)) ? array_merge($exclude_forums, $this->excluded_forums_ary) : $this->excluded_forums_ary; + + $not_in_fid = (sizeof($this->excluded_forums_ary)) ? 'WHERE (' . $db->sql_in_set('f.forum_id', $this->excluded_forums_ary, true) . ' AND ' . $db->sql_in_set('f.parent_id', $this->excluded_forums_ary, true) . ") OR (f.forum_password <> '' AND fa.user_id <> " . (int) $user->data['user_id'] . ')' : ''; + + $sql = 'SELECT f.forum_id, f.forum_name, f.parent_id, f.forum_type, f.right_id, f.forum_password, fa.user_id + FROM ' . FORUMS_TABLE . ' f + LEFT JOIN ' . FORUMS_ACCESS_TABLE . " fa ON (fa.forum_id = f.forum_id + AND fa.session_id = '" . $db->sql_escape($user->session_id) . "') + $not_in_fid + ORDER BY f.left_id"; + $result = $db->sql_query($sql); + + $right_id = 0; + while ($row = $db->sql_fetchrow($result)) + { + // Exclude passworded forum completely + if ($row['forum_password'] && $row['user_id'] != $user->data['user_id']) + { + $this->excluded_forums_ary[] = (int) $row['forum_id']; + continue; + } + + if ($row['right_id'] > $right_id) + { + $right_id = (int) $row['right_id']; + } + else if ($row['right_id'] < $right_id) + { + continue; + } + } + $db->sql_freeresult($result); + + return $this->excluded_forums_ary; + } + + /** + * Get SQL query for fetching items + */ + function get_sql() + { + global $db; + + $post_ids = array(); + + // Search for topics in last 7 days + $last_post_time_sql = ($this->sort_days) ? ' AND t.topic_last_post_time > ' . (time() - ($this->sort_days * 24 * 3600)) : ''; + + // Fetch latest post, grouped by topic... + if (!$this->forum_id && !$this->topic_id) + { + // First of all, the post ids... + $not_in_fid = (sizeof($this->excluded_forums())) ? ' AND ' . $db->sql_in_set('t.forum_id', $this->excluded_forums(), true) : ''; + + $sql = 'SELECT t.topic_last_post_id + FROM ' . TOPICS_TABLE . ' t + WHERE t.topic_approved = 1 + AND t.topic_moved_id = 0' . + $not_in_fid . + $last_post_time_sql . ' + ORDER BY t.topic_last_post_time DESC'; + $result = $db->sql_query_limit($sql, $this->num_items); + + while ($row = $db->sql_fetchrow($result)) + { + $post_ids[] = $row['topic_last_post_id']; + } + $db->sql_freeresult($result); + } + // Fetch latest posts from forum + else if (!$this->topic_id && $this->forum_id) + { + // Make sure the forum is not listed within the forbidden ones. ;) + if (in_array($this->forum_id, $this->excluded_forums())) + { + return false; + } + + // Determine which forums to fetch + $not_in_fid = (sizeof($this->excluded_forums())) ? ' AND ' . $db->sql_in_set('f1.forum_id', $this->excluded_forums(), true) : ''; + + // Determine forum childs... + $sql = 'SELECT f2.forum_id + FROM ' . FORUMS_TABLE . ' f1, ' . FORUMS_TABLE . ' f2 + WHERE f1.forum_id = ' . $this->forum_id . ' + AND (f2.left_id BETWEEN f1.left_id AND f1.right_id' . $not_in_fid . ')'; + $result = $db->sql_query($sql); + + $forum_ids = array(); + while ($row = $db->sql_fetchrow($result)) + { + $forum_ids[] = $row['forum_id']; + } + $db->sql_freeresult($result); + + // Now select from forums... + $sql = 'SELECT t.topic_last_post_id + FROM ' . TOPICS_TABLE . ' t + WHERE ' . $db->sql_in_set('t.forum_id', $forum_ids) . ' + AND t.topic_approved = 1 + AND t.topic_moved_id = 0' . + $last_post_time_sql . ' + ORDER BY t.topic_last_post_time DESC'; + $result = $db->sql_query_limit($sql, $this->num_items); + + while ($row = $db->sql_fetchrow($result)) + { + $post_ids[] = $row['topic_last_post_id']; + } + $db->sql_freeresult($result); + } + // Fetch last posts from specified topic... + else if ($this->topic_id) + { + // First of all, determine the forum... + $sql = 'SELECT forum_id + FROM ' . TOPICS_TABLE . ' + WHERE topic_id = ' . $this->topic_id; + $result = $db->sql_query_limit($sql, 1); + $this->forum_id = (int) $db->sql_fetchfield('forum_id'); + $db->sql_freeresult($result); + + // non-global announcement + if ($this->forum_id && in_array($this->forum_id, $this->excluded_forums())) + { + return false; + } + + $sql = 'SELECT post_id + FROM ' . POSTS_TABLE . ' + WHERE topic_id = ' . $this->topic_id . ' + AND post_approved = 1 + ORDER BY post_time DESC'; + $result = $db->sql_query_limit($sql, $this->num_items); + + while ($row = $db->sql_fetchrow($result)) + { + $post_ids[] = $row['post_id']; + } + $db->sql_freeresult($result); + } + + if (!sizeof($post_ids)) + { + return false; + } + + // Now build sql query for obtaining items + $this->sql = array( + 'SELECT' => 'f.forum_id, f.forum_name, f.forum_desc_options, ' . + 't.topic_last_post_time, t.topic_id, t.topic_title, t.topic_time, t.topic_replies, t.topic_views, ' . + 'p.post_id, p.post_time, p.post_subject, p.post_text, p.bbcode_bitfield, p.bbcode_uid, p.enable_bbcode, p.enable_smilies, p.enable_magic_url, ' . + 'u.username, u.user_id, u.user_email', + 'FROM' => array( + POSTS_TABLE => 'p', + TOPICS_TABLE => 't', + FORUMS_TABLE => 'f', + USERS_TABLE => 'u', + ), + 'WHERE' => $db->sql_in_set('p.post_id', $post_ids) . ' + AND f.forum_id = p.forum_id + AND t.topic_id = p.topic_id + AND u.user_id = p.poster_id', + 'ORDER_BY' => 'p.post_time DESC', + ); + + return true; + } + + function get_item() + { + global $db, $cache; + + if (!$this->cache_time) + { + if (empty($this->result)) + { + if (!$this->get_sql()) + { + return false; + } + + // Query database + $sql = $db->sql_build_query('SELECT', $this->sql); + $this->result = $db->sql_query_limit($sql, $this->num_items); + } + + return $db->sql_fetchrow($this->result); + } + else + { + if (empty($this->items_filled)) + { + // Try to load result set... + $cache_filename = substr(get_class($this), strlen('phpbb_')); + + if (($this->items = $cache->get('_' . $cache_filename)) === false) + { + $this->items = array(); + + if ($this->get_sql()) + { + // Query database + $sql = $db->sql_build_query('SELECT', $this->sql); + $result = $db->sql_query_limit($sql, $this->num_items); + + while ($row = $db->sql_fetchrow($result)) + { + $this->items[] = $row; + } + $db->sql_freeresult($result); + } + + $cache->put('_' . $cache_filename, $this->items, $this->cache_time); + } + + $this->items_filled = true; + } + + $row = array_shift($this->items); + return (!$row) ? false : $row; + } + } + + function adjust_item(&$item_row, &$row) + { + global $phpEx, $config; + + $item_row['title'] = (!$this->topic_id) ? $row['forum_name'] . ' | ' . $item_row['title'] : $item_row['title']; + $item_row['link'] = feed_append_sid('/viewtopic.' . $phpEx, "t={$row['topic_id']}&p={$row['post_id']}#p{$row['post_id']}"); + + if ($config['feed_item_statistics']) + { + global $user; + + $user_link = '' . $row['username'] . ''; + + $time = ($this->topic_id) ? $row['post_time'] : $row['topic_time']; + + $item_row['statistics'] = $user->lang['POSTED'] . ' ' . $user->lang['POST_BY_AUTHOR'] . ' ' . $user_link . ' - ' . $user->format_date($time). ' - ' . $user->lang['REPLIES'] . ' ' . $row['topic_replies'] . ' - ' . $user->lang['VIEWS'] . ' ' . $row['topic_views']; + } + } +} + +class phpbb_feed_forums extends phpbb_feed +{ + function set_keys() + { + global $config; + + $this->set('title', 'forum_name'); + $this->set('text', 'forum_desc'); + $this->set('bitfield', 'forum_desc_bitfield'); + $this->set('bbcode_uid','forum_desc_uid'); + $this->set('date', 'forum_last_post_time'); + $this->set('options', 'forum_desc_options'); + + $this->num_items = $config['feed_overall_forums_limit']; + } + + function open() + { + global $user, $global_vars; + + $global_vars['FEED_MODE'] = $user->lang['FORUMS']; + } + + function get_sql() + { + global $db; + + $not_in_fid = (sizeof($this->excluded_forums())) ? ' AND ' . $db->sql_in_set('f.forum_id', $this->excluded_forums(), true) : ''; + + // Build SQL Query + $this->sql = array( + 'SELECT' => 'f.*', + 'FROM' => array(FORUMS_TABLE => 'f'), + 'WHERE' => 'f.forum_type = ' . FORUM_POST . ' + AND (f.forum_last_post_id > 0' . $not_in_fid . ')', + 'ORDER_BY' => 'f.left_id', + ); + + return true; + } + + function adjust_item(&$item_row, &$row) + { + global $phpEx, $config; + + $item_row['link'] = feed_append_sid('/viewforum.' . $phpEx, 'f=' . $row['forum_id']); + + if ($config['feed_item_statistics']) + { + global $user; + + $item_row['statistics'] = sprintf($user->lang['TOTAL_TOPICS_OTHER'], $row['forum_topics']) . ' - ' . sprintf($user->lang['TOTAL_POSTS_OTHER'], $row['forum_posts']); + } + } +} + +class phpbb_feed_news extends phpbb_feed +{ + function set_keys() + { + global $config; + + $this->set('title', 'topic_title'); + $this->set('title2', 'forum_name'); + $this->set('author_id', 'topic_poster'); + $this->set('creator', 'topic_first_poster_name'); + $this->set('text', 'post_text'); + $this->set('bitfield', 'bbcode_bitfield'); + $this->set('bbcode_uid','bbcode_uid'); + $this->set('date', 'topic_time'); + + $this->set('enable_bbcode', 'enable_bbcode'); + $this->set('enable_smilies', 'enable_smilies'); + $this->set('enable_magic_url', 'enable_magic_url'); + + $this->num_items = $config['feed_overall_forums_limit']; + } + + function open() + { + global $user, $global_vars; + + $global_vars['FEED_MODE'] = $user->lang['FEED_NEWS']; + } + + function get_sql() + { + global $db, $config; + + $in_fid_ary = unserialize(trim($config['feed_news_id'])); + + if (!sizeof($in_fid_ary)) + { + return false; + } + + // Build SQL Query + $this->sql = array( + 'SELECT' => 'f.forum_id, f.forum_password, f.forum_name, f.forum_topics, f.forum_posts, f.parent_id, f.left_id, f.right_id, + t.topic_id, t.topic_title, t.topic_poster, t.topic_first_poster_name, t.topic_replies, t.topic_views, t.topic_time, + p.post_id, p.post_text, p.bbcode_bitfield, p.bbcode_uid, p.enable_bbcode, p.enable_smilies, p.enable_magic_url, + u.username, u.user_id, u.user_email', + 'FROM' => array( + TOPICS_TABLE => 't', + FORUMS_TABLE => 'f', + POSTS_TABLE => 'p', + USERS_TABLE => 'u', + ), + 'WHERE' => $db->sql_in_set('t.forum_id', $in_fid_ary) . ' + AND f.forum_id = t.forum_id + AND p.post_id = t.topic_first_post_id + AND t.topic_poster = u.user_id', + 'ORDER_BY' => 't.topic_time DESC', + ); + + return true; + } + + function adjust_item(&$item_row, &$row) + { + global $phpEx, $config; + + $item_row['link'] = feed_append_sid('/viewtopic.' . $phpEx, 't=' . $row['topic_id'] . '&p=' . $row['post_id'] . '#p' . $row['post_id']); + + if ($config['feed_item_statistics']) + { + global $user; + + $user_link = '' . $row[$this->get('creator')] . ''; + + $item_row['statistics'] = $user->lang['POSTED'] . ' ' . $user->lang['POST_BY_AUTHOR'] . ' ' . $user_link . ' - ' . $user->format_date($row['topic_time']). ' - ' . $user->lang['REPLIES'] . ' ' . $row['topic_replies'] . ' - ' . $user->lang['VIEWS'] . ' ' . $row['topic_views']; + } + } +} + +class phpbb_feed_topics extends phpbb_feed +{ + function set_keys() + { + global $config; + + $this->set('title', 'topic_title'); + $this->set('title2', 'forum_name'); + $this->set('author_id', 'topic_poster'); + $this->set('creator', 'topic_first_poster_name'); + $this->set('text', 'post_text'); + $this->set('bitfield', 'bbcode_bitfield'); + $this->set('bbcode_uid','bbcode_uid'); + $this->set('date', 'topic_time'); + + $this->set('enable_bbcode', 'enable_bbcode'); + $this->set('enable_smilies', 'enable_smilies'); + $this->set('enable_magic_url', 'enable_magic_url'); + + $this->num_items = $config['feed_overall_topics_limit']; + } + + function open() + { + global $user, $global_vars; + + $global_vars['FEED_MODE'] = $user->lang['TOPICS']; + } + + function get_sql() + { + global $db, $config; + + $post_ids = array(); + $not_in_fid = (sizeof($this->excluded_forums())) ? ' AND ' . $db->sql_in_set('t.forum_id', $this->excluded_forums(), true) : ''; + + // Search for topics in last x days + $last_post_time_sql = ($this->sort_days) ? ' AND t.topic_last_post_time > ' . (time() - ($this->sort_days * 24 * 3600)) : ''; + + // Last x topics from all forums, with first post from topic... + $sql = 'SELECT t.topic_first_post_id + FROM ' . TOPICS_TABLE . ' t + WHERE t.topic_approved = 1 + AND t.topic_moved_id = 0' . + $not_in_fid . + $last_post_time_sql . ' + ORDER BY t.topic_last_post_time DESC'; + $result = $db->sql_query_limit($sql, $this->num_items); + + while ($row = $db->sql_fetchrow($result)) + { + $post_ids[] = $row['topic_first_post_id']; + } + $db->sql_freeresult($result); + + if (!sizeof($post_ids)) + { + return false; + } + + $this->sql = array( + 'SELECT' => 'f.forum_id, f.forum_password, f.forum_name, f.forum_topics, f.forum_posts, f.parent_id, f.left_id, f.right_id, + t.topic_id, t.topic_title, t.topic_poster, t.topic_first_poster_name, t.topic_replies, t.topic_views, t.topic_time, + p.post_id, p.post_text, p.bbcode_bitfield, p.bbcode_uid, p.enable_bbcode, p.enable_smilies, p.enable_magic_url, + u.username, u.user_id, u.user_email', + 'FROM' => array( + TOPICS_TABLE => 't', + FORUMS_TABLE => 'f', + POSTS_TABLE => 'p', + USERS_TABLE => 'u', + ), + 'WHERE' => $db->sql_in_set('p.post_id', $post_ids) . ' + AND f.forum_id = p.forum_id + AND t.topic_id = p.topic_id + AND u.user_id = p.poster_id', + 'ORDER_BY' => 't.topic_last_post_time DESC', + ); + + return true; + } + + function adjust_item(&$item_row, &$row) + { + global $phpEx, $config; + + $item_row['link'] = feed_append_sid('/viewtopic.' . $phpEx, 't=' . $row['topic_id'] . '&p=' . $row['post_id'] . '#p' . $row['post_id']); + + if ($config['feed_item_statistics']) + { + global $user; + + $user_link = '' . $row[$this->get('creator')] . ''; + + $item_row['statistics'] = $user->lang['POSTED'] . ' ' . $user->lang['POST_BY_AUTHOR'] . ' ' . $user_link . ' - ' . $user->format_date($row['topic_time']). ' - ' . $user->lang['REPLIES'] . ' ' . $row['topic_replies'] . ' - ' . $user->lang['VIEWS'] . ' ' . $row['topic_views']; + } + } +} + + +?> \ No newline at end of file -- cgit v1.2.1 From c0b4cf2f6e6e0953071fbdea189d58bf60c4f862 Mon Sep 17 00:00:00 2001 From: Meik Sievertsen Date: Tue, 23 Jun 2009 17:15:53 +0000 Subject: fix feed generation git-svn-id: file:///svn/phpbb/branches/phpBB-3_0_0@9663 89ea8834-ac86-4346-8a33-228a782c2dd0 --- phpBB/feed.php | 66 +++++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 42 insertions(+), 24 deletions(-) (limited to 'phpBB/feed.php') diff --git a/phpBB/feed.php b/phpBB/feed.php index 1d4e26aaab..9d9bf145b1 100644 --- a/phpBB/feed.php +++ b/phpBB/feed.php @@ -158,38 +158,40 @@ else exit_handler(); } +$namespace = 'phpbb'; + echo '' . "\n"; -echo '' . "\n"; -echo '' . "\n\n"; +echo '<' . $namespace . ':feed xmlns:' . $namespace . '="http://www.w3.org/2005/Atom" xmlns="http://www.w3.org/1999/xhtml" xml:lang="' . $global_vars['FEED_LANG'] . '">' . "\n"; +echo '<' . $namespace . ':link rel="self" type="application/atom+xml" href="' . $global_vars['SELF_LINK'] . '" />' . "\n\n"; -echo (!empty($global_vars['FEED_TITLE'])) ? '' . $global_vars['FEED_TITLE'] . '' . "\n" : ''; -echo (!empty($global_vars['FEED_SUBTITLE'])) ? '' . $global_vars['FEED_SUBTITLE'] . '' . "\n" : ''; -echo (!empty($global_vars['FEED_LINK'])) ? '' . "\n" : ''; -echo '' . $global_vars['FEED_UPDATED'] . '' . "\n\n"; +echo (!empty($global_vars['FEED_TITLE'])) ? '<' . $namespace . ':title>' . $global_vars['FEED_TITLE'] . '' . "\n" : ''; +echo (!empty($global_vars['FEED_SUBTITLE'])) ? '<' . $namespace . ':subtitle>' . $global_vars['FEED_SUBTITLE'] . '' . "\n" : ''; +echo (!empty($global_vars['FEED_LINK'])) ? '<' . $namespace . ':link href="' . $global_vars['FEED_LINK'] .'" />' . "\n" : ''; +echo '<' . $namespace . ':updated>' . $global_vars['FEED_UPDATED'] . '' . "\n\n"; -echo '' . $global_vars['FEED_AUTHOR'] . '' . "\n"; -echo '' . $global_vars['SELF_LINK'] . '' . "\n"; +echo '<' . $namespace . ':author><' . $namespace . ':name>' . $global_vars['FEED_AUTHOR'] . '' . "\n"; +echo '<' . $namespace . ':id>' . $global_vars['SELF_LINK'] . '' . "\n"; foreach ($item_vars as $row) { - echo '' . "\n"; + echo '<' . $namespace . ':entry>' . "\n"; if (!empty($row['author'])) { - echo '' . $row['author'] . '' . "\n"; + echo '<' . $namespace . ':author><' . $namespace . ':name>' . $row['author'] . '' . "\n"; } - echo '' . $row['pubdate'] . '' . "\n"; - echo '' . $row['link'] . '' . "\n"; - echo '' . "\n"; - echo '' . $row['title'] . '' . "\n\n"; + echo '<' . $namespace . ':updated>' . $row['pubdate'] . '' . "\n"; + echo '<' . $namespace . ':id>' . $row['link'] . '' . "\n"; + echo '<' . $namespace . ':link href="' . $row['link'] . '"/>' . "\n"; + echo '<' . $namespace . ':title type="xhtml">
' . $row['title'] . '
' . "\n\n"; if (!empty($row['category'])) { - echo '' . "\n"; + echo '<' . $namespace . ':category term="' . $row['category_name'] . '" scheme="' . $row['category'] . '" label="' . $row['category_name'] . '"/>' . "\n"; } - echo '' . "\n"; + echo '<' . $namespace . ':content type="xhtml" xml:base="' . $row['link'] . '">' . "\n"; echo '
' . "\n"; echo $row['description']; @@ -198,11 +200,11 @@ foreach ($item_vars as $row) echo '

' . $user->lang['STATISTICS'] . ': ' . $row['statistics'] . '

'; } - echo '
' . "\n" . '
' . "\n"; - echo '
' . "\n"; + echo '
' . "\n" . '' . "\n"; + echo '' . "\n"; } -echo '
'; +echo ''; garbage_collection(); exit_handler(); @@ -217,7 +219,15 @@ function feed_append_sid($url, $params) $link = append_sid($board_url . $url, $params); // Remove added sid - not as easy as it sounds. ;) - return (strpos($link, 'sid=') !== false) ? trim(preg_replace('/(&|&|\?)sid=[a-z0-9]+(&|&)?/', '\1', $link), '?& ') : $link; + $link = (strpos($link, 'sid=') !== false) ? trim(preg_replace('/(&|&|\?)sid=[a-z0-9]+(&|&)?/', '\1', $link), '?& ') : $link; + + // Now the only thing remaining could be an empty & + if (substr($link, -5) === '&') + { + $link = substr($link, 0, -5); + } + + return $link; } /** @@ -237,6 +247,9 @@ function feed_generate_content($content, $uid, $bitfield, $options) $content = generate_text_for_display($content, $uid, $bitfield, $options); + // Add newlines + $content = str_replace('
', '
' . "\n", $content); + // Relative Path to Absolute path, Windows style $content = str_replace('./', $board_url . '/', $content); @@ -409,6 +422,11 @@ class phpbb_feed */ var $cache_time = 300; + /** + * Separator for title elements to separate items (for example forum / topic) + */ + var $separator = '•'; + /** * Constructor. Set standard keys. */ @@ -672,7 +690,7 @@ class phpbb_feed 'SELECT' => 'f.forum_id, f.forum_name, f.forum_desc_options, ' . 't.topic_last_post_time, t.topic_id, t.topic_title, t.topic_time, t.topic_replies, t.topic_views, ' . 'p.post_id, p.post_time, p.post_subject, p.post_text, p.bbcode_bitfield, p.bbcode_uid, p.enable_bbcode, p.enable_smilies, p.enable_magic_url, ' . - 'u.username, u.user_id, u.user_email', + 'u.username, u.user_id, u.user_email, u.user_colour', 'FROM' => array( POSTS_TABLE => 'p', TOPICS_TABLE => 't', @@ -748,7 +766,7 @@ class phpbb_feed { global $phpEx, $config; - $item_row['title'] = (!$this->topic_id) ? $row['forum_name'] . ' | ' . $item_row['title'] : $item_row['title']; + $item_row['title'] = (!$this->topic_id) ? $row['forum_name'] . ' ' . $this->separator . ' ' . $item_row['title'] : $item_row['title']; $item_row['link'] = feed_append_sid('/viewtopic.' . $phpEx, "t={$row['topic_id']}&p={$row['post_id']}#p{$row['post_id']}"); if ($config['feed_item_statistics']) @@ -865,7 +883,7 @@ class phpbb_feed_news extends phpbb_feed 'SELECT' => 'f.forum_id, f.forum_password, f.forum_name, f.forum_topics, f.forum_posts, f.parent_id, f.left_id, f.right_id, t.topic_id, t.topic_title, t.topic_poster, t.topic_first_poster_name, t.topic_replies, t.topic_views, t.topic_time, p.post_id, p.post_text, p.bbcode_bitfield, p.bbcode_uid, p.enable_bbcode, p.enable_smilies, p.enable_magic_url, - u.username, u.user_id, u.user_email', + u.username, u.user_id, u.user_email, u.user_colour', 'FROM' => array( TOPICS_TABLE => 't', FORUMS_TABLE => 'f', @@ -963,7 +981,7 @@ class phpbb_feed_topics extends phpbb_feed 'SELECT' => 'f.forum_id, f.forum_password, f.forum_name, f.forum_topics, f.forum_posts, f.parent_id, f.left_id, f.right_id, t.topic_id, t.topic_title, t.topic_poster, t.topic_first_poster_name, t.topic_replies, t.topic_views, t.topic_time, p.post_id, p.post_text, p.bbcode_bitfield, p.bbcode_uid, p.enable_bbcode, p.enable_smilies, p.enable_magic_url, - u.username, u.user_id, u.user_email', + u.username, u.user_id, u.user_email, u.user_colour', 'FROM' => array( TOPICS_TABLE => 't', FORUMS_TABLE => 'f', -- cgit v1.2.1 From 585d533f4dc4cefc7e3e5c06cc7d9f171a81772b Mon Sep 17 00:00:00 2001 From: Meik Sievertsen Date: Tue, 7 Jul 2009 11:05:50 +0000 Subject: commit changes suggested by Crise git-svn-id: file:///svn/phpbb/branches/phpBB-3_0_0@9721 89ea8834-ac86-4346-8a33-228a782c2dd0 --- phpBB/feed.php | 54 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 28 insertions(+), 26 deletions(-) (limited to 'phpBB/feed.php') diff --git a/phpBB/feed.php b/phpBB/feed.php index 9d9bf145b1..33549bcc56 100644 --- a/phpBB/feed.php +++ b/phpBB/feed.php @@ -158,41 +158,38 @@ else exit_handler(); } -$namespace = 'phpbb'; - echo '' . "\n"; -echo '<' . $namespace . ':feed xmlns:' . $namespace . '="http://www.w3.org/2005/Atom" xmlns="http://www.w3.org/1999/xhtml" xml:lang="' . $global_vars['FEED_LANG'] . '">' . "\n"; -echo '<' . $namespace . ':link rel="self" type="application/atom+xml" href="' . $global_vars['SELF_LINK'] . '" />' . "\n\n"; +echo '' . "\n"; +echo '' . "\n\n"; -echo (!empty($global_vars['FEED_TITLE'])) ? '<' . $namespace . ':title>' . $global_vars['FEED_TITLE'] . '' . "\n" : ''; -echo (!empty($global_vars['FEED_SUBTITLE'])) ? '<' . $namespace . ':subtitle>' . $global_vars['FEED_SUBTITLE'] . '' . "\n" : ''; -echo (!empty($global_vars['FEED_LINK'])) ? '<' . $namespace . ':link href="' . $global_vars['FEED_LINK'] .'" />' . "\n" : ''; -echo '<' . $namespace . ':updated>' . $global_vars['FEED_UPDATED'] . '' . "\n\n"; +echo (!empty($global_vars['FEED_TITLE'])) ? '' . $global_vars['FEED_TITLE'] . '' . "\n" : ''; +echo (!empty($global_vars['FEED_SUBTITLE'])) ? '' . $global_vars['FEED_SUBTITLE'] . '' . "\n" : ''; +echo (!empty($global_vars['FEED_LINK'])) ? '' . "\n" : ''; +echo '' . $global_vars['FEED_UPDATED'] . '' . "\n\n"; -echo '<' . $namespace . ':author><' . $namespace . ':name>' . $global_vars['FEED_AUTHOR'] . '' . "\n"; -echo '<' . $namespace . ':id>' . $global_vars['SELF_LINK'] . '' . "\n"; +echo '' . "\n"; +echo '' . $global_vars['SELF_LINK'] . '' . "\n"; foreach ($item_vars as $row) { - echo '<' . $namespace . ':entry>' . "\n"; + echo '' . "\n"; if (!empty($row['author'])) { - echo '<' . $namespace . ':author><' . $namespace . ':name>' . $row['author'] . '' . "\n"; + echo '' . "\n"; } - echo '<' . $namespace . ':updated>' . $row['pubdate'] . '' . "\n"; - echo '<' . $namespace . ':id>' . $row['link'] . '' . "\n"; - echo '<' . $namespace . ':link href="' . $row['link'] . '"/>' . "\n"; - echo '<' . $namespace . ':title type="xhtml">
' . $row['title'] . '
' . "\n\n"; + echo '' . $row['pubdate'] . '' . "\n"; + echo '' . $row['link'] . '' . "\n"; + echo '' . "\n"; + echo '<![CDATA[' . $row['title'] . ']]>' . "\n\n"; if (!empty($row['category'])) { - echo '<' . $namespace . ':category term="' . $row['category_name'] . '" scheme="' . $row['category'] . '" label="' . $row['category_name'] . '"/>' . "\n"; + echo '' . "\n"; } - echo '<' . $namespace . ':content type="xhtml" xml:base="' . $row['link'] . '">' . "\n"; - echo '
' . "\n"; + echo '' . $user->lang['STATISTICS'] . ': ' . $row['statistics'] . '

'; } - echo '
' . "\n" . '' . "\n"; - echo '' . "\n"; + echo '
' . "\n" . ']]>' . "\n"; + echo '
' . "\n"; } -echo ''; +echo '
'; garbage_collection(); exit_handler(); @@ -257,17 +254,19 @@ function feed_generate_content($content, $uid, $bitfield, $options) $content = str_replace('' .$user->lang['SELECT_ALL_CODE'] . '', '', $content); $content = preg_replace('#(onkeypress|onclick)="(.*?)"#si', '', $content); + // Firefox does not support CSS for feeds, though + // Remove font sizes - $content = preg_replace('#([^>]+)#iU', '\1', $content); +// $content = preg_replace('#([^>]+)#iU', '\1', $content); // Make text strong :P - $content = preg_replace('#([^<]+)#iU', '\1', $content); +// $content = preg_replace('#(.*?)#iU', '\1', $content); // Italic - $content = preg_replace('#([^<]+)#iU', '\1', $content); +// $content = preg_replace('#([^<]+)#iU', '\1', $content); // Underline - $content = preg_replace('#([^<]+)#iU', '\1', $content); +// $content = preg_replace('#([^<]+)#iU', '\1', $content); // Remove embed Windows Media Streams $content = preg_replace( '#<\!--\[if \!IE\]>-->([^[]+)<\!--#si', '', $content); @@ -293,6 +292,9 @@ function feed_generate_content($content, $uid, $bitfield, $options) $content = str_replace(array_keys($entities), array_values($entities), $content); + // Remove CDATA blocks. ;) + $content = preg_replace('#\<\!\[CDATA\[(.*?)\]\]\>#s', '', $content); + // Other control characters // $content = preg_replace('#(?:[\x00-\x1F\x7F]+|(?:\xC2[\x80-\x9F])+)#', '', $content); -- cgit v1.2.1 From 0cb565dc0c49edb871393cf4ec15fa193ce7fccb Mon Sep 17 00:00:00 2001 From: Meik Sievertsen Date: Mon, 27 Jul 2009 09:56:31 +0000 Subject: do not cache results from registered users... git-svn-id: file:///svn/phpbb/branches/phpBB-3_0_0@9866 89ea8834-ac86-4346-8a33-228a782c2dd0 --- phpBB/feed.php | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) (limited to 'phpBB/feed.php') diff --git a/phpBB/feed.php b/phpBB/feed.php index 33549bcc56..ffce19746d 100644 --- a/phpBB/feed.php +++ b/phpBB/feed.php @@ -10,7 +10,6 @@ * MOD Author Profile: http://www.phpbb.com/community/memberlist.php?mode=viewprofile&u=345763 * MOD Author Homepage: http://www.mssti.com/phpbb3/ * -* @note remove cache if Authentication gets added **/ /** @@ -221,7 +220,7 @@ function feed_append_sid($url, $params) // Now the only thing remaining could be an empty & if (substr($link, -5) === '&') { - $link = substr($link, 0, -5); + $link = substr($link, 0, -5); } return $link; @@ -417,7 +416,7 @@ class phpbb_feed /** * Default setting for last x days */ - var $sort_days = 100; + var $sort_days = 30; /** * Default cache time of entries in seconds @@ -585,7 +584,7 @@ class phpbb_feed $post_ids = array(); - // Search for topics in last 7 days + // Search for topics in last X days $last_post_time_sql = ($this->sort_days) ? ' AND t.topic_last_post_time > ' . (time() - ($this->sort_days * 24 * 3600)) : ''; // Fetch latest post, grouped by topic... @@ -713,6 +712,18 @@ class phpbb_feed { global $db, $cache; + // Disable cache if it is not a guest or a bot but a registered user + if ($this->cache_time) + { + global $user; + + // We check this here because we call get_item() quite often + if (!empty($user) && $user->data['is_registered']) + { + $this->cache_time = 0; + } + } + if (!$this->cache_time) { if (empty($this->result)) -- cgit v1.2.1 From 3d8d213e8f57a9387b090c858fb831036b264ade Mon Sep 17 00:00:00 2001 From: Andreas Fischer Date: Mon, 27 Jul 2009 10:24:42 +0000 Subject: Cast some array values and properties to integer. git-svn-id: file:///svn/phpbb/branches/phpBB-3_0_0@9867 89ea8834-ac86-4346-8a33-228a782c2dd0 --- phpBB/feed.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'phpBB/feed.php') diff --git a/phpBB/feed.php b/phpBB/feed.php index ffce19746d..5f19d0161b 100644 --- a/phpBB/feed.php +++ b/phpBB/feed.php @@ -604,7 +604,7 @@ class phpbb_feed while ($row = $db->sql_fetchrow($result)) { - $post_ids[] = $row['topic_last_post_id']; + $post_ids[] = (int) $row['topic_last_post_id']; } $db->sql_freeresult($result); } @@ -630,7 +630,7 @@ class phpbb_feed $forum_ids = array(); while ($row = $db->sql_fetchrow($result)) { - $forum_ids[] = $row['forum_id']; + $forum_ids[] = (int) $row['forum_id']; } $db->sql_freeresult($result); @@ -646,7 +646,7 @@ class phpbb_feed while ($row = $db->sql_fetchrow($result)) { - $post_ids[] = $row['topic_last_post_id']; + $post_ids[] = (int) $row['topic_last_post_id']; } $db->sql_freeresult($result); } @@ -676,7 +676,7 @@ class phpbb_feed while ($row = $db->sql_fetchrow($result)) { - $post_ids[] = $row['post_id']; + $post_ids[] = (int) $row['post_id']; } $db->sql_freeresult($result); } @@ -870,7 +870,7 @@ class phpbb_feed_news extends phpbb_feed $this->set('enable_smilies', 'enable_smilies'); $this->set('enable_magic_url', 'enable_magic_url'); - $this->num_items = $config['feed_overall_forums_limit']; + $this->num_items = (int) $config['feed_overall_forums_limit']; } function open() @@ -949,7 +949,7 @@ class phpbb_feed_topics extends phpbb_feed $this->set('enable_smilies', 'enable_smilies'); $this->set('enable_magic_url', 'enable_magic_url'); - $this->num_items = $config['feed_overall_topics_limit']; + $this->num_items = (int) $config['feed_overall_topics_limit']; } function open() @@ -981,7 +981,7 @@ class phpbb_feed_topics extends phpbb_feed while ($row = $db->sql_fetchrow($result)) { - $post_ids[] = $row['topic_first_post_id']; + $post_ids[] = (int) $row['topic_first_post_id']; } $db->sql_freeresult($result); -- cgit v1.2.1 From 4066849b726b279923d0518c4754f21b464186a4 Mon Sep 17 00:00:00 2001 From: Meik Sievertsen Date: Mon, 27 Jul 2009 10:46:56 +0000 Subject: i hope this resolves the duplicate issues in feed readers git-svn-id: file:///svn/phpbb/branches/phpBB-3_0_0@9868 89ea8834-ac86-4346-8a33-228a782c2dd0 --- phpBB/feed.php | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) (limited to 'phpBB/feed.php') diff --git a/phpBB/feed.php b/phpBB/feed.php index 5f19d0161b..a84cc81940 100644 --- a/phpBB/feed.php +++ b/phpBB/feed.php @@ -218,10 +218,9 @@ function feed_append_sid($url, $params) $link = (strpos($link, 'sid=') !== false) ? trim(preg_replace('/(&|&|\?)sid=[a-z0-9]+(&|&)?/', '\1', $link), '?& ') : $link; // Now the only thing remaining could be an empty & - if (substr($link, -5) === '&') - { - $link = substr($link, 0, -5); - } + $link = (substr($link, -5) === '&') ? substr($link, 0, -5) : $link; + // And &#xxx + $link = str_replace('&#', '#', $link); return $link; } -- cgit v1.2.1 From a96986744dbe5819b42baacc929c23fc8e57c746 Mon Sep 17 00:00:00 2001 From: Andreas Fischer Date: Mon, 27 Jul 2009 12:18:09 +0000 Subject: Directly send UTF8 data instead of entities. git-svn-id: file:///svn/phpbb/branches/phpBB-3_0_0@9870 89ea8834-ac86-4346-8a33-228a782c2dd0 --- phpBB/feed.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'phpBB/feed.php') diff --git a/phpBB/feed.php b/phpBB/feed.php index a84cc81940..f0e4435956 100644 --- a/phpBB/feed.php +++ b/phpBB/feed.php @@ -282,10 +282,10 @@ function feed_generate_content($content, $uid, $bitfield, $options) // Replace some entities with their unicode counterpart $entities = array( - ' ' => ' ', - '•' => '•', - '·' => '·', - '©' => '©', + ' ' => "\xC2\xA0", + '•' => "\xE2\x80\xA2", + '·' => "\xC2\xB7", + '©' => "\xC2\xA9", ); $content = str_replace(array_keys($entities), array_values($entities), $content); @@ -425,7 +425,7 @@ class phpbb_feed /** * Separator for title elements to separate items (for example forum / topic) */ - var $separator = '•'; + var $separator = "\xE2\x80\xA2"; // • /** * Constructor. Set standard keys. -- cgit v1.2.1 From 09ad10a734c0993f9465e6ac3463951251602fc6 Mon Sep 17 00:00:00 2001 From: Meik Sievertsen Date: Wed, 12 Aug 2009 15:00:47 +0000 Subject: ok, i am very sorry, but this needs to be fixed. Generally, our config table is not really suited for holding large datasets. Because feed settings for the forums to enable news feeds and excluded forums rely on the forums itself we have decided to introduce a forum_options table where custom options can be stored. Additionally, for this to work across all DBMS we support, we added a new method to the DBAL for the bitwise AND operator. Also moved the forum/topic feed template variable to the location where they belong to (forum and topic view) git-svn-id: file:///svn/phpbb/branches/phpBB-3_0_0@9965 89ea8834-ac86-4346-8a33-228a782c2dd0 --- phpBB/feed.php | 41 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 4 deletions(-) (limited to 'phpBB/feed.php') diff --git a/phpBB/feed.php b/phpBB/feed.php index f0e4435956..9603b27301 100644 --- a/phpBB/feed.php +++ b/phpBB/feed.php @@ -339,7 +339,17 @@ class phpbb_feed_factory break; case 'news': - if (empty($config['feed_news_id'])) + global $db; + + // Get at least one news forum + $sql = 'SELECT forum_id + FROM ' . FORUMS_TABLE . ' + WHERE ' . $db->sql_bit_and('forum_options', FORUM_OPTION_FEED_NEWS, '<> 0'); + $result = $db->sql_query_limit($sql, 1, 0, 600); + $s_feed_news = (int) $db->sql_fetchfield('forum_id'); + $db->sql_freeresult($result); + + if (!$s_feed_news) { return false; } @@ -534,7 +544,18 @@ class phpbb_feed global $auth, $db, $config, $phpbb_root_path, $phpEx, $user; // Which forums should not be searched ? - $exclude_forums = (!empty($config['feed_exclude_id'])) ? unserialize(trim($config['feed_exclude_id'])) : array(); + $exclude_forums = array(); + + $sql = 'SELECT forum_id + FROM ' . FORUMS_TABLE . ' + WHERE ' . $db->sql_bit_and('forum_options', FORUM_OPTION_FEED_EXCLUDE, '<> 0'); + $result = $db->sql_query($sql); + + while ($row = $db->sql_fetchrow($result)) + { + $exclude_forums[] = (int) $row['forum_id']; + } + $db->sql_freeresult($result); // Exclude forums the user is not able to read $this->excluded_forums_ary = array_keys($auth->acl_getf('!f_read', true)); @@ -883,7 +904,18 @@ class phpbb_feed_news extends phpbb_feed { global $db, $config; - $in_fid_ary = unserialize(trim($config['feed_news_id'])); + // Get news forums... + $sql = 'SELECT forum_id + FROM ' . FORUMS_TABLE . ' + WHERE ' . $db->sql_bit_and('forum_options', FORUM_OPTION_FEED_NEWS, '<> 0'); + $result = $db->sql_query($sql); + + $in_fid_ary = array(); + while ($row = $db->sql_fetchrow($result)) + { + $in_fid_ary[] = (int) $row['forum_id']; + } + $db->sql_freeresult($result); if (!sizeof($in_fid_ary)) { @@ -905,7 +937,8 @@ class phpbb_feed_news extends phpbb_feed 'WHERE' => $db->sql_in_set('t.forum_id', $in_fid_ary) . ' AND f.forum_id = t.forum_id AND p.post_id = t.topic_first_post_id - AND t.topic_poster = u.user_id', + AND t.topic_poster = u.user_id + AND t.topic_moved_id = 0', 'ORDER_BY' => 't.topic_time DESC', ); -- cgit v1.2.1