Blättern durch GB-Einträge - mal etwas anspruchsvoller

Eistee

Erfahrenes Mitglied
Ich hoffe, dass auch diese Frage nicht schon 20.000 mal gestellt wurde - beim Suchen hab ich nichts passendes gefunden ;)
Gleich zuerst. ich hab eine Bläterfunktion geschrieben und die funktioniert auch bestens :)
Die seiten werden wie folgt angezeigt:

<< 1 2 3 4 5 6 7 8 9 >>

Mit den Pfeilen an den seiten blättert mal jeweils eine Seite vor.
Diese Darstellungsweise ird mit ´zunehmnder Anzehl an Einträgen und somit an Seiten aber unübersichtlich.
Ich würde die seiten gerne in folgender Form darstellen:

<< 12 ... 5 ... 8 9 >>

Es sollen also jeweils die ersten beiden seiten und die letzten beiden seiten angezeigt werden + die jeweils aufgerufene Seite.
Wie lässt sich sowas umsetzen. Lösungsvorschläge sollten möglichst auf meinem jetzigen Code aufbauen.
PHP:
$sqlab = "SELECT * FROM guestbook";
$res = mysql_query($sqlab);
$num = mysql_num_rows($res);
$sqlab = "SELECT * FROM guestbook ORDER BY id DESC LIMIT $start, $show_entries";
$res = mysql_query($sqlab);

$num_pages = ceil($num/$show_entries);
$curr_page = $start/$show_entries;

...

if($curr_page != 0)
{
	echo '<a href="guestbook.phpß?start='.($start-$show_entries).'" class="smalllink"><</a>';
} 

for($a=0; $a<$num_pages; $a++)
{
	if($a != $curr_page)
    { 
		echo '<a href="guestbook.php?start='.($a*$show_entries).'" class="smalllink">'.($a+1).'</a>';
    }
    else
    {
    	echo '<td bgcolor="#F5F5FF"><b>'.($a+1).'</b></td>';
    }
}

if(($start+$show_entries)<$num)
{
	echo '<a href="guestbook.php?start='.($start+$show_entries).'" class="smalllink">></a>';
}

Wäre super, wenn ihr mir bei diesem Problem helfen könntet.
Danke!
 
Du kannst doch einfach in der for-Schleife mit $a und $num_pages arbeiten. Für die ersten beiden:

PHP:
//z.b. so für die ersten beiden
if($num_pages - $a == $num_pages | $num_pages - $a ==$num_pages-1) {
  Zahlenausgabe
} else {
  ...
}

..und dann entsprechend für die anderen noch dazu. Ich hoffe, Du verstehst was ich meine. Ansonsten meld ich mich morgen nochmal ausführlicher.
 
Wäre klasse, wenn du mir den Code noch einmal ausführlich posten könntest.
Bin leider noch nicht so firm in PHP um das so umzusetzen, wie du dir das vorstellst ;)
 
Ich verstehe vor allem nicht, wie ich es hinbekomme, das bis auf die gerade aktuelle und die ersten und letzten beiden Seiten, alle Seiten zu 3! Punkten [...] zusammengefasst werden sollen.
Es soll ja im Endergebniss nicht so aussehen:

<< 1 2 ... ... ... 6 ... 8 9 >>

sonder so

<< 1 2 ... 6 ... 8 9 >>

Wäre super, wenn mir den Lösungsweg mal jemand (jenno?! ;) ) detailiert erklären könnte.
 
Also ich hab dir mal was geschrieben. Ist ein wenig unübersichtlich. Aber ich denke mal du kommst da schon irgendwie rein ;)


PHP:
<?php
$num_seiten = 14;
if(!isset($_GET['akt_seite']))
{
  $akt_seite  = 1;
}
else
{
  $aktseite = $_GET['akt_seite'];
}

$str    = "";
$punkte = false;

if($akt_seite > 2)
{
  $str = "<a href=\"$PHP_SELF?akt_seite=1\"><<</a> ";
}
if($akt_seite > 1)
{
  $str .= "<a href=\"$PHP_SELF?akt_seite=". ($akt_seite - 1) ."\"><</a> ";
}

for($i == 1;$i <= $num_seiten; $i++)
{
  if($i == $akt_seite)
  {
    $str   .= "<b>$i</b> ";
    $punkte = false;
  }
  elseif(($i == 1)||($i == 2))
  {
    $str .= "<a href=\"$PHP_SELF?akt_seite=$i\">$i</a> ";
  }
  elseif($i >= ($num_seiten - 1))
  {
    $str .= "<a href=\"$PHP_SELF?akt_seite=$i\">$i</a> ";
  }
  elseif(($i > 2) && ($i < ($num_seiten - 1)))
  {
    if(!$punkte)
    {
      $str .="... ";
      $punkte = true;
    }
  }
}
if($akt_seite < $num_seiten)
{
  $str .= "<a href=\"$PHP_SELF?akt_seite=". ($akt_seite + 1) ."\">></a> ";
}

if($akt_seite < ($num_seiten-1))
{
  $str .= "<a href=\"$PHP_SELF?akt_seite=$num_seiten\">>></a>";
}

