User Tools

Site Tools


php:kompost:listnavigation

[PHP] List Navigatior


Ausgangslage

Immer wieder hat man grössere Mengen Daten die auf verschiedene Seiten aufgeteilt werden sollten. Als Beispeil: Wir haben 55 Termine und wollen auf jeder Seite nur 10 Termine sehen. Dazu wollen wir ein ein Navigationsreiter mit den Seitenzahelen, vor und Zurück etc. haben.


Kleines Testspiel

test.php
<?php
//Klasse ienbinden
include_once 'ListNavigator.php';
 
//Eine DB-Connection aufbauen
$conn = mysql_connect('localhost', 'root', '') or die  ("Keine Verbindung möglich: ".mysql_error());
mysql_select_db('test') or die  ("Kann DB nicht auslesen: ".mysql_error());
 
//Aktuelle Seitennummer aus dem $_GET auslesen
$actPageNr = ($_GET['nr']) ? $_GET['nr'] : 0; 
 
//Definitionen
$sql = "SELECT * FROM nav";
$itemsPerPage = 5;
 
//Mein Navigator anlegen (Die Klasse ist weiter unten definiert)
$myNav = new ListNavigator($sql, $itemsPerPage);
//Aktuelle Seite setzen
$myNav->setPageNr($actPageNr);
 
//Zu Testzwecken geb ich mal das generierte SQL aus, im normalfall kann man damit die Daten abrufen
echo $myNav->getActSql();
echo "<hr />";
 
//Aufbau der Navigation
//Erste/Vorhergehende Seite -Links einfügen
if(!$myNav->bof()){
	$navEntries[] = "<a href='{$_SERVER['PHP_SELF']}?nr=".$myNav->getFirstNr()."'>&lt;&lt;</a>";
	$navEntries[] = "<a href='{$_SERVER['PHP_SELF']}?nr=".$myNav->getPrevNr()."'>&lt;</a>";
}
//Pro Seite einen Link einfügen
foreach($myNav->getPageNumbers() as $nr){
	if($nr == $actPageNr){
		$navEntries[] = "<b>{$nr}</b>";        
	}else{    
		$navEntries[] = "<a href='{$_SERVER['PHP_SELF']}?nr={$nr}'>{$nr}</a>";
	}
}
//Nächste/Letzte Seite -Links einfügen
if(!$myNav->eof()){
	$navEntries[] = "<a href='{$_SERVER['PHP_SELF']}?nr=".$myNav->getNextNr()."'>&gt;</a>";
	$navEntries[] = "<a href='{$_SERVER['PHP_SELF']}?nr=".$myNav->getLastNr()."'>&gt;&gt;</a>";
}
 
//Alle Links mit ' | ' getrennt ausgeben 
echo implode(' | ', $navEntries);
?>

ListNavigatior

