PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PHP: Blätterfunktion


tomtom
2005-08-01, 14:50:32
Hallo Leute!

Habe eine kleine Function geschrieben, die mir (nachdem die Anzahl der Verfügbaren Datensätze aus der DB-Tabelle ausgelesen wurde) berechnet, auf wieviele Seiten die Datensätze aufgeteilt werden sollten (zwecks Überblick und Performance) -> eine Blätterfunktion also.

Die funktioniert auch ganz gut. Allerdings hab ich ein Problem wo meine Logik versagt :| :
Wenn ich zu viele Datensätze habe (sagen wir mal Größenordung an die 2000) dann sieht die Seitenberechnung nicht so schön aus; bsp: 1,2,3....499,500)
deshalb hätte ich gerne, dass auf der jweiligen Seite, auf der ich mich befinde, davor und danach max. 3 Seiten angezeigt werden: 7 8 9 10 11 12 13

Hoffe, ihr versteht was ich meine. Hier mal mein Code:

function calcPages($num_of_results)
{
$results_per_page = 10;
$num_of_pages = $num_of_results%$results_per_page;

if ($num_of_pages > 0)
{
$x = 1 - ($num_of_pages/10);
$num_of_pages = ($num_of_results/$results_per_page) + $x;
}
else
{
$num_of_pages = $num_of_results/$results_per_page;
}
//echo("F&uuml;r " . $num_of_results . " Eintr&auml;ge bei " . $results_per_page . " Feeds/Seite werden " . $num_of_pages . " Seiten ben&ouml;tigt!<br><br>");

echo("<p class=\"pages\">");
for ($i=1;$i<=$num_of_pages;$i++)
{
$cnt = $i*$results_per_page;
if ($i == 1)
{
$lower=0;
$upper=$results_per_page;
$previous_page = "";
}
else
{
$lower = $lower + $results_per_page;
$upper = $results_per_page;
$next_page = "n&auml;chste Seite";
}

if ($i == $num_of_pages)
{
$upper = $cnt - ($cnt - $num_of_results);
$next_page = "";
}

echo("<a class=\"std3\" href=\"portal.php?go=showfeeds&cat=$cat&lower=$lower&upper=$upper\">" . $i . "</a> | ");
}
echo("</p>");
}


$num_of_results = Anzahl der Datensätze (also mysql_num_rows)
$lower und $upper werden für das LIMIT im Sql Statement benötigt...

Hoffe ihr wisst was ich meine und könnt mir helfen - wäre jedenfalls verdammt super :)

MfG, terminator2k4

Flipper
2005-08-01, 16:03:17
da jetzt genau den Quelltext durchgehen würd mir zu lang dauern (bei den unkommentierten $x, $cnt und so).
Aber anhand deiner Input-Variable $num_of_results frage ich mich, wie du die aktuelle Seite bestimmst? ah, ok - mit $upper und $lower.

Hier meine - irgendwie übersichtlichere - Blätterfunktion, die zwar das mit den 3 Seiten vor/zurück nicht implementiert hat, in der es aber nicht schwer wäre das einzubauen:
$page_amount = ceil($qry_amount/$perpage); // page_amount = gesamte Seiten-Anzahl, qry_amount = gesamte Newsanzahl, perpage = News-Menge pro Seite
echo "Seite: ";
for ($i = 1; $i <= $page_amount; $i++) {
if ($i == $showpage) { // showpage = aktuelle Seite
echo "<font color=\"blue\"><b>$i</b></font>&nbsp;"; // aktuelle Seite wird farbig dargestellt und ist kein Link
}
else echo "<a href=\"$PHP_SELF?showpage=$i\">$i</a>&nbsp;\n";
}

da würd sich das dann relativ einfach mit einer Änderung der for-Schleife lösen lassen. Nur so als pseudo-code zu verstehen:

$from = $showpage-3;
if ($from <0) $from=0; // zum vermeiden von "Seite -1" etc.
$to = $showpage+3;
if ($to > $page_amount) $to = $page_amount;
for ($i = $from; $i <= $to; $i++) {
[...]
}

tomtom
2005-08-01, 19:20:31
Danke, werd mir deinen Code mal anschauen :D

