======[PHP] List Navigatior======
----
{{image class="left" url="images/icons/48/gtk-go-back-rtl.png"}}
=====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.
----
{{image class="left" url="images/icons/48/application-x-php.png"}}
=====Navigation über DB-Daten=====
====Kleines Testspiel====
setPageNr($actPageNr);
//Zu Testzwecken geb ich mal das generierte SQL aus, im normalfall kann man damit die Daten abrufen
echo $myNav->getActSql();
echo "
";
//Aufbau der Navigation
//Erste/Vorhergehende Seite -Links einfügen
if(!$myNav->bof()){
$navEntries[] = "getFirstNr()."'><<";
$navEntries[] = "getPrevNr()."'><";
}
//Pro Seite einen Link einfügen
foreach($myNav->getPageNumbers() as $nr){
if($nr == $actPageNr){
$navEntries[] = "{$nr}";
}else{
$navEntries[] = "{$nr}";
}
}
//Nächste/Letzte Seite -Links einfügen
if(!$myNav->eof()){
$navEntries[] = "getNextNr()."'>>";
$navEntries[] = "getLastNr()."'>>>";
}
//Alle Links mit ' | ' getrennt ausgeben
echo implode(' | ', $navEntries);
?>
====ListNavigatior====
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 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;
}
}
?>
----
{{image class="left" url="images/icons/48/application-x-php.png"}}
=====Navigation über Array=====
====Kleines Testspiel====
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']}
\n";
}
echo "
";
//Aufbau der Navigation
//Erste/Vorhergehende Seite -Links einfügen
if(!$myNav->bof()){
$navEntries[] = "getFirstNr()."'><<";
$navEntries[] = "getPrevNr()."'><";
}
//Pro Seite einen Link einfügen
foreach($myNav->getPageNumbers() as $nr){
if($nr == $actPageNr){
$navEntries[] = "{$nr}";
}else{
$navEntries[] = "{$nr}";
}
}
//Nächste/Letzte Seite -Links einfügen
if(!$myNav->eof()){
$navEntries[] = "getNextNr()."'>>";
$navEntries[] = "getLastNr()."'>>>";
}
//Alle Links mit ' | ' getrennt ausgeben
echo implode(' | ', $navEntries);
?>
====ArrayNavigator====
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 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;
}
}
?>
----
{{image class="left" alt="ico" url="images/icons/48/xfce4-ui.png"}}