• 欢迎访问开心洋葱网站,在线教程,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站,欢迎加入开心洋葱 QQ群
  • 为方便开心洋葱网用户,开心洋葱官网已经开启复制功能!
  • 欢迎访问开心洋葱网站,手机也能访问哦~欢迎加入开心洋葱多维思维学习平台 QQ群
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏开心洋葱吧~~~~~~~~~~~~~!
  • 由于近期流量激增,小站的ECS没能经的起亲们的访问,本站依然没有盈利,如果各位看如果觉着文字不错,还请看官给小站打个赏~~~~~~~~~~~~~!

一个自定义的php分页类代码

PHP 水墨上仙 1445次浏览

一个自定义的php分页类代码

<?php

class Pagination
{
	// Default values
	var $items = -1;
	var $limit = NULL;
	var $target = "";
	var $page = 1;
	var $adjacents = 1;
	var $showCounter = FALSE;
	var $className = "pagination";
	var $parameterName = "page";
	
	// urlFriendly
	var $urlF = FALSE;
	var $rebuildQuery = TRUE;
	var $allowedParams = array();
	
	// Buttons next and previous
	var $nextT = "Next";
	var $nextI = ""; //
	var $prevT = "Previous";
	var $prevI = ""; //
	
	var $pagination;
	var $calculate = FALSE;
	
	// -------------------------------------------------------------------------
	
	/**
	 * Constructor
	 * 
	 */
	public function __construct($params = array())
	{
		// initialize with parameters
		if (is_array($params) OR is_object($params))
		{
			foreach ($params as $name => $value)
			{
				if (property_exists($this, $name))
				{
					$this->{$name} = $value;
				}
			}
		}
	}
	
	// -------------------------------------------------------------------------
	
	/**
	 * Helper Method - Calculate page offset
	 * 
	 * @param	Integer	$page	current page
	 * @param	Integer	$limit	Limit result per page
	 * @return	Integer			offset to use for sql
	 */
	static function page_offset($page, $limit)
	{
		$page = $page ? (int) $page : 1 ;
		return ($page - 1) * $limit;
	}
	
	// -------------------------------------------------------------------------
	
	/**
	 * Set total items
	 * 
	 * @param	Integer	$value	total number of items
	 */
	public function items($value)
	{
		$this->items = (int) $value;
	}
	
	// -------------------------------------------------------------------------
	
	/**
	 * Items to show per page
	 * 
	 * @param	Integer	$value	result per page
	 */
	public function limit($value)
	{
		$this->limit = (int) $value;
	}
	
	// -------------------------------------------------------------------------
	
	/**
	 * Page to sent the page value
	 * 
	 * @param	String	$value	base link target
	 */
	public function target($link_target)
	{
		$this->target = $link_target;
		
		if ( ! $this->rebuildQuery)
		{
			return;
		}
		
		// rebuild GET query
		$query = $this->_rebuild_query();
		
		// only append query when has parameter to append
		if ( ! empty($query))
		{
			$this->target .= '?' . $query;
		}
		
	}
	
	// -------------------------------------------------------------------------
	
	/**
	 * Set current page
	 * 
	 * @param	Integer	$value	current page
	 */
	public function currentPage($value)
	{
		$this->page = (int) $value;
	}
	
	// -------------------------------------------------------------------------
	
	/**
	 * How many adjacent pages should be shown on each side of the current page?
	 * 
	 * @param	Integer	$value	number of adjacent pages to show
	 */
	public function adjacents($value)
	{
		$this->adjacents = (int) $value;
	}
	
	// -------------------------------------------------------------------------
	
	/**
	 * show counter?
	 * 
	 * @param	Boolean	$value	show counter?
	 */
	public function showCounter($value = "")
	{
		$this->showCounter = ($value === TRUE) ? TRUE: FALSE;
	}
	
	// -------------------------------------------------------------------------
	
	/**
	 * change the class name of the pagination div
	 * 
	 * @param	String	$value	you desired class name
	 */
	public function changeClass($value = "")
	{
		$this->className = $value;
	}
	
	// -------------------------------------------------------------------------
	
	/**
	 * Label of the "Next" link
	 * 
	 * @param	String	$value	"next" text
	 */
	public function nextLabel($value)
	{
		$this->nextT = $value;
	}
	
	// -------------------------------------------------------------------------
	
	/**
	 * Icon entity of the "Next" link
	 * 
	 * @param	String	$value	html entity code
	 */
	public function nextIcon($value)
	{
		$this->nextI = $value;
	}
	
	// -------------------------------------------------------------------------
	
	/**
	 * Label of the "Prev" link
	 * 
	 * @param	String	$value	Label of the "Prev" link
	 */
	public function prevLabel($value)
	{
		$this->prevT = $value;
	}
	