Das mit der Seitenberechnung ist ein wichtiger Punkt, denn bei 100000 Datensätzen (kommen bei dem Skript locker vor dass ich programmieren musste) wirds sonst etwas unübersichtlich wenn 10000 Seitenzahlen am Ende der Seite stehen - die Blätterfunktion funktioniert an sich ja :)

Habs nun fast fertig...irgendwo ist noch n kleiner Hund drin wie man so schön sagt, aber mal schauen!

Danke schon mal,
MfG terminator2k3

Nase
2005-08-01, 19:57:26
Ich habe sowas vor einiger Zeit auch mal geschrieben. Ist jetzt vielleicht nicht das Über-Script, aber es funktioniert allemal so, wie ich das will. Ist sogar ein bisschen dokumentiert :D.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

<html>
<head>
<title>Paging</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<link rel="stylesheet" type="text/css" href="default.css" title="default">
</head>
<body style="margin: 10px; padding: 10px;">

<?php

$as = 5; //as = Gesamtanzahl der angezeigten Seiten in der Navigation
$proSeite = 12; // proSeite = Anzahl der dargestellten Eintraege pro Seite
$eintraege = 654; // eintraege = Anzahl der vorhandenen Eintraege
$seitenzahl = ceil($eintraege / $proSeite);
$seite = $_GET['seite']; // seite = die aktuell angezeigte Seite mit den Eintraegen
$seite = $seite ? $seite : 1;

$foo = ($as - 1) / 2;
$foo = round($foo, 0);
$bar = 0;


$start = $seite - $foo;
if ($start < 1) {
$bar = 1 - $start;
$start = 1;
}


$ende = $seite + $foo + $bar;
if ($ende > $seitenzahl) {
$bar = $ende - $seitenzahl;
$start = $start - $bar > 1 ? $start - $bar : 1;
$ende = $seitenzahl;
}


// AUSGABE
$paging_obj = '<div class="paging"><table border="0" cellpadding="0" cellspacing="1"><tr>';
$paging_obj .= '<td style="padding: 0 5px;"> Seite <b>' . $seite . '</b> von <b>' . $seitenzahl . '</b> </td>';

if($seite - $foo > 1) {
$paging_obj .= '<td> <a href="paging.php?seite=1" title="Zur ersten Seite springen">&laquo; Erste</a> </td>';
}

$zurueck = $seite - 1;
if($zurueck > 0) {
$paging_obj .= '<td> <a href="paging.php?seite='. $zurueck .'" title="Eine Seite zur&uuml;ck">&laquo;</a> </td>';
}

for ($i = $start; $i <= $ende; $i++) {
if ($i == $seite)
$paging_obj .= '<td class="aktuell">&nbsp;' . $i . '&nbsp;</td>';
else
$paging_obj .= '<td> <a href="paging.php?seite='. $i .'" title="Zur '. $i .'. Seite springen">' . $i . '</a> </td>';
}

$weiter = $seite + 1;
if($weiter <= $seitenzahl) {
$paging_obj .= '<td> <a href="paging.php?seite='. $weiter .'" title="Eine Seite weiter">&raquo;</a> </td>';
}

if($seite < $seitenzahl - $foo - $bar) {
$paging_obj .= '<td> <a href="paging.php?seite=' . $seitenzahl . '" title="Zur letzten Seite springen">Letzte &raquo;</a> </td>';
}

$paging_obj .= '</tr></table></div>';

echo $paging_obj;
?>

</body>
</html>

Kinman
2005-08-02, 01:26:29
hab jetzt nur ganz kurz geschaut, aber ich glaube i der zeile kannst das machen ;)

for ($i=1;$i<=$num_of_pages;$i++)

mfg Kinman

EDIT:
Oder du gibst immer die ID des ersten Datensates auf der Seite mit. Anhand der Datensätze / Page & Anzahl aller Datensätze kannst Du eine gut funktionierende Blätterfunktion baun.
Wenn ich es Dir genauer erklären soll: TS oder Telefon ;)

mfg Kinman

tomtom
2005-08-02, 10:25:24
hab jetzt nur ganz kurz geschaut, aber ich glaube i der zeile kannst das machen ;)

for ($i=1;$i<=$num_of_pages;$i++)


Jo, war hier zu machen... :)

MfG

Kinman
2005-08-02, 22:12:24
wieder mal ein beweis das man auch nach 14 Stunden des wachseins noch denken kann ;)

mfg Kinman