Ich habe gerade mal ein Gästebuch auf AJAX umgestellt (zumindest die Ausgabe), auch wenn der Code noch sehr ungeschliffen (um nicht zu sagen eklig) und auch direkt auf mein System zugeschnitten ist, will ich ihn hier mal veröffentlichen, Kritik und Anregungen sind sehr willkommen!
Das Gästebuch lässt sich übrigens unter http://www.irrlicht.org/gaestebuch/Anzeigen/ bewundern.
Funktionsweise
Die Gästebuchinhalte befinden sich in der Tabelle con_guestbook in der Contenido-Datenbank.
Bei Anklicken eines Navigationslinks wird die Navigation im Hintergrund entsprechend angepasst und das canvas-div mit den entsprechenden Einträgen aus der Datenbank gefüllt.
Anforderungen:
- Contenido 4.6.8 (sollte aber ebenso mit jeder anderen Version gehen)
- HTML_AJAX-alpha aus dem PEAR-Repository (http://pear.php.net)
- Gästebuchmodul hier aus dem Forum (ggf. kann ich das Eingabemodul für das GB und das Datenbankschema gerne nachliefern)
Vorgehensweise:
- Meine System hat PEAR systemweit installiert, weshalb ich einfach nur
Code: Alles auswählen
pear install HTML_AJAX_alpha
- Anlegen des Moduls, nur Ausgabe:
Code: Alles auswählen
// AJAX-Server initialisieren
<script type='text/javascript' src='/gb_server.php?client=all&stub=gboutput'></script>
<?php
// HTML_AJAX Klasse aus PEAR laden
require_once 'HTML/AJAX/Helper.php';
?>
<script type="text/javascript">
// Fehlerausgabe
HTML_AJAX.onError = function(e) {
alert(HTML_AJAX_Util.quickPrint(e));
}
// Callback-Hash für die verwendeten Funktionen
var gbCallback = {
createnav: function(result) {
document.getElementById('gbnav-top').innerHTML = result;
document.getElementById('gbnav-bottom').innerHTML = result;
},
createentries: function(result) {
document.getElementById('canvas').innerHTML = result;
}
}
// Hilfsfunktionen
var remoteGB = new gboutput(gbCallback);
function do_createNav(client, page) {
remoteGB.createnav(client,page);
remoteGB.createentries(page);
}
// Erste Seite initialisieren
do_createNav( <?php echo $client; ?>, 1 );
</script>
<div id="gbnav-top"><a href="/front_content.php?idart=181">normale anzeige</a></div>
<div id="canvas" style="border: solid 0px black; margin: 1em; padding: 1em;"></div>
<div id="gbnav-bottom"></div>
Der Link auf die normale Anzeige im oberen Navigations-DIV ist nur für Browser, die nicht unterstützt werden, gedacht und wird beim Seitenaufruf durch die Navigation ersetzt. Nicht unterstützte Browser werden in meinem Fall auf eine normale Version des GB geleitet.
- AJAX-Serverdatei anlegen im Stammverzeichnis des Frontends (gb_server.php):
Code: Alles auswählen
<?php
session_start();
require_once 'HTML/AJAX/Server.php';
include_once ("config.php");
include_once ($contenido_path . "includes/config.php");
include_once ($contenido_path . "includes/startup.php");
cInclude("includes", "cfg_sql.inc.php");
cInclude("includes", "functions.general.php");
cInclude("includes", "functions.i18n.php");
cInclude("includes", "functions.tpl.php");
cInclude("includes", "functions.con.php");
cInclude("includes", "functions.mod.php");
cInclude("includes", "functions.api.php");
cInclude("classes", 'class.inuse.php');
cInclude("classes", 'class.user.php');
cInclude("classes", 'class.notification.php');
cInclude("classes", 'class.table.php');
class AutoServer extends HTML_AJAX_Server {
var $initMethods = true;
function initGBOutput() {
require_once( "/pfad/zum/frontend/gboutput.class.php" );
$gb = new GBOutput();
$this->registerClass($gb);
}
}
$server = new AutoServer();
$server->handleRequest();
?>
Code: Alles auswählen
class GBOutput {
var $entries_per_page = 10;
var $active_page = 1;
var $db;
function GBOutput() {
if ( !isset( $_SESSION['start_page'] ) ) {
$_SESSION['start_page'] = 0;
}
$this->db = new DB_contenido;
}
function createNav( $client, $act_page ) {
require_once 'HTML/AJAX/Helper.php';
$sql = "SELECT count(*) AS total FROM con_guestbook WHERE client=$client;";
$this->db->query($sql);
$this->db->next_record();
$num_entries = $this->db->f("total");
$num_pages = ceil( $num_entries / $this->entries_per_page );
$prev = $act_page - 1;
$next = $act_page + 1;
$nav_string = "";
if ( $act_page != 1 ) {
$nav_string .= "<a href=\"#\" onClick=\"do_createNav( $client, $prev )\">←</a> ";
}
else {
$nav_string .= "← ";
}
switch ( $act_page ) {
case 1:
$nav_string .= "1 ";
$nav_string .= "<a href=\"#\" onClick=\"do_createNav( $client, 2 )\">2</a> ";
$nav_string .= "<a href=\"#\" onClick=\"do_createNav( $client, 3 )\">3</a> ";
$nav_string .= "... ";
$nav_string .= "<a href=\"#\" onClick=\"do_createNav( $client, $num_pages )\">$num_pages</a> ";
break;
case 2:
$nav_string .= "<a href=\"#\" onClick=\"do_createNav( $client, 1 )\">1</a> ";
$nav_string .= "2 ";
$nav_string .= "<a href=\"#\" onClick=\"do_createNav( $client, 3 )\">3</a> ";
$nav_string .= "... ";
$nav_string .= "<a href=\"#\" onClick=\"do_createNav( $client, $num_pages )\">$num_pages</a> ";
break;
case 3:
$nav_string .= "<a href=\"#\" onClick=\"do_createNav( $client, 1 )\">1</a> ";
$nav_string .= "<a href=\"#\" onClick=\"do_createNav( $client, 2 )\">2</a> ";
$nav_string .= "3 ";
$nav_string .= "<a href=\"#\" onClick=\"do_createNav( $client, 4 )\">4</a> ";
$nav_string .= "... ";
$nav_string .= "<a href=\"#\" onClick=\"do_createNav( $client, $num_pages )\">$num_pages</a> ";
break;
case $num_pages-2:
$nav_string .= "<a href=\"#\" onClick=\"do_createNav( $client, 1 )\">1</a> ";
$nav_string .= "... ";
$nav_string .= "<a href=\"#\" onClick=\"do_createNav( $client, $prev )\">$prev</a> ";
$nav_string .= "$act_page ";
$nav_string .= "<a href=\"#\" onClick=\"do_createNav( $client, $next )\">$next</a> ";
$nav_string .= "<a href=\"#\" onClick=\"do_createNav( $client, $num_pages )\">$num_pages</a> ";
break;
case $num_pages-1:
$nav_string .= "<a href=\"#\" onClick=\"do_createNav( $client, 1 )\">1</a> ";
$nav_string .= "... ";
$nav_string .= "<a href=\"#\" onClick=\"do_createNav( $client, $prev )\">$prev</a> ";
$nav_string .= "$act_page ";
$nav_string .= "<a href=\"#\" onClick=\"do_createNav( $client, $next )\">$next</a> ";
break;
case $num_pages:
$pprev = $act_page - 2;
$nav_string .= "<a href=\"#\" onClick=\"do_createNav( $client, 1 )\">1</a> ";
$nav_string .= "... ";
$nav_string .= "<a href=\"#\" onClick=\"do_createNav( $client, $pprev )\">$pprev</a> ";
$nav_string .= "<a href=\"#\" onClick=\"do_createNav( $client, $prev )\">$prev</a> ";
$nav_string .= "$act_page ";
break;
default:
$nav_string .= "<a href=\"#\" onClick=\"do_createNav( $client, 1 )\">1</a> ";
$nav_string .= "... ";
$nav_string .= "<a href=\"#\" onClick=\"do_createNav( $client, $prev )\">$prev</a> ";
$nav_string .= "$act_page ";
$nav_string .= "<a href=\"#\" onClick=\"do_createNav( $client, $next )\">$next</a> ";
$nav_string .= "... ";
$nav_string .= "<a href=\"#\" onClick=\"do_createNav( $client, $num_pages )\">$num_pages</a> ";
}
if ( $act_page != $num_pages ) {
$nav_string .= "<a href=\"#\" onClick=\"do_createNav( $client, $next )\">→</a>";
}
else {
$nav_string .= "→";
}
return $nav_string;
}
function createEntries( $page ) {
$entries = "";
$start_entry = ( $page -1 ) * $this->entries_per_page;
$ent = $this->entries_per_page - 1;
$sql = "SELECT name, email, url, date, location, comments, id, active FROM con_guestbook $where order by date desc LIMIT $start_entry,$ent;";
$this->db->query($sql);
while ($this->db->next_record()) {
$entries .= "<p class=\"gb-head\"><span class=\"gb-name\">";
$entries .= "<a href=\"mailto:".$this->db->f('email')."\" class=\"gb-mail\">".$this->db->f("name")."</a>";
$entries .= "</span>";
if ($this->db->f("url") != "") {
$url = $this->db->f("url");
if ( substr($url,0,4) != "http" ) $url = "http://$url";
$entries .= "(<a href=\"".$url."\" class=\"gb-website\">".$url."</a>)";
}
$entries .= " schrieb am <span class=\"gb-date\">".date( "d.m.y", strtotime( $this->db->f('date') ) )."</span></p>";
$entries .= "<p class=\"gb-content\">".nl2br( htmlentities( strip_tags( stripslashes( $this->db->f('comments') ) ) ) )."</p>";
$entries .= "<hr class=\"gb\" />";
}
return $entries;
}
}
Debugging ist teiweise unter http://www.browserpfad.xx/gb_server.php ... b=gboutput möglich.
Viel Spass beim rumspielen, bitte Fehler melden. Danke.
Grüße,
DD