ListNavigatior.php
<?php 
/**
* @copyright    mpl by ERB software
*               All rights reserved
* @author       stefan.erb@erb-software.com
*/
Class ListNavigator{
	const C_DEFAULT_ITEMS_PER_PAGE = 10;
 
	protected $sql;
	protected $itemsPerPage;
	protected $pages = array();
	protected $index = array();
	protected $actPageNr;
 
	/**
	 * Constructeur
	 * @param $sql          String      SQL das die Daten angrenzt, ohne ; am Schluss
	 * @param $itemsPerPage Integer     Anzahl Datensätze die pro Seite angezeigt werden sollen
	 */
	public function __construct($sql, $itemsPerPage =C_DEFAULT_ITEMS_PER_PAGE){
		$this->sql = $sql;
		$this->itemsPerPage = $itemsPerPage;
 
		//Anzahl Datensätze ermitteln
		$sql = "SELECT COUNT(*) AS count_items FROM ({$this->sql}) AS data_for_count";
		$result = mysql_query($sql);
		$countItems = mysql_result($result, 0, 0);
		mysql_free_result($result);
 
		//Die Seiten definieren-> array([pageNr] => [LIMIT-Start der DB])
		$this->pages = range(0, $countItems-1, $this->itemsPerPage); 
		$this->index = array_keys($this->pages);        
	}
 
	/**
	 * Die aktuelle Seitennummer setzen 
	 * @param $pageNr       Integer
	 */
	public function setPageNr($pageNr){
		$this->actPageNr = $pageNr;        
	}
 
	/**
	 * Ein SQL ausgeben mit dem man die Daten abrufen kann
	 * @retrun              String      SQL-Statement
	 */
	public function getActSql(){
		return  "{$this->sql} LIMIT {$this->pages[$this->actPageNr]}, {$this->itemsPerPage}";
	}
 
	/**
	 * @return              Array<Integer>  Gibt ein Array mit allen Seitennummern aus
	 */
	public function getPageNumbers(){
		return $this->index;        
	}
 
	/**
	 * Begin of File
	 * @param $pageNr       Integer     Optional: zu prüfende Nr
	 * @return              Boolean     Gibt an ob der Zeiger auf dem ersten Element steht
	 */
	public function bof($pageNr = false){
		if(!$pageNr) $pageNr = $this->actPageNr;
		return $pageNr <= $this->getFirstNr();
	}
 
	/**
	 * End of File
	 * @param $pageNr       Integer     Optional: zu prüfende Nr
	 * @return              Boolean     Gibt an ob der Zeiger auf dem letzten Element steht
	 */
	public function eof($pageNr = false){
		if(!$pageNr) $pageNr = $this->actPageNr;
		return $pageNr >= $this->getLastNr();
	}
 
	/**
	 * @return              Integer     Erste Seitennummer
	 */
	public function getFirstNr(){
		return reset($this->index);
	}
 
	/**
	 * @return              Integer     Letzte Seitennummer
	 */
	public function getLastNr(){
		return end($this->index);
	}
 
	/**
	 * @return              Integer     Nächste Seitennummer (false falls wir bereits am Ende sind)
	 */
	public function getNextNr($pageNr = false){
		if(!$pageNr) $pageNr = $this->actPageNr;
		return ($this->eof($pageNr)) ? false : $pageNr+1;
	}
 
	/**
	 * @return              Integer     Vorhergehende Seitennummer (false falls wir bereits am Anfang sind)
	 */
	public function getPrevNr($pageNr = false){
		if(!$pageNr) $pageNr = $this->actPageNr;
		return ($this->bof($pageNr)) ? false : $pageNr-1;
	}
}
 
 
?>

Kleines Testspiel

test.php
<?php
//Klasse ienbinden
include_once 'ArrayNavigator.php';
 
$array = array(
				0 => array('id' => 1, 'name' => 'Item 1'),
				111 => array('id' => 2, 'name' => 'Item 2'),
				2 => array('id' => 3, 'name' => 'Item 3'),
				array('id' => 4, 'name' => 'Item 4'),
				array('id' => 5, 'name' => 'Item 5'),
				array('id' => 6, 'name' => 'Item 6'),
				array('id' => 7, 'name' => 'Item 7'),
				array('id' => 8, 'name' => 'Item 8'),
				array('id' => 9, 'name' => 'Item 9'),
				array('id' => 10, 'name' => 'Item 10')
);
 
//Aktuelle Seitennummer aus dem $_GET auslesen
$actPageNr = ($_GET['nr']) ? $_GET['nr'] : 0;
 
$myNav = new ArrayNavigator($array, 4);
 
//Aktuelle Seite setzen
$myNav->setPageNr($actPageNr);
 
//Zu Testzwecken geb ich mal das generierte SQL aus, im normalfall kann man damit die Daten abrufen
foreach($myNav->getArrayOfActualPage() as $index => $item){
	echo "{$index} -> {$item['id']}: {$item['name']}<br />\n";
}
echo "<hr />";
 
//Aufbau der Navigation
//Erste/Vorhergehende Seite -Links einfügen
if(!$myNav->bof()){
	$navEntries[] = "<a href='{$_SERVER['PHP_SELF']}?nr=".$myNav->getFirstNr()."'>&lt;&lt;</a>";
	$navEntries[] = "<a href='{$_SERVER['PHP_SELF']}?nr=".$myNav->getPrevNr()."'>&lt;</a>";
}
//Pro Seite einen Link einfügen
foreach($myNav->getPageNumbers() as $nr){
	if($nr == $actPageNr){
		$navEntries[] = "<b>{$nr}</b>";        
	}else{    
		$navEntries[] = "<a href='{$_SERVER['PHP_SELF']}?nr={$nr}'>{$nr}</a>";
	}
}
//Nächste/Letzte Seite -Links einfügen
if(!$myNav->eof()){
	$navEntries[] = "<a href='{$_SERVER['PHP_SELF']}?nr=".$myNav->getNextNr()."'>&gt;</a>";
	$navEntries[] = "<a href='{$_SERVER['PHP_SELF']}?nr=".$myNav->getLastNr()."'>&gt;&gt;</a>";
}
 