	// -------------------------------------------------------------------------
	
	/**
	 * Icon entity of the "Prev" link
	 * 
	 * @param	String	$value	html entiry code to use as Prev Icon
	 */
	public function prevIcon($value)
	{
		$this->prevI = $value;
	}
	
	// -------------------------------------------------------------------------
	
	/**
	 * Change the parameter name if the page param
	 * 
	 * @param	String	$value	Name of parameter
	 */
	public function parameterName($value = "")
	{
		$this->parameterName = $value;
	}
	
	// -------------------------------------------------------------------------
	
	/**
	 * Set charactor token to use as url mask
	 * 
	 * @param	String	$value	token string default is %
	 */
	public function urlFriendly($value = "%")
	{
		if (eregi('^ *$', $value))
		{
			$this->urlF = FALSE;
			return FALSE;
		}
		
		$this->urlF = $value;
	}
	
	// -------------------------------------------------------------------------
	
	/**
	 * Display the pagination
	 * 
	 */
	public function show()
	{
		if ( ! $this->calculate)
		{
			if ($this->calculate())
			{
				echo "<div class=\"{$this->className}\">{$this->pagination}</div>\n";
			}
		}
	}
	
	// -------------------------------------------------------------------------
	
	/**
	 * Fetch the pagination output
	 * 
	 */
	public function getOutput()
	{
		if ( ! $this->calculate)
		{
			if ($this->calculate())
			{
				return "<div class=\"{$this->className}\">{$this->pagination}</div>\n";
			}
		}
	}

	// -------------------------------------------------------------------------
	
	/**
	 * Rebuild HTTP query string
	 * This method will generate a query string from $_GET array
	 * note that only allowed parameter in $this->allowedParams array will be processed
	 * 
	 * @return	String		query string
	 */
	protected function _rebuild_query()
	{
		$params = $_GET;
		
		foreach ($params as $name => $value)
		{
			// on allowed params will be set, and $this->parameterName will be forced to be deleted
			if (( ! empty($this->allowedParams) AND ! in_array($name, $this->allowedParams)) OR $name == $this->parameterName)
			{
				unset($params[$name]);
			}
		}
		
		if ( ! count($params))
		{
			return '';
		}
		
		return http_build_query($params);
	}	
	
	// -------------------------------------------------------------------------
	
	/**
	 * Helper function to generate a link
	 * 
	 * @param	Integer	$id	number of page
	 * @return	String		full request url
	 */
	function get_pagenum_link($id)
	{
		if (strpos($this->target, '?') === FALSE)
		{
			if ($this->urlF)
			{
				return str_replace($this->urlF, $id, $this->target);
			}
			else
			{
				return "{$this->target}?{$this->parameterName}={$id}";
			}
		}
		else
		{
			return "{$this->target}&{$this->parameterName}={$id}";
		}
	}
	
	// -------------------------------------------------------------------------
	
	/**
	 * Magic method quickly return output of pagination
	 * 
	 * @return	String		pagination output
	 */
	function __toString()
	{
		return $this->getOutput();
	}
	
	// -------------------------------------------------------------------------
	