echo $str;
?>

Erlären ist schwer gesagt :) Also ich hab auch einfach aus dem Bauch heraus geschrieben. Du kannst es mit Sicherheit verbessern. Es soll dir nur den fehlenden Gedankenblitz geben, damit du das dann in deinem Script anwenden kannst.
 
Zuletzt bearbeitet:
Alles klar, ich werds mir morgen mal anschauen ;)
$num_seiten entspricht meínem $num_pages, oder?!

*edit*
So, habs grad mal fix geteste und es funktioniert wunderbar :)
Werd's morgen noch ein wenig umschreiben und in eine klasse verpacken - kann man ja öfter gebrauchen ;)

Thx und bye!
 
Zuletzt bearbeitet:
Eine Frage hab ich noch.
Kann man den Code auch so abändern, dass folgende Ausgabe erreicht wird.

<< 1 ... 4 5 6 ... 9 >>

Es sollen also die erste und die letzte, sowie die gerade aktuelle + die beiden direkt angrenzenden Seiten angezeitg werden.
Wie muss ich den Code von Komtur dafür abändern?
 
PHP:
<?php
$num_seiten = 14;
if(!isset($_GET['akt_seite']))
{
  $akt_seite  = 1;
}
else
{
  $aktseite = $_GET['akt_seite'];
}

$str    = "";
$punkte = false;

if($akt_seite > 2)
{
  $str = "<a href=\"$PHP_SELF?akt_seite=1\"><<</a> ";
}
if($akt_seite > 1)
{
  $str .= "<a href=\"$PHP_SELF?akt_seite=". ($akt_seite - 1) ."\"><</a> ";
}

for($i == 1;$i <= $num_seiten; $i++)
{
  if($i == $akt_seite)
  {
    $str   .= "<b>$i</b> ";
    $punkte = false;
  }
  elseif(($i == ($akt_seite-1)) && (($akt_seite-1) > 0))
  {
     $str .= "<a href=\"$PHP_SELF?akt_seite=$i\">$i</a> ";
  }
  elseif(($i == ($aktseite + 1)) && (($akt_seite+1) <= $num_seiten))
  {
     $str .= "<a href=\"$PHP_SELF?akt_seite=$i\">$i</a> ";
  }  	 	
  elseif($i == 1)
  {
    $str .= "<a href=\"$PHP_SELF?akt_seite=$i\">$i</a> ";
  }
  elseif($i == ($num_seiten))
  {
    $str .= "<a href=\"$PHP_SELF?akt_seite=$i\">$i</a> ";
  }
  elseif(($i > 2) && ($i < ($num_seiten)))
  {
    if(!$punkte)
    {
      $str .="... ";
      $punkte = true;
    }
  }
}
if($akt_seite < $num_seiten)
{
  $str .= "<a href=\"$PHP_SELF?akt_seite=". ($akt_seite + 1) ."\">></a> ";
}

if($akt_seite < ($num_seiten-1))
{
  $str .= "<a href=\"$PHP_SELF?akt_seite=$num_seiten\">>></a>";
}

echo $str;
?>

So hab das Script mal geändert. Musst einfach mal vergleichen, was da anders ist ;)
 
Zuletzt bearbeitet:
Danke für deine schnelle Antwort.
So richtig funktionierts aber noch nicht:
Wird beispielsweise einfach die seite guestbook.php (ohne die angehängte variable) aufgerufen, si sieht die ausgabe so aus:

1 ... 9 > >>

Dem Quellcode nach dürfte das eigentlich nicht passieren
PHP:
if(!isset($_GET['akt_seite'])) 
{ 
  $akt_seite  = 1; 
}

Wo liegt der Fehler.

Ein anderer Fehler ist folgender.
Ruft man Seite 4 auf, so sieht die Ausgabe so aus:

<< < 1 3 4 5 ... 9 > >>

Zwischen der 1 und der 3 müssten eigentlich "..." erscheinen - tun sie aber nicht.
 
Also das mit den Punkten ist nun wirklich nicht so schwer zu lösen.
Alter Code:
PHP:
elseif(($i > 2) && ($i < ($num_seiten))) 
  { 
    if(!$punkte) 
    { 
      $str .="... "; 
      $punkte = true; 
    } 
  }

Neuer Code:
PHP:
elseif(($i > 1) && ($i < ($num_seiten))) 
  { 
    if(!$punkte) 
    { 
      $str .="... "; 
      $punkte = true; 
    } 
  }

Aber ein bißchen mitarbeiten musst du schon mal. Hast du denn überhaupt den Code verstanden, warum ich das alles so hingeschrieben habe und was jede einzelne Anweisung macht? Weil sonst würdest du nicht fragen und könntest es selber lösen :)

Der andere Fehler liegt darin, dass ich ein _ vergessen habe.

Neuer Code:
PHP:
  elseif(($i == ($akt_seite + 1)) && (($akt_seite+1) <= $num_seiten))
  {
     $str .= "<a href=\"$PHP_SELF?akt_seite=$i\">$i</a> ";
  }
 
Zuletzt bearbeitet:
Zurück