//Alle Links mit ' | ' getrennt ausgeben
echo implode(' | ', $navEntries);
?>

ArrayNavigator

ArrayNavigator.php
<?php 
/**
* @copyright    mpl by ERB software
*               All rights reserved
* @author       stefan.erb@erb-software.com
*/
Class ArrayNavigator{
	const C_DEFAULT_ITEMS_PER_PAGE = 10;
 
	protected $sql;
	protected $itemsPerPage;
	protected $pages = array();     //Array mit je dem ersten Index pro Seite
	protected $index = array();
	protected $actPageNr;
	protected $array;
 
	/**
	 * Constructeur
	 * @param $sql          String      SQL das die Daten angrenzt, ohne ; am Schluss
	 * @param $itemsPerPage Integer     Anzahl Datensätze die pro Seite angezeigt werden sollen
	 */
	public function __construct($array, $itemsPerPage =C_DEFAULT_ITEMS_PER_PAGE){
		$this->array = $array;
		$this->itemsPerPage = $itemsPerPage;
 
		//Anzahl Datensätze ermitteln
		$countItems = count($array);
 
		//Die Seiten definieren-> array([pageNr] => [LIMIT-Start der DB])
		$this->pages = range(0, $countItems-1, $this->itemsPerPage);
		$this->index = array_keys($this->pages);        
	}
 
	/**
	 * Gibt den Teil des Arrays aus, der der aktuellen Seite entspricht
	 * @param $pageNr       Integer
	 * @return              Array
	 */
	public function getArrayOfActualPage($pageNr = false){
		//Falls eine Seitennummer mitgegeben wird, zu dieser springen
		if($pageNr !== false) $this->setPageNr($pageNr);
		//Subarray aus dem Array extrahieren
		return array_slice($this->array, $this->pages[$this->actPageNr], $this->itemsPerPage, true);        
	}
 
	/**
	 * Die aktuelle Seitennummer setzen
	 * @param $pageNr       Integer
	 */
	public function setPageNr($pageNr){
		$this->actPageNr = $pageNr;        
	}
 
	/**
	 * @return              Array<Integer>  Gibt ein Array mit allen Seitennummern aus
	 */
	public function getPageNumbers(){
		return $this->index;        
	}
 
	/**
	 * Begin of File
	 * @param $pageNr       Integer     Optional: zu prüfende Nr
	 * @return              Boolean     Gibt an ob der Zeiger auf dem ersten Element steht
	 */
	public function bof($pageNr = false){
		if(!$pageNr) $pageNr = $this->actPageNr;
		return $pageNr <= $this->getFirstNr();
	}
 
	/**
	 * End of File
	 * @param $pageNr       Integer     Optional: zu prüfende Nr
	 * @return              Boolean     Gibt an ob der Zeiger auf dem letzten Element steht
	 */
	public function eof($pageNr = false){
		if(!$pageNr) $pageNr = $this->actPageNr;
		return $pageNr >= $this->getLastNr();
	}
 
	/**
	 * @return              Integer     Erste Seitennummer
	 */
	public function getFirstNr(){
		return reset($this->index);
	}
 
	/**
	 * @return              Integer     Letzte Seitennummer
	 */
	public function getLastNr(){
		return end($this->index);
	}
 
	/**
	 * @return              Integer     Nächste Seitennummer (false falls wir bereits am Ende sind)
	 */
	public function getNextNr($pageNr = false){
		if(!$pageNr) $pageNr = $this->actPageNr;
		return ($this->eof($pageNr)) ? false : $pageNr+1;
	}
 
	/**
	 * @return              Integer     Vorhergehende Seitennummer (false falls wir bereits am Anfang sind)
	 */
	public function getPrevNr($pageNr = false){
		if(!$pageNr) $pageNr = $this->actPageNr;
		return ($this->bof($pageNr)) ? false : $pageNr-1;
	}
}
?>

php/kompost/listnavigation.txt · Last modified: 11.12.2013 11:19:40 (external edit)