User Tools

Site Tools


php:kompost:jumpnavigator

[PHP] Jump Navigator

testNavigator.php
<?php
/** TEST */
include_once('Navigator.php');
$currentPageNr = $_GET['pageNr'];
if (!$currentPageNr) $currentPageNr = 0;
?>
statischer Aufruf<br />
<?php 
	//Für die möglichen Paramter siehe' static function getHtml' in Navigator.php
	echo Navigator::getHtml($currentPageNr, 1000);
?>
 
<hr />
Mit Navigation als Objekt<br />
<?php
	//Für die möglichen Paramter siehe' static function _construct' in Navigator.php
	$nav = new Navigator(1000, 'testNavigator.php');
	echo $nav->jumpByGet(".");
?>
 
<hr />
Über die Item-Nummer. Dies wird gebraucht, falls man nicht über die PageNummer einsteigt<br />
Die erste Item-ummer der ausgewählten Seite ist <?php echo $intemNr = $nav->getFirstItemNrFromPageNr($currentPageNr) ?> <br />
Die passende Navigation dazu:<br />
<?php echo $nav->jumpWithItemNr($intemNr);?>
<hr /> 
Navigator.php
<?php
/**
* @copyright    mpl by ERB software
*               All rights reserved
* @author       stefan.erb@erb-software.com
*/
class Navigator {
	protected $targetAdress;
	protected $varName;
	protected $range;
	protected $itemsPerPage;
	protected $startPageNumbers;
	protected $pages;  
	protected $currentPageNr;
 
	/**
	 * static method.
	 * @access  public
	 * @param   Number $currentPageNr
	 * @param   see constructor
	 * @param   String $glue
	 * @return  String html-Code for the Navigation
	 */
	public static function getHtml($currentPageNr, $itemCount, $targetAdress = __FILE__, $itemsPerPage=10, $range=4, $varName='pageNr', $glue = ' '){
		$nav = new Navigator($itemCount, $targetAdress, $itemsPerPage, $range, $varName);
		return $nav->jump($currentPageNr, $glue);
	}
 
	/**
	 * constructor
	 * @access  public
	 * @param   Number $itemCount         how many items exists
	 * @param   String $targetAdress      adress of the link-target
	 * @param   Number $itemsPerPage      how many items ar on one page
	 * @param   Number $range             how many entries ar laft and right of the currentPageNr
	 * @param   String $varName           name of the var with the pageNr
	 */
	public function __construct($itemCount, $targetAdress = __FILE__, $itemsPerPage=10, $range=4, $varName='pageNr'){
			$this->targetAdress = basename($targetAdress);
			$this->varName = $varName;
			$this->range = $range;
			$this->itemsPerPage = $itemsPerPage;
			$this->startPageNumbers = range(0, $itemCount-1, $itemsPerPage);
 
			$this->pages=array();
	}
 
	/**
	 * jump to the currentPageNr
	 * @access  public
	 * @param   Number $currentPageNr
	 * @param   String $glue
	 * @return  String html-Code for the Navigation
	 */
	public function jump($currentPageNr, $glue = ' '){
			$this->currentPageNr = $currentPageNr;
 
			//create the list of all pageNr
			$pageNrs = array_keys($this->startPageNumbers);
 
			// create the range with all showed pageNr
			$rangeStart = ($currentPageNr > $this->range) ? $currentPageNr - $this->range :0 ;
			$rangeLength = 2 * $this->range +1;
 
			$range = array_slice($pageNrs, $rangeStart, $rangeLength);
 
			// list of all showed pageNr
			$pages = array();
 
			// add first-link '<<'
			if ($currentPageNr != $firstPageNr = reset($pageNrs)) {
				$pages[] = $this->createLinkInfo($firstPageNr, '&lt;&lt;');
			}
			// add previous-link '<'
			if (reset($range) > $firstPageNr){
				$pages[] = $this->createLinkInfo($currentPageNr-1, '&lt;');
			}
 
			// add the page-links
			foreach ($range as $pageNr){
				$pages[] = $this->createLinkInfo($pageNr, $pageNr+1);
			}
 
			// add next-link '>'            
			if (end($range) <  $lastPageNr = end($pageNrs)){
				$pages[] =  $this->createLinkInfo($currentPageNr+1, '&gt;');
			}
			// add last-link '>>'
			if ($currentPageNr != $lastPageNr){
				$pages[] = $this->createLinkInfo($lastPageNr, '&gt;&gt;');
			}
 
			//return as string, separeted by $glue
			return implode($glue, $pages);
	}    
 
	/**
	 * jump to the currentPageNr and take the number from $_GET
	 * @access  public
	 * @param   String $glue
	 * @return  String html-Code for the Navigation
	 */
	public function jumpByGet($glue = ' '){
		return $this->jump($_GET[$this->varName], $glue);
	}
 
	/**
	 * jump to the current page with the itemNumber
	 * @access  public
	 * @param   Number $itemNr
	 * @param   String $glue
	 * @return  String html-Code for the Navigation
	 */
	public function jumpWithItemNr($itemNr, $glue = ' '){
		$pageNr = floor($itemNr / $this->itemsPerPage);
		return $this->jump($pageNr, $glue);
	}
 
	/**
	 * 
	 * @access  public
	 * @param   Number $pageNr
	 * @return  Number $itemNr
	 */
	public function getFirstItemNrFromPageNr($pageNr){
		return $this->startPageNumbers[$pageNr];
	}
 
	/**
	 * create the html-link for the pageNr
	 * @access  protected
	 * @param   Number $pageNr
	 * @param   String $label
	 * @return  String
	 */
	protected function createLinkInfo($pageNr, $label){
		if ($pageNr == $this->currentPageNr) $label = "<b>{$label}</b>";
		return "<a href=\"{$this->targetAdress}?{$this->varName}={$pageNr}\">{$label}</a>";
	}
}
?>

Ein weiterer Testfall

<?php
//Einbinden der Navigation-Klasse
include_once('navigator.php');
 
//Settings
define('C_ITEM_PER_PAGE', 25);
define('C_NAV_RANGE', 4);
define('C_GET_NAV_PARAM', 'pageNr');
 
 
//$_GET auswerten
$currentPageNr = $_GET[C_GET_NAV_PARAM];
if (!$currentPageNr) $currentPageNr = 0;
 
 
//TODO DB-Daten auslesen: Kein LIMIT verwenden, sondern alle Daten auslesen
//Ich simuliere hier mal die Resultate mit $x Einträgen
$rowCount = 30;
for($i = 0; $i < $rowCount; $i++){
	$rows[$i] = "Eintrag #{$i}";
}
 
//Navigator erstellen
$nav = new Navigator(count($rows), basename(__FILE__), C_ITEM_PER_PAGE, C_NAV_RANGE, C_GET_NAV_PARAM);
$navBar = $nav->jump($currentPageNr);
 
//Erste anzuzeigende ID auslesen
$firstId = $nav->getFirstItemNrFromPageNr($currentPageNr);
 
//Dei entsprechenden Zeilen aussuchen
$selectedRows = array_slice($rows, $firstId, C_ITEM_PER_PAGE);
 
//Datenausgabe
echo $navBar;
echo "<hr />";
echo implode('<br />', $selectedRows);
echo "<hr />";
echo $navBar;
 
?> 

Kategorien: CatPhp

php/kompost/jumpnavigator.txt · Last modified: 11.12.2013 11:17:42 (external edit)