diff options
Diffstat (limited to 'phpBB/phpbb/feed')
23 files changed, 1234 insertions, 442 deletions
| diff --git a/phpBB/phpbb/feed/attachments_base.php b/phpBB/phpbb/feed/attachments_base.php new file mode 100644 index 0000000000..b14dafe15a --- /dev/null +++ b/phpBB/phpbb/feed/attachments_base.php @@ -0,0 +1,85 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\feed; + +/** +* Abstract class for feeds displaying attachments +*/ +abstract class attachments_base extends base +{ +	/** +	* Attachments that may be displayed +	*/ +	protected $attachments = array(); + +	/** +	* Retrieve the list of attachments that may be displayed +	*/ +	protected function fetch_attachments() +	{ +		$sql_array = array( +			'SELECT'   => 'a.*', +			'FROM'     => array( +				ATTACHMENTS_TABLE => 'a' +			), +			'WHERE'    => 'a.in_message = 0 ', +			'ORDER_BY' => 'a.filetime DESC, a.post_msg_id ASC', +		); + +		if (isset($this->topic_id)) +		{ +			$sql_array['WHERE'] .= 'AND a.topic_id = ' . (int) $this->topic_id; +		} +		else if (isset($this->forum_id)) +		{ +			$sql_array['LEFT_JOIN'] = array( +				array( +					'FROM' => array(TOPICS_TABLE => 't'), +					'ON'   => 'a.topic_id = t.topic_id', +				) +			); +			$sql_array['WHERE'] .= 'AND t.forum_id = ' . (int) $this->forum_id; +		} + +		$sql = $this->db->sql_build_query('SELECT', $sql_array); +		$result = $this->db->sql_query($sql); + +		// Set attachments in feed items +		while ($row = $this->db->sql_fetchrow($result)) +		{ +			$this->attachments[$row['post_msg_id']][] = $row; +		} +		$this->db->sql_freeresult($result); +	} + +	/** +	* {@inheritDoc} +	*/ +	public function open() +	{ +		parent::open(); +		$this->fetch_attachments(); +	} + +	/** +	* Get attachments related to a given post +	* +	* @param $post_id  int  Post id +	* @return mixed Attachments related to $post_id +	*/ +	public function get_attachments($post_id) +	{ +		return $this->attachments[$post_id]; +	} +} diff --git a/phpBB/phpbb/feed/base.php b/phpBB/phpbb/feed/base.php index e6c1e606fa..188d229515 100644 --- a/phpBB/phpbb/feed/base.php +++ b/phpBB/phpbb/feed/base.php @@ -1,31 +1,33 @@  <?php  /** -* -* @package phpBB3 -* @copyright (c) 2013 phpBB Group -* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 -* -*/ + * + * This file is part of the phpBB Forum Software package. + * + * @copyright (c) phpBB Limited <https://www.phpbb.com> + * @license GNU General Public License, version 2 (GPL-2.0) + * + * For full copyright and license information, please see + * the docs/CREDITS.txt file. + * + */  namespace phpbb\feed;  /** -* Base class with some generic functions and settings. -* -* @package phpBB3 -*/ -abstract class base + * Base class with some generic functions and settings. + */ +abstract class base implements feed_interface  {  	/** -	* Feed helper object -	* @var \phpbb\feed\helper -	*/ +	 * Feed helper object +	 * @var \phpbb\feed\helper +	 */  	protected $helper;  	/** @var \phpbb\config\config */  	protected $config; -	/** @var \phpbb\db\driver\driver */ +	/** @var \phpbb\db\driver\driver_interface */  	protected $db;  	/** @var \phpbb\cache\driver\driver_interface */ @@ -41,44 +43,46 @@ abstract class base  	protected $phpEx;  	/** -	* SQL Query to be executed to get feed items -	*/ -	var $sql = array(); +	 * SQL Query to be executed to get feed items +	 */ +	protected $sql = array();  	/** -	* Keys specified for retrieval of title, content, etc. -	*/ -	var $keys = array(); +	 * Keys specified for retrieval of title, content, etc. +	 */ +	protected $keys = array();  	/** -	* Number of items to fetch. Usually overwritten by $config['feed_something'] -	*/ -	var $num_items = 15; +	 * Number of items to fetch. Usually overwritten by $config['feed_something'] +	 */ +	protected $num_items = 15;  	/** -	* Separator for title elements to separate items (for example forum / topic) -	*/ -	var $separator = "\xE2\x80\xA2"; // • +	 * Separator for title elements to separate items (for example forum / topic) +	 */ +	protected $separator = "\xE2\x80\xA2"; // •  	/** -	* Separator for the statistics row (Posted by, post date, replies, etc.) -	*/ -	var $separator_stats = "\xE2\x80\x94"; // — +	 * Separator for the statistics row (Posted by, post date, replies, etc.) +	 */ +	protected $separator_stats = "\xE2\x80\x94"; // — + +	/** @var mixed Query result handle */ +	protected $result;  	/** -	* Constructor -	* -	* @param \phpbb\feed\helper $helper Feed helper -	* @param \phpbb\config\config		$config		Config object -	* @param \phpbb\db\driver\driver	$db			Database connection -	* @param \phpbb\cache\driver\driver_interface	$cache			Cache object -	* @param \phpbb\user			$user		User object -	* @param \phpbb\auth\auth			$auth		Auth object -	* @param \phpbb\content_visibility	$content_visibility		Auth object -	* @param string				$phpEx		php file extension -	* @return	null -	*/ -	function __construct(\phpbb\feed\helper $helper, \phpbb\config\config $config, \phpbb\db\driver\driver $db, \phpbb\cache\driver\driver_interface $cache, \phpbb\user $user, \phpbb\auth\auth $auth, \phpbb\content_visibility $content_visibility, $phpEx) +	 * Constructor +	 * +	 * @param \phpbb\feed\helper					$helper		Feed helper +	 * @param \phpbb\config\config				$config		Config object +	 * @param \phpbb\db\driver\driver_interface	$db			Database connection +	 * @param \phpbb\cache\driver\driver_interface	$cache	Cache object +	 * @param \phpbb\user						$user		User object +	 * @param \phpbb\auth\auth					$auth		Auth object +	 * @param \phpbb\content_visibility			$content_visibility		Auth object +	 * @param string								$phpEx		php file extension +	 */ +	public function __construct(\phpbb\feed\helper $helper, \phpbb\config\config $config, \phpbb\db\driver\driver_interface $db, \phpbb\cache\driver\driver_interface $cache, \phpbb\user $user, \phpbb\auth\auth $auth, \phpbb\content_visibility $content_visibility, $phpEx)  	{  		$this->config = $config;  		$this->helper = $helper; @@ -105,23 +109,23 @@ abstract class base  	}  	/** -	* Set keys. -	*/ -	function set_keys() +	 * {@inheritdoc} +	 */ +	public function set_keys()  	{  	}  	/** -	* Open feed -	*/ -	function open() +	 * {@inheritdoc} +	 */ +	public function open()  	{  	}  	/** -	* Close feed -	*/ -	function close() +	 * {@inheritdoc} +	 */ +	public function close()  	{  		if (!empty($this->result))  		{ @@ -130,22 +134,47 @@ abstract class base  	}  	/** -	* Set key -	*/ -	function set($key, $value) +	 * {@inheritdoc} +	 */ +	public function set($key, $value)  	{  		$this->keys[$key] = $value;  	}  	/** -	* Get key -	*/ -	function get($key) +	 * {@inheritdoc} +	 */ +	public function get($key)  	{  		return (isset($this->keys[$key])) ? $this->keys[$key] : null;  	} -	function get_readable_forums() +	/** +	 * {@inheritdoc} +	 */ +	public function get_item() +	{ +		if (!isset($this->result)) +		{ +			if (!$this->get_sql()) +			{ +				return false; +			} + +			// Query database +			$sql = $this->db->sql_build_query('SELECT', $this->sql); +			$this->result = $this->db->sql_query_limit($sql, $this->num_items); +		} + +		return $this->db->sql_fetchrow($this->result); +	} + +	/** +	 * Returns the ids of the forums readable by the current user. +	 * +	 * @return int[] +	 */ +	protected function get_readable_forums()  	{  		static $forum_ids; @@ -157,7 +186,12 @@ abstract class base  		return $forum_ids;  	} -	function get_moderator_approve_forums() +	/** +	 * Returns the ids of the forum for which the current user can approve the post in the moderation queue. +	 * +	 * @return int[] +	 */ +	protected function get_moderator_approve_forums()  	{  		static $forum_ids; @@ -169,7 +203,13 @@ abstract class base  		return $forum_ids;  	} -	function is_moderator_approve_forum($forum_id) +	/** +	 * Returns true if the current user can approve the post of the given forum +	 * +	 * @param int $forum_id Forum id to check +	 * @return bool +	 */ +	protected function is_moderator_approve_forum($forum_id)  	{  		static $forum_ids; @@ -181,7 +221,12 @@ abstract class base  		return (isset($forum_ids[$forum_id])) ? true : false;  	} -	function get_excluded_forums() +	/** +	 * Returns the ids of the forum excluded from the feeds +	 * +	 * @return int[] +	 */ +	protected function get_excluded_forums()  	{  		static $forum_ids; @@ -208,38 +253,35 @@ abstract class base  		return $forum_ids;  	} -	function is_excluded_forum($forum_id) +	/** +	 * Returns true if the given id is in the excluded forums list. +	 * +	 * @param int $forum_id Id to check +	 * @return bool +	 */ +	protected function is_excluded_forum($forum_id)  	{  		$forum_ids = $this->get_excluded_forums();  		return isset($forum_ids[$forum_id]) ? true : false;  	} -	function get_passworded_forums() +	/** +	 * Returns all password protected forum ids the current user is currently NOT authenticated for. +	 * +	 * @return array     Array of forum ids +	 */ +	protected function get_passworded_forums()  	{  		return $this->user->get_passworded_forums();  	} -	function get_item() -	{ -		static $result; - -		if (!isset($result)) -		{ -			if (!$this->get_sql()) -			{ -				return false; -			} - -			// Query database -			$sql = $this->db->sql_build_query('SELECT', $this->sql); -			$result = $this->db->sql_query_limit($sql, $this->num_items); -		} - -		return $this->db->sql_fetchrow($result); -	} - -	function user_viewprofile($row) +	/** +	 * Returns the link to the user profile. +	 * +	 * @return string +	 */ +	protected function user_viewprofile($row)  	{  		$author_id = (int) $row[$this->get('author_id')]; @@ -252,4 +294,11 @@ abstract class base  		return '<a href="' . $this->helper->append_sid('memberlist.' . $this->phpEx, 'mode=viewprofile&u=' . $author_id) . '">' . $row[$this->get('creator')] . '</a>';  	} + +	/** +	 * Returns the SQL query used to retrieve the posts of the feed. +	 * +	 * @return string SQL SELECT query +	 */ +	protected abstract function get_sql();  } diff --git a/phpBB/phpbb/feed/controller/feed.php b/phpBB/phpbb/feed/controller/feed.php new file mode 100644 index 0000000000..31476b7317 --- /dev/null +++ b/phpBB/phpbb/feed/controller/feed.php @@ -0,0 +1,389 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\feed\controller; + +use phpbb\auth\auth; +use phpbb\config\config; +use phpbb\db\driver\driver_interface; +use phpbb\exception\http_exception; +use phpbb\feed\feed_interface; +use phpbb\feed\exception\feed_unavailable_exception; +use phpbb\feed\exception\unauthorized_exception; +use phpbb\feed\helper as feed_helper; +use phpbb\controller\helper as controller_helper; +use phpbb\symfony_request; +use phpbb\user; +use Symfony\Component\DependencyInjection\ContainerInterface; +use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\Routing\Generator\UrlGeneratorInterface; + +class feed +{ +	/** +	 * @var \Twig_Environment +	 */ +	protected $template; + +	/** +	 * @var symfony_request +	 */ +	protected $request; + +	/** +	 * @var controller_helper +	 */ +	protected $controller_helper; + +	/** +	 * @var config +	 */ +	protected $config; + +	/** +	 * @var driver_interface +	 */ +	protected $db; + +	/** +	 * @var ContainerInterface +	 */ +	protected $container; + +	/** +	 * @var feed_helper +	 */ +	protected $feed_helper; + +	/** +	 * @var user +	 */ +	protected $user; + +	/** +	 * @var auth +	 */ +	protected $auth; + +	/** +	 * @var string +	 */ +	protected $php_ext; + +	/** +	 * Constructor +	 * +	 * @param \Twig_Environment $twig +	 * @param symfony_request $request +	 * @param controller_helper $controller_helper +	 * @param config $config +	 * @param driver_interface $db +	 * @param ContainerInterface $container +	 * @param feed_helper $feed_helper +	 * @param user $user +	 * @param auth $auth +	 * @param string $php_ext +	 */ +	public function __construct(\Twig_Environment $twig, symfony_request $request, controller_helper $controller_helper, config $config, driver_interface $db, ContainerInterface $container, feed_helper $feed_helper, user $user, auth $auth, $php_ext) +	{ +		$this->request = $request; +		$this->controller_helper = $controller_helper; +		$this->config = $config; +		$this->db = $db; +		$this->container = $container; +		$this->feed_helper = $feed_helper; +		$this->user = $user; +		$this->auth = $auth; +		$this->php_ext = $php_ext; +		$this->template = $twig; +	} + +	/** +	 * Controller for /feed/forums route +	 * +	 * @return Response +	 * +	 * @throws http_exception when the feed is disabled +	 */ +	public function forums() +	{ +		if (!$this->config['feed_overall_forums']) +		{ +			$this->send_unavailable(); +		} + +		return $this->send_feed($this->container->get('feed.forums')); +	} + +	/** +	 * Controller for /feed/news route +	 * +	 * @return Response +	 * +	 * @throws http_exception when the feed is disabled +	 */ +	public function news() +	{ +		// Get at least one news forum +		$sql = 'SELECT forum_id +					FROM ' . FORUMS_TABLE . ' +					WHERE ' . $this->db->sql_bit_and('forum_options', FORUM_OPTION_FEED_NEWS, '<> 0'); +		$result = $this->db->sql_query_limit($sql, 1, 0, 600); +		$s_feed_news = (int) $this->db->sql_fetchfield('forum_id'); +		$this->db->sql_freeresult($result); + +		if (!$s_feed_news) +		{ +			$this->send_unavailable(); +		} + +		return $this->send_feed($this->container->get('feed.news')); +	} + +	/** +	 * Controller for /feed/topics route +	 * +	 * @return Response +	 * +	 * @throws http_exception when the feed is disabled +	 */ +	public function topics() +	{ +		if (!$this->config['feed_topics_new']) +		{ +			$this->send_unavailable(); +		} + +		return $this->send_feed($this->container->get('feed.topics')); +	} + +	/** +	 * Controller for /feed/topics_new route +	 * +	 * @return Response +	 * +	 * @throws http_exception when the feed is disabled +	 */ +	public function topics_new() +	{ +		return $this->topics(); +	} + +	/** +	 * Controller for /feed/topics_active route +	 * +	 * @return Response +	 * +	 * @throws http_exception when the feed is disabled +	 */ +	public function topics_active() +	{ +		if (!$this->config['feed_topics_active']) +		{ +			$this->send_unavailable(); +		} + +		return $this->send_feed($this->container->get('feed.topics_active')); +	} + +	/** +	 * Controller for /feed/forum/{forum_id} route +	 * +	 * @param int $forum_id +	 * +	 * @return Response +	 * +	 * @throws http_exception when the feed is disabled +	 */ +	public function forum($forum_id) +	{ +		if (!$this->config['feed_forum']) +		{ +			$this->send_unavailable(); +		} + +		return $this->send_feed($this->container->get('feed.forum')->set_forum_id($forum_id)); +	} + +	/** +	 * Controller for /feed/topic/{topic_id} route +	 * +	 * @param int $topic_id +	 * +	 * @return Response +	 * +	 * @throws http_exception when the feed is disabled +	 */ +	public function topic($topic_id) +	{ +		if (!$this->config['feed_topic']) +		{ +			$this->send_unavailable(); +		} + +		return $this->send_feed($this->container->get('feed.topic')->set_topic_id($topic_id)); +	} + +	/** +	 * Controller for /feed/{mode] route +	 * +	 * @return Response +	 * +	 * @throws http_exception when the feed is disabled +	 */ +	public function overall() +	{ +		if (!$this->config['feed_overall']) +		{ +			$this->send_unavailable(); +		} + +		return $this->send_feed($this->container->get('feed.overall')); +	} + +	/** +	 * Display a given feed +	 * +	 * @param feed_interface $feed +	 * +	 * @return Response +	 */ +	protected function send_feed(feed_interface $feed) +	{ +		try +		{ +			return $this->send_feed_do($feed); +		} +		catch (feed_unavailable_exception $e) +		{ +			throw new http_exception(Response::HTTP_NOT_FOUND, $e->getMessage(), $e->get_parameters(), $e); +		} +		catch (unauthorized_exception $e) +		{ +			throw new http_exception(Response::HTTP_FORBIDDEN, $e->getMessage(), $e->get_parameters(), $e); +		} +	} + +	/** +	 * Really send the feed +	 * +	 * @param feed_interface $feed +	 * +	 * @return Response +	 * +	 * @throw exception\feed_exception +	 */ +	protected function send_feed_do(feed_interface $feed) +	{ +		$feed_updated_time = 0; +		$item_vars = array(); + +		$board_url = $this->feed_helper->get_board_url(); + +		// Open Feed +		$feed->open(); + +		// 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 = (isset($row[$feed->get('title')]) && $row[$feed->get('title')] !== '') ? $row[$feed->get('title')] : ((isset($row[$feed->get('title2')])) ? $row[$feed->get('title2')] : ''); + +			$published = ($feed->get('published') !== null) ? (int) $row[$feed->get('published')] : 0; +			$updated = ($feed->get('updated') !== null) ? (int) $row[$feed->get('updated')] : 0; + +			$display_attachments = ($this->auth->acl_get('u_download') && $this->auth->acl_get('f_download', $row['forum_id']) && isset($row['post_attachment']) && $row['post_attachment']) ? true : false; + +			$item_row = array( +				'author'		=> ($feed->get('creator') !== null) ? $row[$feed->get('creator')] : '', +				'published'		=> ($published > 0) ? $this->feed_helper->format_date($published) : '', +				'updated'		=> ($updated > 0) ? $this->feed_helper->format_date($updated) : '', +				'link'			=> '', +				'title'			=> censor_text($title), +				'category'		=> ($this->config['feed_item_statistics'] && !empty($row['forum_id'])) ? $board_url . '/viewforum.' . $this->php_ext . '?f=' . $row['forum_id'] : '', +				'category_name'	=> ($this->config['feed_item_statistics'] && isset($row['forum_name'])) ? $row['forum_name'] : '', +				'description'	=> censor_text($this->feed_helper->generate_content($row[$feed->get('text')], $row[$feed->get('bbcode_uid')], $row[$feed->get('bitfield')], $options, $row['forum_id'], ($display_attachments ? $feed->get_attachments($row['post_id']) : array()))), +				'statistics'	=> '', +			); + +			// Adjust items, fill link, etc. +			$feed->adjust_item($item_row, $row); + +			$item_vars[] = $item_row; + +			$feed_updated_time = max($feed_updated_time, $published, $updated); +		} + +		// If we do not have any items at all, sending the current time is better than sending no time. +		if (!$feed_updated_time) +		{ +			$feed_updated_time = time(); +		} + +		$feed->close(); + +		$content = $this->template->render('feed.xml.twig', array( +			// Some default assignments +			// FEED_IMAGE is not used (atom) +			'FEED_IMAGE'			=> '', +			'SELF_LINK'				=> $this->controller_helper->route($this->request->attributes->get('_route'), $this->request->attributes->get('_route_params'), true, '', UrlGeneratorInterface::ABSOLUTE_URL), +			'FEED_LINK'				=> $board_url . '/index.' . $this->php_ext, +			'FEED_TITLE'			=> $this->config['sitename'], +			'FEED_SUBTITLE'			=> $this->config['site_desc'], +			'FEED_UPDATED'			=> $this->feed_helper->format_date($feed_updated_time), +			'FEED_LANG'				=> $this->user->lang['USER_LANG'], +			'FEED_AUTHOR'			=> $this->config['sitename'], + +			// Feed entries +			'FEED_ROWS'				=> $item_vars, +		)); + +		$response = new Response($content); +		$response->headers->set('Content-Type', 'application/atom+xml'); +		$response->setCharset('UTF-8'); +		$response->setLastModified(new \DateTime('@' . $feed_updated_time)); + +		if (!empty($this->user->data['is_bot'])) +		{ +			// Let reverse proxies know we detected a bot. +			$response->headers->set('X-PHPBB-IS-BOT', 'yes'); +		} + +		return $response; +	} + +	/** +	 * Throw and exception saying that the feed isn't available +	 * +	 * @throw http_exception +	 */ +	protected function send_unavailable() +	{ +		throw new http_exception(404, 'FEATURE_NOT_AVAILABLE'); +	} +} diff --git a/phpBB/phpbb/feed/exception/feed_exception.php b/phpBB/phpbb/feed/exception/feed_exception.php new file mode 100644 index 0000000000..c9c888211e --- /dev/null +++ b/phpBB/phpbb/feed/exception/feed_exception.php @@ -0,0 +1,21 @@ +<?php +/** + * + * This file is part of the phpBB Forum Software package. + * + * @copyright (c) phpBB Limited <https://www.phpbb.com> + * @license GNU General Public License, version 2 (GPL-2.0) + * + * For full copyright and license information, please see + * the docs/CREDITS.txt file. + * + */ + +namespace phpbb\feed\exception; + +use phpbb\exception\runtime_exception; + +abstract class feed_exception extends runtime_exception +{ + +} diff --git a/phpBB/phpbb/feed/exception/feed_unavailable_exception.php b/phpBB/phpbb/feed/exception/feed_unavailable_exception.php new file mode 100644 index 0000000000..4b6605b47d --- /dev/null +++ b/phpBB/phpbb/feed/exception/feed_unavailable_exception.php @@ -0,0 +1,19 @@ +<?php +/** + * + * This file is part of the phpBB Forum Software package. + * + * @copyright (c) phpBB Limited <https://www.phpbb.com> + * @license GNU General Public License, version 2 (GPL-2.0) + * + * For full copyright and license information, please see + * the docs/CREDITS.txt file. + * + */ + +namespace phpbb\feed\exception; + +abstract class feed_unavailable_exception extends feed_exception +{ + +} diff --git a/phpBB/phpbb/feed/exception/no_feed_exception.php b/phpBB/phpbb/feed/exception/no_feed_exception.php new file mode 100644 index 0000000000..af6357b74c --- /dev/null +++ b/phpBB/phpbb/feed/exception/no_feed_exception.php @@ -0,0 +1,22 @@ +<?php +/** + * + * This file is part of the phpBB Forum Software package. + * + * @copyright (c) phpBB Limited <https://www.phpbb.com> + * @license GNU General Public License, version 2 (GPL-2.0) + * + * For full copyright and license information, please see + * the docs/CREDITS.txt file. + * + */ + +namespace phpbb\feed\exception; + +class no_feed_exception extends feed_unavailable_exception +{ +	public function __construct(\Exception $previous = null, $code = 0) +	{ +		parent::__construct('NO_FEED', array(), $previous, $code); +	} +} diff --git a/phpBB/phpbb/feed/exception/no_forum_exception.php b/phpBB/phpbb/feed/exception/no_forum_exception.php new file mode 100644 index 0000000000..a60832957a --- /dev/null +++ b/phpBB/phpbb/feed/exception/no_forum_exception.php @@ -0,0 +1,22 @@ +<?php +/** + * + * This file is part of the phpBB Forum Software package. + * + * @copyright (c) phpBB Limited <https://www.phpbb.com> + * @license GNU General Public License, version 2 (GPL-2.0) + * + * For full copyright and license information, please see + * the docs/CREDITS.txt file. + * + */ + +namespace phpbb\feed\exception; + +class no_forum_exception extends feed_unavailable_exception +{ +	public function __construct($forum_id, \Exception $previous = null, $code = 0) +	{ +		parent::__construct('NO_FORUM', array($forum_id), $previous, $code); +	} +} diff --git a/phpBB/phpbb/feed/exception/no_topic_exception.php b/phpBB/phpbb/feed/exception/no_topic_exception.php new file mode 100644 index 0000000000..b961a65d1c --- /dev/null +++ b/phpBB/phpbb/feed/exception/no_topic_exception.php @@ -0,0 +1,22 @@ +<?php +/** + * + * This file is part of the phpBB Forum Software package. + * + * @copyright (c) phpBB Limited <https://www.phpbb.com> + * @license GNU General Public License, version 2 (GPL-2.0) + * + * For full copyright and license information, please see + * the docs/CREDITS.txt file. + * + */ + +namespace phpbb\feed\exception; + +class no_topic_exception extends feed_unavailable_exception +{ +	public function __construct($topic_id, \Exception $previous = null, $code = 0) +	{ +		parent::__construct('NO_TOPIC', array($topic_id), $previous, $code); +	} +} diff --git a/phpBB/phpbb/feed/exception/unauthorized_exception.php b/phpBB/phpbb/feed/exception/unauthorized_exception.php new file mode 100644 index 0000000000..7868975779 --- /dev/null +++ b/phpBB/phpbb/feed/exception/unauthorized_exception.php @@ -0,0 +1,19 @@ +<?php +/** + * + * This file is part of the phpBB Forum Software package. + * + * @copyright (c) phpBB Limited <https://www.phpbb.com> + * @license GNU General Public License, version 2 (GPL-2.0) + * + * For full copyright and license information, please see + * the docs/CREDITS.txt file. + * + */ + +namespace phpbb\feed\exception; + +abstract class unauthorized_exception extends feed_exception +{ + +} diff --git a/phpBB/phpbb/feed/exception/unauthorized_forum_exception.php b/phpBB/phpbb/feed/exception/unauthorized_forum_exception.php new file mode 100644 index 0000000000..4384c7b39b --- /dev/null +++ b/phpBB/phpbb/feed/exception/unauthorized_forum_exception.php @@ -0,0 +1,22 @@ +<?php +/** + * + * This file is part of the phpBB Forum Software package. + * + * @copyright (c) phpBB Limited <https://www.phpbb.com> + * @license GNU General Public License, version 2 (GPL-2.0) + * + * For full copyright and license information, please see + * the docs/CREDITS.txt file. + * + */ + +namespace phpbb\feed\exception; + +class unauthorized_forum_exception extends unauthorized_exception +{ +	public function __construct($forum_id, \Exception $previous = null, $code = 0) +	{ +		parent::__construct('SORRY_AUTH_READ', array($forum_id), $previous, $code); +	} +} diff --git a/phpBB/phpbb/feed/exception/unauthorized_topic_exception.php b/phpBB/phpbb/feed/exception/unauthorized_topic_exception.php new file mode 100644 index 0000000000..f49f0a0476 --- /dev/null +++ b/phpBB/phpbb/feed/exception/unauthorized_topic_exception.php @@ -0,0 +1,22 @@ +<?php +/** + * + * This file is part of the phpBB Forum Software package. + * + * @copyright (c) phpBB Limited <https://www.phpbb.com> + * @license GNU General Public License, version 2 (GPL-2.0) + * + * For full copyright and license information, please see + * the docs/CREDITS.txt file. + * + */ + +namespace phpbb\feed\exception; + +class unauthorized_topic_exception extends unauthorized_exception +{ +	public function __construct($topic_id, \Exception $previous = null, $code = 0) +	{ +		parent::__construct('SORRY_AUTH_READ_TOPIC', array($topic_id), $previous, $code); +	} +} diff --git a/phpBB/phpbb/feed/factory.php b/phpBB/phpbb/feed/factory.php deleted file mode 100644 index d370160563..0000000000 --- a/phpBB/phpbb/feed/factory.php +++ /dev/null @@ -1,123 +0,0 @@ -<?php -/** -* -* @package phpBB3 -* @copyright (c) 2013 phpBB Group -* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 -* -*/ - -namespace phpbb\feed; - -/** -* Factory class to return correct object -* @package phpBB3 -*/ -class factory -{ -	/** -	* Service container object -	* @var object -	*/ -	protected $container; - -	/** @var \phpbb\config\config */ -	protected $config; - -	/** @var \phpbb\db\driver\driver */ -	protected $db; - -	/** -	* Constructor -	* -	* @param objec				$container	Container object -	* @param \phpbb\config\config		$config		Config object -	* @param \phpbb\db\driver\driver	$db			Database connection -	* @return	null -	*/ -	public function __construct($container, \phpbb\config\config $config, \phpbb\db\driver\driver $db) -	{ -		$this->container = $container; -		$this->config = $config; -		$this->db = $db; -	} - -	/** -	* 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 get_feed($mode, $forum_id, $topic_id) -	{ -		switch ($mode) -		{ -			case 'forums': -				if (!$this->config['feed_overall_forums']) -				{ -					return false; -				} - -				return $this->container->get('feed.forums'); -			break; - -			case 'topics': -			case 'topics_new': -				if (!$this->config['feed_topics_new']) -				{ -					return false; -				} - -				return $this->container->get('feed.topics'); -			break; - -			case 'topics_active': -				if (!$this->config['feed_topics_active']) -				{ -					return false; -				} - -				return $this->container->get('feed.topics_active'); -			break; - -			case 'news': -				// Get at least one news forum -				$sql = 'SELECT forum_id -					FROM ' . FORUMS_TABLE . ' -					WHERE ' . $this->db->sql_bit_and('forum_options', FORUM_OPTION_FEED_NEWS, '<> 0'); -				$result = $this->db->sql_query_limit($sql, 1, 0, 600); -				$s_feed_news = (int) $this->db->sql_fetchfield('forum_id'); -				$this->db->sql_freeresult($result); - -				if (!$s_feed_news) -				{ -					return false; -				} - -				return $this->container->get('feed.news'); -			break; - -			default: -				if ($topic_id && $this->config['feed_topic']) -				{ -					return $this->container->get('feed.topic') -								->set_topic_id($topic_id); -				} -				else if ($forum_id && $this->config['feed_forum']) -				{ -					return $this->container->get('feed.forum') -								->set_forum_id($forum_id); -				} -				else if ($this->config['feed_overall']) -				{ -				return $this->container->get('feed.overall'); -				} - -				return false; -			break; -		} -	} -} diff --git a/phpBB/phpbb/feed/feed_interface.php b/phpBB/phpbb/feed/feed_interface.php new file mode 100644 index 0000000000..c185cd249c --- /dev/null +++ b/phpBB/phpbb/feed/feed_interface.php @@ -0,0 +1,67 @@ +<?php +/** + * + * This file is part of the phpBB Forum Software package. + * + * @copyright (c) phpBB Limited <https://www.phpbb.com> + * @license GNU General Public License, version 2 (GPL-2.0) + * + * For full copyright and license information, please see + * the docs/CREDITS.txt file. + * + */ + +namespace phpbb\feed; + +/** + * Interface implemented by all feeds types + */ +interface feed_interface +{ +	/** +	 * Set keys. +	 */ +	public function set_keys(); + +	/** +	 * Open feed +	 */ +	public function open(); + +	/** +	 * Close feed +	 */ +	public function close(); + +	/** +	 * Set key +	 * +	 * @param string $key Key +	 * @param mixed $value Value +	 */ +	public function set($key, $value); + +	/** +	 * Get key +	 * +	 * @param string $key Key +	 * @return mixed +	 */ +	public function get($key); + +	/** +	 * Get the next post in the feed +	 * +	 * @return array +	 */ +	public function get_item(); + +	/** +	 * Adjust a feed entry +	 * +	 * @param $item_row +	 * @param $row +	 * @return array +	 */ +	public function adjust_item(&$item_row, &$row); +} diff --git a/phpBB/phpbb/feed/forum.php b/phpBB/phpbb/feed/forum.php index 8026824ab7..6701c4d9e7 100644 --- a/phpBB/phpbb/feed/forum.php +++ b/phpBB/phpbb/feed/forum.php @@ -1,33 +1,39 @@  <?php  /** -* -* @package phpBB3 -* @copyright (c) 2013 phpBB Group -* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 -* -*/ + * + * This file is part of the phpBB Forum Software package. + * + * @copyright (c) phpBB Limited <https://www.phpbb.com> + * @license GNU General Public License, version 2 (GPL-2.0) + * + * For full copyright and license information, please see + * the docs/CREDITS.txt file. + * + */  namespace phpbb\feed; +use phpbb\feed\exception\no_feed_exception; +use phpbb\feed\exception\no_forum_exception; +use phpbb\feed\exception\unauthorized_forum_exception; +  /** -* Forum feed -* -* This will give you the last {$this->num_items} posts made -* within a specific forum. -* -* @package phpBB3 -*/ -class forum extends \phpbb\feed\post_base + * Forum feed + * + * This will give you the last {$this->num_items} posts made + * within a specific forum. + */ +class forum extends post_base  { -	var $forum_id		= 0; -	var $forum_data		= array(); +	protected $forum_id		= 0; +	protected $forum_data	= array();  	/** -	* Set the Forum ID -	* -	* @param int	$forum_id			Forum ID -	* @return	\phpbb\feed\forum -	*/ +	 * Set the Forum ID +	 * +	 * @param int	$forum_id			Forum ID +	 * @return	\phpbb\feed\forum +	 */  	public function set_forum_id($forum_id)  	{  		$this->forum_id = (int) $forum_id; @@ -35,7 +41,10 @@ class forum extends \phpbb\feed\post_base  		return $this;  	} -	function open() +	/** +	 * {@inheritdoc} +	 */ +	public function open()  	{  		// Check if forum exists  		$sql = 'SELECT forum_id, forum_name, forum_password, forum_type, forum_options @@ -47,25 +56,25 @@ class forum extends \phpbb\feed\post_base  		if (empty($this->forum_data))  		{ -			trigger_error('NO_FORUM'); +			throw new no_forum_exception($this->forum_id);  		}  		// Forum needs to be postable  		if ($this->forum_data['forum_type'] != FORUM_POST)  		{ -			trigger_error('NO_FEED'); +			throw new no_feed_exception();  		}  		// Make sure forum is not excluded from feed  		if (phpbb_optionget(FORUM_OPTION_FEED_EXCLUDE, $this->forum_data['forum_options']))  		{ -			trigger_error('NO_FEED'); +			throw new no_feed_exception();  		}  		// Make sure we can read this forum  		if (!$this->auth->acl_get('f_read', $this->forum_id))  		{ -			trigger_error('SORRY_AUTH_READ'); +			throw new unauthorized_forum_exception($this->forum_id);  		}  		// Make sure forum is not passworded or user is authed @@ -75,14 +84,19 @@ class forum extends \phpbb\feed\post_base  			if (isset($forum_ids_passworded[$this->forum_id]))  			{ -				trigger_error('SORRY_AUTH_READ'); +				throw new unauthorized_forum_exception($this->forum_id);  			}  			unset($forum_ids_passworded);  		} + +		parent::open();  	} -	function get_sql() +	/** +	 * {@inheritdoc} +	 */ +	protected function get_sql()  	{  		// Determine topics with recent activity  		$sql = 'SELECT topic_id, topic_last_post_time @@ -90,7 +104,7 @@ class forum extends \phpbb\feed\post_base  			WHERE forum_id = ' . $this->forum_id . '  				AND topic_moved_id = 0  				AND ' . $this->content_visibility->get_visibility_sql('topic', $this->forum_id) . ' -			ORDER BY topic_last_post_time DESC'; +			ORDER BY topic_last_post_time DESC, topic_last_post_id DESC';  		$result = $this->db->sql_query_limit($sql, $this->num_items);  		$topic_ids = array(); @@ -109,8 +123,8 @@ class forum extends \phpbb\feed\post_base  		}  		$this->sql = array( -			'SELECT'	=>	'p.post_id, p.topic_id, p.post_time, p.post_edit_time, p.post_visibility, 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', +			'SELECT'	=>	'p.post_id, p.topic_id, p.post_time, p.post_edit_time, p.post_visibility, p.post_subject, p.post_text, p.bbcode_bitfield, p.bbcode_uid, p.enable_bbcode, p.enable_smilies, p.enable_magic_url, p.post_attachment, ' . +				'u.username, u.user_id',  			'FROM'		=> array(  				POSTS_TABLE		=> 'p',  				USERS_TABLE		=> 'u', @@ -119,20 +133,27 @@ class forum extends \phpbb\feed\post_base  							AND ' . $this->content_visibility->get_visibility_sql('post', $this->forum_id, 'p.') . '  							AND p.post_time >= ' . $min_post_time . '  							AND p.poster_id = u.user_id', -			'ORDER_BY'	=> 'p.post_time DESC', +			'ORDER_BY'	=> 'p.post_time DESC, p.post_id DESC',  		);  		return true;  	} -	function adjust_item(&$item_row, &$row) +	/** +	 * {@inheritdoc} +	 */ +	public function adjust_item(&$item_row, &$row)  	{  		parent::adjust_item($item_row, $row);  		$item_row['title'] = (isset($row['forum_name']) && $row['forum_name'] !== '') ? $row['forum_name'] . ' ' . $this->separator . ' ' . $item_row['title'] : $item_row['title']; +		$item_row['forum_id'] = $this->forum_id;  	} -	function get_item() +	/** +	 * {@inheritdoc} +	 */ +	public function get_item()  	{  		return ($row = parent::get_item()) ? array_merge($this->forum_data, $row) : $row;  	} diff --git a/phpBB/phpbb/feed/forums.php b/phpBB/phpbb/feed/forums.php index ddbb0bf7b3..92f2b2dd4d 100644 --- a/phpBB/phpbb/feed/forums.php +++ b/phpBB/phpbb/feed/forums.php @@ -1,27 +1,32 @@  <?php  /** -* -* @package phpBB3 -* @copyright (c) 2013 phpBB Group -* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 -* -*/ + * + * This file is part of the phpBB Forum Software package. + * + * @copyright (c) phpBB Limited <https://www.phpbb.com> + * @license GNU General Public License, version 2 (GPL-2.0) + * + * For full copyright and license information, please see + * the docs/CREDITS.txt file. + * + */  namespace phpbb\feed;  /** -* 'All Forums' feed -* -* This will give you a list of all postable forums where feeds are enabled -* including forum description, topic stats and post stats -* -* @package phpBB3 -*/ -class forums extends \phpbb\feed\base + * 'All Forums' feed + * + * This will give you a list of all postable forums where feeds are enabled + * including forum description, topic stats and post stats + */ +class forums extends base  { -	var $num_items	= 0; +	protected $num_items	= 0; -	function set_keys() +	/** +	 * {@inheritdoc} +	 */ +	public function set_keys()  	{  		$this->set('title',		'forum_name');  		$this->set('text',		'forum_desc'); @@ -31,7 +36,10 @@ class forums extends \phpbb\feed\base  		$this->set('options',	'forum_desc_options');  	} -	function get_sql() +	/** +	 * {@inheritdoc} +	 */ +	public function get_sql()  	{  		$in_fid_ary = array_diff($this->get_readable_forums(), $this->get_excluded_forums());  		if (empty($in_fid_ary)) @@ -53,7 +61,10 @@ class forums extends \phpbb\feed\base  		return true;  	} -	function adjust_item(&$item_row, &$row) +	/** +	 * {@inheritdoc} +	 */ +	public function adjust_item(&$item_row, &$row)  	{  		$item_row['link'] = $this->helper->append_sid('viewforum.' . $this->phpEx, 'f=' . $row['forum_id']); diff --git a/phpBB/phpbb/feed/helper.php b/phpBB/phpbb/feed/helper.php index 3f2759b85e..e15d1e131e 100644 --- a/phpBB/phpbb/feed/helper.php +++ b/phpBB/phpbb/feed/helper.php @@ -1,18 +1,21 @@  <?php  /** -* -* @package phpBB3 -* @copyright (c) 2013 phpBB Group -* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 -* -*/ + * + * This file is part of the phpBB Forum Software package. + * + * @copyright (c) phpBB Limited <https://www.phpbb.com> + * @license GNU General Public License, version 2 (GPL-2.0) + * + * For full copyright and license information, please see + * the docs/CREDITS.txt file. + * + */  namespace phpbb\feed;  /** -* Class with some helpful functions used in feeds -* @package phpBB3 -*/ + * Class with some helpful functions used in feeds + */  class helper  {  	/** @var \phpbb\config\config */ @@ -24,24 +27,28 @@ class helper  	/** @var string */  	protected $phpbb_root_path; +	/** @var string */ +	protected $phpEx; +  	/** -	* Constructor -	* -	* @param	\phpbb\config\config	$config		Config object -	* @param	\phpbb\user		$user		User object -	* @param	string	$phpbb_root_path	Root path -	* @return	null -	*/ -	public function __construct(\phpbb\config\config $config, \phpbb\user $user, $phpbb_root_path) +	 * Constructor +	 * +	 * @param	\phpbb\config\config	$config		Config object +	 * @param	\phpbb\user		$user		User object +	 * @param	string	$phpbb_root_path	Root path +	 * @param	string	$phpEx				PHP file extension +	 */ +	public function __construct(\phpbb\config\config $config, \phpbb\user $user, $phpbb_root_path, $phpEx)  	{  		$this->config = $config;  		$this->user = $user;  		$this->phpbb_root_path = $phpbb_root_path; +		$this->phpEx = $phpEx;  	}  	/** -	* Run links through append_sid(), prepend generate_board_url() and remove session id -	*/ +	 * Run links through append_sid(), prepend generate_board_url() and remove session id +	 */  	public function get_board_url()  	{  		static $board_url; @@ -55,16 +62,16 @@ class helper  	}  	/** -	* Run links through append_sid(), prepend generate_board_url() and remove session id -	*/ +	 * Run links through append_sid(), prepend generate_board_url() and remove session id +	 */  	public function append_sid($url, $params)  	{  		return append_sid($this->get_board_url() . '/' . $url, $params, true, '');  	}  	/** -	* Generate ISO 8601 date string (RFC 3339) -	*/ +	 * Generate ISO 8601 date string (RFC 3339) +	 */  	public function format_date($time)  	{  		static $zone_offset; @@ -80,9 +87,17 @@ class helper  	}  	/** -	* Generate text content -	*/ -	public function generate_content($content, $uid, $bitfield, $options) +	 * Generate text content +	 * +	 * @param string $content is feed text content +	 * @param string $uid is bbcode_uid +	 * @param string $bitfield is bbcode bitfield +	 * @param int $options bbcode flag options +	 * @param int $forum_id is the forum id +	 * @param array $post_attachments is an array containing the attachments and their respective info +	 * @return string the html content to be printed for the feed +	 */ +	public function generate_content($content, $uid, $bitfield, $options, $forum_id, $post_attachments)  	{  		if (empty($content))  		{ @@ -107,16 +122,16 @@ class helper  		// Firefox does not support CSS for feeds, though  		// Remove font sizes -	//	$content = preg_replace('#<span style="font-size: [0-9]+%; line-height: [0-9]+%;">([^>]+)</span>#iU', '\1', $content); +		//	$content = preg_replace('#<span style="font-size: [0-9]+%; line-height: [0-9]+%;">([^>]+)</span>#iU', '\1', $content);  		// Make text strong :P -	//	$content = preg_replace('#<span style="font-weight: bold?">(.*?)</span>#iU', '<strong>\1</strong>', $content); +		//	$content = preg_replace('#<span style="font-weight: bold?">(.*?)</span>#iU', '<strong>\1</strong>', $content);  		// Italic -	//	$content = preg_replace('#<span style="font-style: italic?">([^<]+)</span>#iU', '<em>\1</em>', $content); +		//	$content = preg_replace('#<span style="font-style: italic?">([^<]+)</span>#iU', '<em>\1</em>', $content);  		// Underline -	//	$content = preg_replace('#<span style="text-decoration: underline?">([^<]+)</span>#iU', '<u>\1</u>', $content); +		//	$content = preg_replace('#<span style="text-decoration: underline?">([^<]+)</span>#iU', '<u>\1</u>', $content);  		// Remove embed Windows Media Streams  		$content	= preg_replace( '#<\!--\[if \!IE\]>-->([^[]+)<\!--<!\[endif\]-->#si', '', $content); @@ -129,8 +144,19 @@ class helper  		// Remove some specials html tag, because somewhere there are a mod to allow html tags ;)  		$content	= preg_replace( '#<(script|iframe)([^[]+)\1>#siU', ' <strong>$1</strong> ', $content); +		// Parse inline images to display with the feed +		if (!empty($post_attachments)) +		{ +			$update_count = array(); +			parse_attachments($forum_id, $content, $post_attachments, $update_count); +			$content .= implode('<br />', $post_attachments); + +			// Convert attachments' relative path to absolute path +			$content = str_replace($this->phpbb_root_path . 'download/file.' . $this->phpEx, $this->get_board_url() . '/download/file.' . $this->phpEx, $content); +		} +  		// Remove Comments from inline attachments [ia] -		$content	= preg_replace('#<div class="(inline-attachment|attachtitle)">(.*?)<!-- ia(.*?) -->(.*?)<!-- ia(.*?) -->(.*?)</div>#si','$4',$content); +		$content = preg_replace('#<dd>(.*?)</dd>#','',$content);  		// Replace some entities with their unicode counterpart  		$entities = array( diff --git a/phpBB/phpbb/feed/news.php b/phpBB/phpbb/feed/news.php index 7888e73239..fb6fa09278 100644 --- a/phpBB/phpbb/feed/news.php +++ b/phpBB/phpbb/feed/news.php @@ -1,25 +1,31 @@  <?php  /** -* -* @package phpBB3 -* @copyright (c) 2013 phpBB Group -* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 -* -*/ + * + * This file is part of the phpBB Forum Software package. + * + * @copyright (c) phpBB Limited <https://www.phpbb.com> + * @license GNU General Public License, version 2 (GPL-2.0) + * + * For full copyright and license information, please see + * the docs/CREDITS.txt file. + * + */  namespace phpbb\feed;  /** -* News feed -* -* This will give you {$this->num_items} first posts -* of all topics in the selected news forums. -* -* @package phpBB3 -*/ -class news extends \phpbb\feed\topic_base + * News feed + * + * This will give you {$this->num_items} first posts + * of all topics in the selected news forums. + */ +class news extends topic_base  { -	function get_news_forums() +	/** +	 * Returns the ids of the 'news forums' +	 * @return int[] +	 */ +	private function get_news_forums()  	{  		static $forum_ids; @@ -46,7 +52,10 @@ class news extends \phpbb\feed\topic_base  		return $forum_ids;  	} -	function get_sql() +	/** +	 * {@inheritdoc} +	 */ +	protected function get_sql()  	{  		// Determine forum ids  		$in_fid_ary = array_intersect($this->get_news_forums(), $this->get_readable_forums()); @@ -64,9 +73,8 @@ class news extends \phpbb\feed\topic_base  		// We really have to get the post ids first!  		$sql = 'SELECT topic_first_post_id, topic_time  			FROM ' . TOPICS_TABLE . ' -			WHERE ' . $this->db->sql_in_set('forum_id', $in_fid_ary) . ' -				AND topic_moved_id = 0 -				AND topic_visibility = ' . ITEM_APPROVED . ' +			WHERE topic_moved_id = 0 +				AND ' . $this->content_visibility->get_forums_visibility_sql('topic', $in_fid_ary) . '  			ORDER BY topic_time DESC';  		$result = $this->db->sql_query_limit($sql, $this->num_items); @@ -85,7 +93,7 @@ class news extends \phpbb\feed\topic_base  		$this->sql = array(  			'SELECT'	=> 'f.forum_id, f.forum_name,  							t.topic_id, t.topic_title, t.topic_poster, t.topic_first_poster_name, t.topic_posts_approved, t.topic_posts_unapproved, t.topic_posts_softdeleted, t.topic_views, t.topic_time, t.topic_last_post_time, -							p.post_id, p.post_time, p.post_edit_time, p.post_text, p.bbcode_bitfield, p.bbcode_uid, p.enable_bbcode, p.enable_smilies, p.enable_magic_url', +							p.post_id, p.post_time, p.post_edit_time, p.post_text, p.bbcode_bitfield, p.bbcode_uid, p.enable_bbcode, p.enable_smilies, p.enable_magic_url, p.post_attachment, t.topic_visibility',  			'FROM'		=> array(  				TOPICS_TABLE	=> 't',  				POSTS_TABLE		=> 'p', @@ -98,7 +106,7 @@ class news extends \phpbb\feed\topic_base  			),  			'WHERE'		=> 'p.topic_id = t.topic_id  							AND ' . $this->db->sql_in_set('p.post_id', $post_ids), -			'ORDER_BY'	=> 'p.post_time DESC', +			'ORDER_BY'	=> 'p.post_time DESC, p.post_id DESC',  		);  		return true; diff --git a/phpBB/phpbb/feed/overall.php b/phpBB/phpbb/feed/overall.php index 4545ba5c64..40cf94ace0 100644 --- a/phpBB/phpbb/feed/overall.php +++ b/phpBB/phpbb/feed/overall.php @@ -1,25 +1,30 @@  <?php  /** -* -* @package phpBB3 -* @copyright (c) 2013 phpBB Group -* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 -* -*/ + * + * This file is part of the phpBB Forum Software package. + * + * @copyright (c) phpBB Limited <https://www.phpbb.com> + * @license GNU General Public License, version 2 (GPL-2.0) + * + * For full copyright and license information, please see + * the docs/CREDITS.txt file. + * + */  namespace phpbb\feed;  /** -* Board wide feed (aka overall feed) -* -* This will give you the newest {$this->num_items} posts -* from the whole board. -* -* @package phpBB3 -*/ -class overall extends \phpbb\feed\post_base + * Board wide feed (aka overall feed) + * + * This will give you the newest {$this->num_items} posts + * from the whole board. + */ +class overall extends post_base  { -	function get_sql() +	/** +	 * {@inheritdoc} +	 */ +	protected function get_sql()  	{  		$forum_ids = array_diff($this->get_readable_forums(), $this->get_excluded_forums(), $this->get_passworded_forums());  		if (empty($forum_ids)) @@ -32,7 +37,7 @@ class overall extends \phpbb\feed\post_base  			FROM ' . TOPICS_TABLE . '  			WHERE topic_moved_id = 0  				AND ' . $this->content_visibility->get_forums_visibility_sql('topic', $forum_ids) . ' -			ORDER BY topic_last_post_time DESC'; +			ORDER BY topic_last_post_time DESC, topic_last_post_id DESC';  		$result = $this->db->sql_query_limit($sql, $this->num_items);  		$topic_ids = array(); @@ -53,8 +58,8 @@ class overall extends \phpbb\feed\post_base  		// Get the actual data  		$this->sql = array(  			'SELECT'	=>	'f.forum_id, f.forum_name, ' . -							'p.post_id, p.topic_id, p.post_time, p.post_edit_time, p.post_visibility, 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', +				'p.post_id, p.topic_id, p.post_time, p.post_edit_time, p.post_visibility, p.post_subject, p.post_text, p.bbcode_bitfield, p.bbcode_uid, p.enable_bbcode, p.enable_smilies, p.enable_magic_url, p.post_attachment, ' . +				'u.username, u.user_id',  			'FROM'		=> array(  				USERS_TABLE		=> 'u',  				POSTS_TABLE		=> 'p', @@ -69,13 +74,16 @@ class overall extends \phpbb\feed\post_base  							AND ' . $this->content_visibility->get_forums_visibility_sql('post', $forum_ids, 'p.') . '  							AND p.post_time >= ' . $min_post_time . '  							AND u.user_id = p.poster_id', -			'ORDER_BY'	=> 'p.post_time DESC', +			'ORDER_BY'	=> 'p.post_time DESC, p.post_id DESC',  		);  		return true;  	} -	function adjust_item(&$item_row, &$row) +	/** +	 * {@inheritdoc} +	 */ +	public function adjust_item(&$item_row, &$row)  	{  		parent::adjust_item($item_row, $row); diff --git a/phpBB/phpbb/feed/post_base.php b/phpBB/phpbb/feed/post_base.php index 42c5eea9e3..f6dc39cbec 100644 --- a/phpBB/phpbb/feed/post_base.php +++ b/phpBB/phpbb/feed/post_base.php @@ -1,24 +1,29 @@  <?php  /** -* -* @package phpBB3 -* @copyright (c) 2013 phpBB Group -* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 -* -*/ + * + * This file is part of the phpBB Forum Software package. + * + * @copyright (c) phpBB Limited <https://www.phpbb.com> + * @license GNU General Public License, version 2 (GPL-2.0) + * + * For full copyright and license information, please see + * the docs/CREDITS.txt file. + * + */  namespace phpbb\feed;  /** -* Abstract class for post based feeds -* -* @package phpBB3 -*/ -abstract class post_base extends \phpbb\feed\base + * Abstract class for post based feeds + */ +abstract class post_base extends attachments_base  { -	var $num_items = 'feed_limit_post'; +	protected $num_items = 'feed_limit_post'; -	function set_keys() +	/** +	 * {@inheritdoc} +	 */ +	public function set_keys()  	{  		$this->set('title',		'post_subject');  		$this->set('title2',	'topic_title'); @@ -37,7 +42,10 @@ abstract class post_base extends \phpbb\feed\base  		$this->set('enable_magic_url',	'enable_magic_url');  	} -	function adjust_item(&$item_row, &$row) +	/** +	 * {@inheritdoc} +	 */ +	public function adjust_item(&$item_row, &$row)  	{  		$item_row['link'] = $this->helper->append_sid('viewtopic.' . $this->phpEx, "t={$row['topic_id']}&p={$row['post_id']}#p{$row['post_id']}"); @@ -45,7 +53,8 @@ abstract class post_base extends \phpbb\feed\base  		{  			$item_row['statistics'] = $this->user->lang['POSTED'] . ' ' . $this->user->lang['POST_BY_AUTHOR'] . ' ' . $this->user_viewprofile($row)  				. ' ' . $this->separator_stats . ' ' . $this->user->format_date($row[$this->get('published')]) -				. (($this->is_moderator_approve_forum($row['forum_id']) && $row['post_visibility'] !== ITEM_APPROVED) ? ' ' . $this->separator_stats . ' ' . $this->user->lang['POST_UNAPPROVED'] : ''); +				. (($this->is_moderator_approve_forum($row['forum_id']) && (int) $row['post_visibility'] === ITEM_UNAPPROVED) ? ' ' . $this->separator_stats . ' ' . $this->user->lang['POST_UNAPPROVED'] : '') +				. (($this->is_moderator_approve_forum($row['forum_id']) && (int) $row['post_visibility'] === ITEM_DELETED) ? ' ' . $this->separator_stats . ' ' . $this->user->lang['POST_DELETED'] : '');  		}  	}  } diff --git a/phpBB/phpbb/feed/topic.php b/phpBB/phpbb/feed/topic.php index 09f377dd10..f029c2b00e 100644 --- a/phpBB/phpbb/feed/topic.php +++ b/phpBB/phpbb/feed/topic.php @@ -1,33 +1,40 @@  <?php  /** -* -* @package phpBB3 -* @copyright (c) 2013 phpBB Group -* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 -* -*/ + * + * This file is part of the phpBB Forum Software package. + * + * @copyright (c) phpBB Limited <https://www.phpbb.com> + * @license GNU General Public License, version 2 (GPL-2.0) + * + * For full copyright and license information, please see + * the docs/CREDITS.txt file. + * + */  namespace phpbb\feed; +use phpbb\feed\exception\no_feed_exception; +use phpbb\feed\exception\no_topic_exception; +use phpbb\feed\exception\unauthorized_forum_exception; +use phpbb\feed\exception\unauthorized_topic_exception; +  /** -* Topic feed for a specific topic -* -* This will give you the last {$this->num_items} posts made within this topic. -* -* @package phpBB3 -*/ -class topic extends \phpbb\feed\post_base + * Topic feed for a specific topic + * + * This will give you the last {$this->num_items} posts made within this topic. + */ +class topic extends post_base  { -	var $topic_id		= 0; -	var $forum_id		= 0; -	var $topic_data		= array(); +	protected $topic_id		= 0; +	protected $forum_id		= 0; +	protected $topic_data	= array();  	/** -	* Set the Topic ID -	* -	* @param int	$topic_id			Topic ID -	* @return	\phpbb\feed\topic -	*/ +	 * Set the Topic ID +	 * +	 * @param int	$topic_id			Topic ID +	 * @return	\phpbb\feed\topic +	 */  	public function set_topic_id($topic_id)  	{  		$this->topic_id = (int) $topic_id; @@ -35,7 +42,10 @@ class topic extends \phpbb\feed\post_base  		return $this;  	} -	function open() +	/** +	 * {@inheritdoc} +	 */ +	public function open()  	{  		$sql = 'SELECT f.forum_options, f.forum_password, t.topic_id, t.forum_id, t.topic_visibility, t.topic_title, t.topic_time, t.topic_views, t.topic_posts_approved, t.topic_type  			FROM ' . TOPICS_TABLE . ' t @@ -48,7 +58,7 @@ class topic extends \phpbb\feed\post_base  		if (empty($this->topic_data))  		{ -			trigger_error('NO_TOPIC'); +			throw new no_topic_exception($this->topic_id);  		}  		$this->forum_id = (int) $this->topic_data['forum_id']; @@ -56,19 +66,19 @@ class topic extends \phpbb\feed\post_base  		// Make sure topic is either approved or user authed  		if ($this->topic_data['topic_visibility'] != ITEM_APPROVED && !$this->auth->acl_get('m_approve', $this->forum_id))  		{ -			trigger_error('SORRY_AUTH_READ'); +			throw new unauthorized_topic_exception($this->topic_id);  		}  		// Make sure forum is not excluded from feed  		if (phpbb_optionget(FORUM_OPTION_FEED_EXCLUDE, $this->topic_data['forum_options']))  		{ -			trigger_error('NO_FEED'); +			throw new no_feed_exception();  		}  		// Make sure we can read this forum  		if (!$this->auth->acl_get('f_read', $this->forum_id))  		{ -			trigger_error('SORRY_AUTH_READ'); +			throw new unauthorized_forum_exception($this->forum_id);  		}  		// Make sure forum is not passworded or user is authed @@ -78,18 +88,23 @@ class topic extends \phpbb\feed\post_base  			if (isset($forum_ids_passworded[$this->forum_id]))  			{ -				trigger_error('SORRY_AUTH_READ'); +				throw new unauthorized_forum_exception($this->forum_id);  			}  			unset($forum_ids_passworded);  		} + +		parent::open();  	} -	function get_sql() +	/** +	 * {@inheritdoc} +	 */ +	protected function get_sql()  	{  		$this->sql = array( -			'SELECT'	=>	'p.post_id, p.post_time, p.post_edit_time, p.post_visibility, 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', +			'SELECT'	=>	'p.post_id, p.post_time, p.post_edit_time, p.post_visibility, p.post_subject, p.post_text, p.bbcode_bitfield, p.bbcode_uid, p.enable_bbcode, p.enable_smilies, p.enable_magic_url, p.post_attachment, ' . +				'u.username, u.user_id',  			'FROM'		=> array(  				POSTS_TABLE		=> 'p',  				USERS_TABLE		=> 'u', @@ -97,13 +112,26 @@ class topic extends \phpbb\feed\post_base  			'WHERE'		=> 'p.topic_id = ' . $this->topic_id . '  								AND ' . $this->content_visibility->get_visibility_sql('post', $this->forum_id, 'p.') . '  								AND p.poster_id = u.user_id', -			'ORDER_BY'	=> 'p.post_time DESC', +			'ORDER_BY'	=> 'p.post_time DESC, p.post_id DESC',  		);  		return true;  	} -	function get_item() +	/** +	 * {@inheritdoc} +	 */ +	public function adjust_item(&$item_row, &$row) +	{ +		parent::adjust_item($item_row, $row); + +		$item_row['forum_id'] = $this->forum_id; +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function get_item()  	{  		return ($row = parent::get_item()) ? array_merge($this->topic_data, $row) : $row;  	} diff --git a/phpBB/phpbb/feed/topic_base.php b/phpBB/phpbb/feed/topic_base.php index 7e28e67b82..0f1a9ccb70 100644 --- a/phpBB/phpbb/feed/topic_base.php +++ b/phpBB/phpbb/feed/topic_base.php @@ -1,24 +1,29 @@  <?php  /** -* -* @package phpBB3 -* @copyright (c) 2013 phpBB Group -* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 -* -*/ + * + * This file is part of the phpBB Forum Software package. + * + * @copyright (c) phpBB Limited <https://www.phpbb.com> + * @license GNU General Public License, version 2 (GPL-2.0) + * + * For full copyright and license information, please see + * the docs/CREDITS.txt file. + * + */  namespace phpbb\feed;  /** -* Abstract class for topic based feeds -* -* @package phpBB3 -*/ -abstract class topic_base extends \phpbb\feed\base + * Abstract class for topic based feeds + */ +abstract class topic_base extends attachments_base  { -	var $num_items = 'feed_limit_topic'; +	protected $num_items = 'feed_limit_topic'; -	function set_keys() +	/** +	 * {@inheritdoc} +	 */ +	public function set_keys()  	{  		$this->set('title',		'topic_title');  		$this->set('title2',	'forum_name'); @@ -37,7 +42,10 @@ abstract class topic_base extends \phpbb\feed\base  		$this->set('enable_magic_url',	'enable_magic_url');  	} -	function adjust_item(&$item_row, &$row) +	/** +	 * {@inheritdoc} +	 */ +	public function adjust_item(&$item_row, &$row)  	{  		$item_row['link'] = $this->helper->append_sid('viewtopic.' . $this->phpEx, 't=' . $row['topic_id'] . '&p=' . $row['post_id'] . '#p' . $row['post_id']); @@ -45,9 +53,24 @@ abstract class topic_base extends \phpbb\feed\base  		{  			$item_row['statistics'] = $this->user->lang['POSTED'] . ' ' . $this->user->lang['POST_BY_AUTHOR'] . ' ' . $this->user_viewprofile($row)  				. ' ' . $this->separator_stats . ' ' . $this->user->format_date($row[$this->get('published')]) -				. ' ' . $this->separator_stats . ' ' . $this->user->lang['REPLIES'] . ' ' . $this->content_visibility->get_count('topic_posts', $row, $row['forum_id']) - 1 -				. ' ' . $this->separator_stats . ' ' . $this->user->lang['VIEWS'] . ' ' . $row['topic_views'] -				. (($this->is_moderator_approve_forum($row['forum_id']) && $row['topic_posts_unapproved']) ? ' ' . $this->separator_stats . ' ' . $this->user->lang['POSTS_UNAPPROVED'] : ''); +				. ' ' . $this->separator_stats . ' ' . $this->user->lang['REPLIES'] . ' ' . ($this->content_visibility->get_count('topic_posts', $row, $row['forum_id']) - 1) +				. ' ' . $this->separator_stats . ' ' . $this->user->lang['VIEWS'] . ' ' . $row['topic_views']; + +			if ($this->is_moderator_approve_forum($row['forum_id'])) +			{ +				if ((int) $row['topic_visibility'] === ITEM_DELETED) +				{ +					$item_row['statistics'] .= ' ' . $this->separator_stats . ' ' . $this->user->lang['TOPIC_DELETED']; +				} +				else if ((int) $row['topic_visibility'] === ITEM_UNAPPROVED) +				{ +					$item_row['statistics'] .= ' ' . $this->separator_stats . ' ' . $this->user->lang['TOPIC_UNAPPROVED']; +				} +				else if ($row['topic_posts_unapproved']) +				{ +					$item_row['statistics'] .= ' ' . $this->separator_stats . ' ' . $this->user->lang['POSTS_UNAPPROVED']; +				} +			}  		}  	}  } diff --git a/phpBB/phpbb/feed/topics.php b/phpBB/phpbb/feed/topics.php index bdc858e947..cf4a2e579e 100644 --- a/phpBB/phpbb/feed/topics.php +++ b/phpBB/phpbb/feed/topics.php @@ -1,25 +1,30 @@  <?php  /** -* -* @package phpBB3 -* @copyright (c) 2013 phpBB Group -* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 -* -*/ + * + * This file is part of the phpBB Forum Software package. + * + * @copyright (c) phpBB Limited <https://www.phpbb.com> + * @license GNU General Public License, version 2 (GPL-2.0) + * + * For full copyright and license information, please see + * the docs/CREDITS.txt file. + * + */  namespace phpbb\feed;  /** -* New Topics feed -* -* This will give you the last {$this->num_items} created topics -* including the first post. -* -* @package phpBB3 -*/ -class topics extends \phpbb\feed\topic_base + * New Topics feed + * + * This will give you the last {$this->num_items} created topics + * including the first post. + */ +class topics extends topic_base  { -	function get_sql() +	/** +	 * {@inheritdoc} +	 */ +	protected function get_sql()  	{  		$forum_ids_read = $this->get_readable_forums();  		if (empty($forum_ids_read)) @@ -36,9 +41,8 @@ class topics extends \phpbb\feed\topic_base  		// We really have to get the post ids first!  		$sql = 'SELECT topic_first_post_id, topic_time  			FROM ' . TOPICS_TABLE . ' -			WHERE ' . $this->db->sql_in_set('forum_id', $in_fid_ary) . ' -				AND topic_moved_id = 0 -				AND topic_visibility = ' . ITEM_APPROVED . ' +			WHERE  topic_moved_id = 0 +				AND ' . $this->content_visibility->get_forums_visibility_sql('topic', $in_fid_ary) . '  			ORDER BY topic_time DESC';  		$result = $this->db->sql_query_limit($sql, $this->num_items); @@ -57,7 +61,7 @@ class topics extends \phpbb\feed\topic_base  		$this->sql = array(  			'SELECT'	=> 'f.forum_id, f.forum_name,  							t.topic_id, t.topic_title, t.topic_poster, t.topic_first_poster_name, t.topic_posts_approved, t.topic_posts_unapproved, t.topic_posts_softdeleted, t.topic_views, t.topic_time, t.topic_last_post_time, -							p.post_id, p.post_time, p.post_edit_time, p.post_text, p.bbcode_bitfield, p.bbcode_uid, p.enable_bbcode, p.enable_smilies, p.enable_magic_url', +							p.post_id, p.post_time, p.post_edit_time, p.post_text, p.bbcode_bitfield, p.bbcode_uid, p.enable_bbcode, p.enable_smilies, p.enable_magic_url, p.post_attachment, t.topic_visibility',  			'FROM'		=> array(  				TOPICS_TABLE	=> 't',  				POSTS_TABLE		=> 'p', @@ -70,13 +74,16 @@ class topics extends \phpbb\feed\topic_base  			),  			'WHERE'		=> 'p.topic_id = t.topic_id  							AND ' . $this->db->sql_in_set('p.post_id', $post_ids), -			'ORDER_BY'	=> 'p.post_time DESC', +			'ORDER_BY'	=> 'p.post_time DESC, p.post_id DESC',  		);  		return true;  	} -	function adjust_item(&$item_row, &$row) +	/** +	 * {@inheritdoc} +	 */ +	public function adjust_item(&$item_row, &$row)  	{  		parent::adjust_item($item_row, $row); diff --git a/phpBB/phpbb/feed/topics_active.php b/phpBB/phpbb/feed/topics_active.php index cc0adac2eb..52340dc2d5 100644 --- a/phpBB/phpbb/feed/topics_active.php +++ b/phpBB/phpbb/feed/topics_active.php @@ -1,28 +1,33 @@  <?php  /** -* -* @package phpBB3 -* @copyright (c) 2013 phpBB Group -* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 -* -*/ + * + * This file is part of the phpBB Forum Software package. + * + * @copyright (c) phpBB Limited <https://www.phpbb.com> + * @license GNU General Public License, version 2 (GPL-2.0) + * + * For full copyright and license information, please see + * the docs/CREDITS.txt file. + * + */  namespace phpbb\feed;  /** -* Active Topics feed -* -* This will give you the last {$this->num_items} topics -* with replies made withing the last {$this->sort_days} days -* including the last post. -* -* @package phpBB3 -*/ -class topics_active extends \phpbb\feed\topic_base + * Active Topics feed + * + * This will give you the last {$this->num_items} topics + * with replies made withing the last {$this->sort_days} days + * including the last post. + */ +class topics_active extends topic_base  { -	var $sort_days = 7; +	protected $sort_days = 7; -	function set_keys() +	/** +	 * {@inheritdoc} +	 */ +	public function set_keys()  	{  		parent::set_keys(); @@ -30,7 +35,10 @@ class topics_active extends \phpbb\feed\topic_base  		$this->set('creator',	'topic_last_poster_name');  	} -	function get_sql() +	/** +	 * {@inheritdoc} +	 */ +	protected function get_sql()  	{  		$forum_ids_read = $this->get_readable_forums();  		if (empty($forum_ids_read)) @@ -51,11 +59,10 @@ class topics_active extends \phpbb\feed\topic_base  		// We really have to get the post ids first!  		$sql = 'SELECT topic_last_post_id, topic_last_post_time  			FROM ' . TOPICS_TABLE . ' -			WHERE ' . $this->db->sql_in_set('forum_id', $in_fid_ary) . ' -				AND topic_moved_id = 0 -				AND topic_visibility = ' . ITEM_APPROVED . ' +			WHERE topic_moved_id = 0 +				AND ' . $this->content_visibility->get_forums_visibility_sql('topic', $in_fid_ary) . '  				' . $last_post_time_sql . ' -			ORDER BY topic_last_post_time DESC'; +			ORDER BY topic_last_post_time DESC, topic_last_post_id DESC';  		$result = $this->db->sql_query_limit($sql, $this->num_items);  		$post_ids = array(); @@ -74,7 +81,7 @@ class topics_active extends \phpbb\feed\topic_base  			'SELECT'	=> 'f.forum_id, f.forum_name,  							t.topic_id, t.topic_title, t.topic_posts_approved, t.topic_posts_unapproved, t.topic_posts_softdeleted, t.topic_views,  							t.topic_last_poster_id, t.topic_last_poster_name, t.topic_last_post_time, -							p.post_id, p.post_time, p.post_edit_time, p.post_text, p.bbcode_bitfield, p.bbcode_uid, p.enable_bbcode, p.enable_smilies, p.enable_magic_url', +							p.post_id, p.post_time, p.post_edit_time, p.post_text, p.bbcode_bitfield, p.bbcode_uid, p.enable_bbcode, p.enable_smilies, p.enable_magic_url, p.post_attachment, t.topic_visibility',  			'FROM'		=> array(  				TOPICS_TABLE	=> 't',  				POSTS_TABLE		=> 'p', @@ -87,13 +94,18 @@ class topics_active extends \phpbb\feed\topic_base  			),  			'WHERE'		=> 'p.topic_id = t.topic_id  							AND ' . $this->db->sql_in_set('p.post_id', $post_ids), -			'ORDER_BY'	=> 'p.post_time DESC', +			'ORDER_BY'	=> 'p.post_time DESC, p.post_id DESC',  		);  		return true;  	} -	function get_forum_ids() +	/** +	 * Returns the ids of the forums not excluded from the active list +	 * +	 * @return int[] +	 */ +	private function get_forum_ids()  	{  		static $forum_ids; @@ -121,7 +133,10 @@ class topics_active extends \phpbb\feed\topic_base  		return $forum_ids;  	} -	function adjust_item(&$item_row, &$row) +	/** +	 * {@inheritdoc} +	 */ +	public function adjust_item(&$item_row, &$row)  	{  		parent::adjust_item($item_row, $row); | 
