diff options
Diffstat (limited to 'phpBB/phpbb/pagination.php')
| -rw-r--r-- | phpBB/phpbb/pagination.php | 86 | 
1 files changed, 74 insertions, 12 deletions
diff --git a/phpBB/phpbb/pagination.php b/phpBB/phpbb/pagination.php index 57e7932341..7a81c25ad2 100644 --- a/phpBB/phpbb/pagination.php +++ b/phpBB/phpbb/pagination.php @@ -1,9 +1,13 @@  <?php  /**  * -* @package phpbb -* @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.  *  */ @@ -17,16 +21,26 @@ class pagination  	/** @var \phpbb\user */  	protected $user; +	/** @var \phpbb\controller\helper */ +	protected $helper; + +	/** @var \phpbb\event\dispatcher_interface */ +	protected $phpbb_dispatcher; +  	/**  	* Constructor  	* -	* @param	\phpbb\template\template	$template -	* @param	\phpbb\user					$user +	* @param	\phpbb\template\template			$template +	* @param	\phpbb\user							$user +	* @param	\phpbb\controller\helper			$helper +	* @param	\phpbb\event\dispatcher_interface	$phpbb_dispatcher  	*/ -	public function __construct(\phpbb\template\template $template, \phpbb\user $user) +	public function __construct(\phpbb\template\template $template, \phpbb\user $user, \phpbb\controller\helper $helper, \phpbb\event\dispatcher_interface $phpbb_dispatcher)  	{  		$this->template = $template;  		$this->user = $user; +		$this->helper = $helper; +		$this->phpbb_dispatcher = $phpbb_dispatcher;  	}  	/** @@ -40,13 +54,60 @@ class pagination  	*							If you use page numbers inside your controller route, start name should be the string  	*							that should be removed for the first page (example: /page/%d)  	* @param int $per_page the number of items, posts, etc. to display per page, used to determine the number of pages to produce -	* @return URL for the requested page +	* @return string URL for the requested page  	*/  	protected function generate_page_link($base_url, $on_page, $start_name, $per_page)  	{ -		if (strpos($start_name, '%d') !== false) +		// A listener can set this variable to the new pagination URL +		// to override the generate_page_link() function generated value +		$generate_page_link_override = false; + +		/** +		* Execute code and/or override generate_page_link() +		* +		* To override the generate_page_link() function generated value +		* set $generate_page_link_override to the new URL value +		* +		* @event core.pagination_generate_page_link +		* @var string base_url is url prepended to all links generated within the function +		*							If you use page numbers inside your controller route, base_url should contains a placeholder (%d) +		*							for the page. Also be sure to specify the pagination path information into the start_name argument +		* @var string on_page is the page for which we want to generate the link +		* @var string start_name is the name of the parameter containing the first item of the given page (example: start=20) +		*							If you use page numbers inside your controller route, start name should be the string +		*							that should be removed for the first page (example: /page/%d) +		* @var int per_page the number of items, posts, etc. to display per page, used to determine the number of pages to produce +		* @var bool|string generate_page_link_override Shall we return custom pagination link (string URL) or not (false) +		* @since 3.1.0-RC5 +		*/ +		$vars = array('base_url', 'on_page', 'start_name', 'per_page', 'generate_page_link_override'); +		extract($this->phpbb_dispatcher->trigger_event('core.pagination_generate_page_link', compact($vars))); + +		if ($generate_page_link_override) +		{ +			return $generate_page_link_override; +		} + +		if (!is_string($base_url))  		{ -			return ($on_page > 1) ? sprintf($base_url, (int) $on_page) : str_replace($start_name, '', $base_url); +			if (is_array($base_url['routes'])) +			{ +				$route = ($on_page > 1) ? $base_url['routes'][1] : $base_url['routes'][0]; +			} +			else +			{ +				$route = $base_url['routes']; +			} +			$params = (isset($base_url['params'])) ? $base_url['params'] : array(); +			$is_amp = (isset($base_url['is_amp'])) ? $base_url['is_amp'] : true; +			$session_id = (isset($base_url['session_id'])) ? $base_url['session_id'] : false; + +			if ($on_page > 1 || !is_array($base_url['routes'])) +			{ +				$params[$start_name] = (int) $on_page; +			} + +			return $this->helper->route($route, $params, $is_amp, $session_id);  		}  		else  		{ @@ -103,8 +164,8 @@ class pagination  				// determine this number. Again at most five pages? Then just display them all. More than  				// five and we first (min) determine whether we'd end up listing more pages than exist.  				// We then (max) ensure we're displaying the minimum number of pages. -				$start_page = ($total_pages > 5) ? min(max(1, $on_page - 3), $total_pages - 4) : 1; -				$end_page = ($total_pages > 5) ? max(min($total_pages, $on_page + 3), 5) : $total_pages; +				$start_page = ($total_pages > 5) ? min(max(1, $on_page - 2), $total_pages - 4) : 1; +				$end_page = ($total_pages > 5) ? max(min($total_pages, $on_page + 2), 5) : $total_pages;  			}  			if ($on_page != 1) @@ -194,7 +255,8 @@ class pagination  		$tpl_prefix = ($tpl_prefix == 'PAGINATION') ? '' : $tpl_prefix . '_';  		$template_array = array( -			$tpl_prefix . 'BASE_URL'		=> $base_url, +			$tpl_prefix . 'BASE_URL'		=> is_string($base_url) ? $base_url : '',//@todo: Fix this for routes +			$tpl_prefix . 'START_NAME'		=> $start_name,  			$tpl_prefix . 'PER_PAGE'		=> $per_page,  			'U_' . $tpl_prefix . 'PREVIOUS_PAGE'	=> ($on_page != 1) ? $u_previous_page : '',  			'U_' . $tpl_prefix . 'NEXT_PAGE'		=> ($on_page != $total_pages) ? $u_next_page : '',  | 