	/**
	 * Main process , gathering all data then generate pagination output
	 * 
	 * @return	String		pagination output
	 */
	protected function calculate()
	{
		$this->pagination = "";
		$this->calculate == TRUE;
		$error = FALSE;
		
		if ($this->urlF AND $this->urlF != '%' AND strpos($this->target, $this->urlF) === FALSE)
		{
			//Es necesario especificar el comodin para sustituir
			echo "Especificaste un wildcard para sustituir, pero no existe en el target<br />";
			$error = TRUE;
		}
		elseif ($this->urlF AND $this->urlF == '%' AND strpos($this->target, $this->urlF) === FALSE)
		{
			echo "Es necesario especificar en el target el comodin % para sustituir el número de página<br />";
			$error = TRUE;
		}
		
		if ($this->items < 0)
		{
			echo "It is necessary to specify the <strong>number of pages</strong> (\$class->items(1000))<br />";
			$error = TRUE;
		}
		
		if ($this->limit == NULL)
		{
			echo "It is necessary to specify the <strong>limit of items</strong> to show per page (\$class->limit(10))<br />";
			$error = TRUE;
		}
		
		if ($error)
		{
			return FALSE;
		}
		
		$n = trim($this->nextT . ' ' . $this->nextI);
		$p = trim($this->prevI . ' ' . $this->prevT);
		
		/* Setup vars for query. */
		if($this->page)
		{
			$start = ($this->page - 1) * $this->limit;             //first item to display on this page
		}
		else
		{
			$start = 0;                                //if no page var is given, set start to 0
		}
		
		// -------------------------------------------------------------------------
		// Setup page vars for display.
		
		//previous page is page - 1
		$prev = $this->page - 1;
		
		//next page is page + 1
		$next = $this->page + 1;
		
		//lastpage is = total pages / items per page, rounded up.
		$lastpage = ceil($this->items/$this->limit);
		
		//last page minus 1
		$lpm1 = $lastpage - 1;                        
		
		// -------------------------------------------------------------------------
		// Now we apply our rules and draw the pagination object.
		// We're actually saving the code to a variable in case we want to draw it more than once.
		
		if ($lastpage > 1)
		{
			if ($this->page)
			{
				//anterior button
				if ($this->page > 1)
				{
					$this->pagination .= "<a href=\"" . $this->get_pagenum_link($prev) . "\" class=\"prev\">{$p}</a>";
				}
				else
				{
					$this->pagination .= "<span class=\"disabled\">{$p}</span>";
				}
			}
			
			// -------------------------------------------------------------------------
			// pages
			
			// not enough pages to bother breaking it up
			if ($lastpage < 7 + ($this->adjacents * 2))
			{
				for ($counter = 1; $counter <= $lastpage; $counter++)
				{
					if ($counter == $this->page)
					{
						$this->pagination .= "<span class=\"current\">{$counter}</span>";
					}
					else
					{
						$this->pagination .= "<a href=\"" . $this->get_pagenum_link($counter) . "\">{$counter}</a>";
					}
				}
			}
			
			// enough pages to hide some
			elseif ($lastpage > 5 + ($this->adjacents * 2))
			{
				// close to beginning; only hide later pages
				if($this->page < 1 + ($this->adjacents * 2))
				{
					for ($counter = 1; $counter < 4 + ($this->adjacents * 2); $counter++)
					{
						if ($counter == $this->page)
						{
							$this->pagination .= "<span class=\"current\">{$counter}</span>";
						}
						else
						{
							$this->pagination .= "<a href=\"" . $this->get_pagenum_link($counter) . "\">{$counter}</a>";
						}
					}
					
					$this->pagination .= "...";
					$this->pagination .= "<a href=\"" . $this->get_pagenum_link($lpm1) . "\">$lpm1</a>";
					$this->pagination .= "<a href=\"" . $this->get_pagenum_link($lastpage) . "\">$lastpage</a>";
				}
				
				// in middle; hide some front and some back
				elseif ($lastpage - ($this->adjacents * 2) > $this->page AND $this->page > ($this->adjacents * 2))
				{
					$this->pagination .= "<a href=\"" . $this->get_pagenum_link(1) . "\">1</a>";
					$this->pagination .= "<a href=\"" . $this->get_pagenum_link(2) . "\">2</a>";
					$this->pagination .= "...";
					
					for ($counter = $this->page - $this->adjacents; $counter <= $this->page + $this->adjacents; $counter++)
					{
						if ($counter == $this->page)
						{
							$this->pagination .= "<span class=\"current\">{$counter}</span>";
						}
						else
						{
							$this->pagination .= "<a href=\"" . $this->get_pagenum_link($counter) . "\">{$counter}</a>";
						}
					}
					
					$this->pagination .= "...";
					$this->pagination .= "<a href=\"" . $this->get_pagenum_link($lpm1) . "\">{$lpm1}</a>";
					$this->pagination .= "<a href=\"" . $this->get_pagenum_link($lastpage) . "\">{$lastpage}</a>";
				}
				
				// close to end; only hide early pages
				else
				{
					$this->pagination .= "<a href=\"" . $this->get_pagenum_link(1) . "\">1</a>";
					$this->pagination .= "<a href=\"" . $this->get_pagenum_link(2) . "\">2</a>";
					$this->pagination .= "...";
					
					for ($counter = $lastpage - (2 + ($this->adjacents * 2)); $counter <= $lastpage; $counter++)
					{
						if ($counter == $this->page)
						{
							$this->pagination .= "<span class=\"current\">{$counter}</span>";
						}
						else
						{
							$this->pagination .= "<a href=\"" . $this->get_pagenum_link($counter) . "\">{$counter}</a>";
						}
					}
				}
			}
			
			if ($this->page)
			{
				// siguiente button
				if ($this->page < $counter - 1)
				{
					$this->pagination .= "<a href=\"" . $this->get_pagenum_link($next) . "\" class=\"next\">{$n}</a>";
				}
				else
				{
					$this->pagination .= "<span class=\"disabled\">$n</span>";
					
					if ($this->showCounter)
					{
						$this->pagination .= "<div class=\"pagination_data\">({$this->items} Pages)</div>";
					}
				}
			}
		}
		
		return true;
	}
}


开心洋葱 , 版权所有丨如未注明 , 均为原创丨未经授权请勿修改 , 转载请注明一个自定义的php分页类代码
喜欢 (0)
加载中……