zisslaweng.de

 Home    CSS    PHP    HTML    JavaScript    Allgemein    Sitemap   exemption-filter

die Anzeige..

Für saubere Paginierung benötigt man die Angabe, wie viele Einträge hat das Gästebuch? Das erledigt get_entries(). Durch die Verwendung von session_id() und 'gb' als Parameter wird die Anzahl aller freigeschalteten Einträge und der Eintrag mit der aktuellen SID abgerufen. Jetzt ein klein bisschen Logik: welche Werte sollen gelistet werden durch die Parameter $ug (Untergrenze) und $og (Obergrenze) und die gewünschte Anzahl pro Seite $anz.

Beim erstmaligen Aufruf der Seite sind die Parameter nicht definiert, ansonsten sind sie im $_GET Array enthalten.

Diese Zeilen nach dem Code betreffend Session zu Beginn der Seite:

$gb = new GbDbMapper();
$gb_entries = $gb->get_entries(session_id(),'gb');
$entries = $gb_entries->num_rows;
$anz=5; 
if ($anz > $entries) {$tmpog = $entries;} else {$tmpog = $anz;};
$ug = isset($_GET['ug']) ? $_GET['ug'] : 0;
$og = isset($_GET['og']) ? $_GET['og'] : $tmpog;

..mit einer neuen Klasse..

Eine Überschriftszeile zur Navigation im Gästebuch und die Darstellung eines einzelnen Eintrags wieder ausgelagert in eine Klasse Html in der Datei z_htmlclass.php5. Die Klasse enthält keinen Konstruktor, wird also nicht initialisiert, deshalb weiter unter die vielleicht ungewohnte Syntax: Html::paginate() und Html::list_entry().

class Html {
  /*
   $fakt = Anzahl pro Seite $anz = Gesamtanzahl Einträge
   $act  = Aktuell $url = URL
  */
	
function paginate ($fakt,$anz,$act,$url){
  $rest = $anz % $fakt;
  $seiten = ($anz-$rest) / $fakt;
  if ( $rest > 0) {$seiten++;}
  $ret = "<div class=\"GBHEAD\">";
  for ($ii = 0 ; $ii < $seiten ; $ii++){
    $ug = $ii*$fakt;
    $og = ($ii+1)*$fakt;
    if (($ug <= $act) && ($act < $og)) $mark="class=\"act\""; 
      else $mark='';
    if ( $og > $anz){
      $ret .= "<a ".$mark."href='$url?ug=$ug
        &og=$anz'>‹".($ii+1)."›</a>";
    } else {
      $ret .= "<a ".$mark." href='$url?ug=$ug
        &og=$og'>‹".($ii+1)."›</a> ";
    }
  }
  $ret .= "</div>\n";
  return $ret;
  }

function list_entry($erg){
  $ret = '<div class="GB"><div>Am '.$erg->date.'schrieb<br><i>'.
     htmlentities($erg->name).'</i><br>'.
     htmlentities($erg->ort).'</div>';
  $ret .= '<span>';
  if ($erg->mail != ''){
    $ret .= '<script language="JavaScript" 
      type="text/javascript">DeCrypt(\''.
      encryptmailadr($erg->mail).'\');</script>';
  }
  $ret .= '<br>'.$erg->url.'</span>';
  $ret .= '<span class="tmlistsep"></span>';
  $ret .= '<p>' .nl2br(htmlentities($erg->comment)).
    '</p></div>';
  $ret .= "\n"; 	
  return $ret;		
}
}

Die Funktion paginate() generiert die Überschriftszeile (ein div-Element) mit den Links und Parametern $ug und $og zu jeweils $anz Einträgen, die Funktion list_entry() erzeugt 2 Tabellenzeilen aus den Gästebuch-Daten. Hier wird auch die unter Javascript von mir favorisierte Methode der Codierung der Mailadressen verwendet.

.. und nur noch wenig zu tun

Die Funktion get_entries() (siehe oben) macht aber mehr. Die Datenbank liest die selektierten Werte in einen internen Puffer, die Anzahl der Einträge war sozusagen ein Abfallprodukt. So stehen die Daten bereits zur Abholung bereit. Und die Klasse BaseDbMapper enthält die einfachen Methoden data_seek() und fetch_o(), die ja die Klasse GbDbMapper erweitert.

Der Aufruf innerhalb des HTML Codes nach dieser Vorarbeit wieder ganz kurz:

 echo Html::paginate($anz,$entries,$ug,$_SERVER['PHP_SELF']);
 $gb_entries->data_seek($ug);
 for ($ii = $ug; $ii < $og ; $ii++) {
   echo Html::list_entry($gb_entries->fetch_object());
 }

Nicht viel dazu zu sagen: data_seek() positioniert den Lesezeiger innerhalb der Datenbank-Abfrage. Die Datenbankeinträge abholen mittels fetch_object(), = ein Objekt mit den Daten eines Eintrags, das gleich der Funktion Html::list_entry() übergeben wird und die Einträge listet.

 Zu welchem Zweck hier eine SessionID?
Durch das Ablegen der SID in der Datenbank und dem entsprechenden select-string in der Abfrage ist dieser Eintrag nur für den Eintragenden selbst sichtbar. Um ihn für das Web freizugeben, wird das Feld in der Datenbank gelöscht, also auf den Wert "NULL" gesetzt.

Falls Ihnen das jetzt zu schnell ging: Alle Dateien, einschließlich der beiden in Frage kommenden HTML-Seiten in einem tar-Archiv hier zum download und zum studieren. Gästebuch/Kommentar in der Version vom 01.08.11 17:10
Logo