AJAX-Gästebuch

Gesperrt
zapalotta
Beiträge: 24
Registriert: Do 7. Okt 2004, 09:31
Kontaktdaten:

AJAX-Gästebuch

Beitrag von zapalotta »

Jaja, jetzt hat mich das Buzzword "AJAX" auch erwischt.

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
zur Installation verwenden musste. PEAR Pfade sind auch systemweit gesetzt.

- 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>
Die gbnav-top und gbnav-bottom DIVs werden übrigens durch die Navigation ersetzt, während das canvas DIV durch den eigentlichen Inhalt ersetzt wird.
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();

?>

- Eigentliche Gästebuchbearbeitungsklasse im Stammverzeichnis des Frontends anlegen:

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 )\">&larr;</a>&nbsp;";
    }
    else {
      $nav_string .= "&larr;&nbsp;";
    }
    switch ( $act_page ) {
    case 1:
      $nav_string .= "1&nbsp;";
      $nav_string .= "<a href=\"#\" onClick=\"do_createNav( $client, 2 )\">2</a>&nbsp;";
      $nav_string .= "<a href=\"#\" onClick=\"do_createNav( $client, 3 )\">3</a>&nbsp;";
      $nav_string .= "...&nbsp;";
      $nav_string .= "<a href=\"#\" onClick=\"do_createNav( $client, $num_pages )\">$num_pages</a>&nbsp;";
      break;
    case 2:
      $nav_string .= "<a href=\"#\" onClick=\"do_createNav( $client, 1 )\">1</a>&nbsp;";
      $nav_string .= "2&nbsp;";
      $nav_string .= "<a href=\"#\" onClick=\"do_createNav( $client, 3 )\">3</a>&nbsp;";
      $nav_string .= "...&nbsp;";
      $nav_string .= "<a href=\"#\" onClick=\"do_createNav( $client, $num_pages )\">$num_pages</a>&nbsp;";
      break;
    case 3:
      $nav_string .= "<a href=\"#\" onClick=\"do_createNav( $client, 1 )\">1</a>&nbsp;";
      $nav_string .= "<a href=\"#\" onClick=\"do_createNav( $client, 2 )\">2</a>&nbsp;";
      $nav_string .= "3&nbsp;";
      $nav_string .= "<a href=\"#\" onClick=\"do_createNav( $client, 4 )\">4</a>&nbsp;";
      $nav_string .= "...&nbsp;";
      $nav_string .= "<a href=\"#\" onClick=\"do_createNav( $client, $num_pages )\">$num_pages</a>&nbsp;";
      break;
    case $num_pages-2:
      $nav_string .= "<a href=\"#\" onClick=\"do_createNav( $client, 1 )\">1</a>&nbsp;";
      $nav_string .= "...&nbsp;";
      $nav_string .= "<a href=\"#\" onClick=\"do_createNav( $client, $prev )\">$prev</a>&nbsp;";
      $nav_string .= "$act_page&nbsp;";
      $nav_string .= "<a href=\"#\" onClick=\"do_createNav( $client, $next )\">$next</a>&nbsp;";
      $nav_string .= "<a href=\"#\" onClick=\"do_createNav( $client, $num_pages )\">$num_pages</a>&nbsp;";
      break;
    case $num_pages-1:
      $nav_string .= "<a href=\"#\" onClick=\"do_createNav( $client, 1 )\">1</a>&nbsp;";
      $nav_string .= "...&nbsp;";
      $nav_string .= "<a href=\"#\" onClick=\"do_createNav( $client, $prev )\">$prev</a>&nbsp;";
      $nav_string .= "$act_page&nbsp;";
      $nav_string .= "<a href=\"#\" onClick=\"do_createNav( $client, $next )\">$next</a>&nbsp;";
      break;
   case $num_pages:
      $pprev = $act_page - 2;
      $nav_string .= "<a href=\"#\" onClick=\"do_createNav( $client, 1 )\">1</a>&nbsp;";
      $nav_string .= "...&nbsp;";
      $nav_string .= "<a href=\"#\" onClick=\"do_createNav( $client, $pprev )\">$pprev</a>&nbsp;";
      $nav_string .= "<a href=\"#\" onClick=\"do_createNav( $client, $prev )\">$prev</a>&nbsp;";
      $nav_string .= "$act_page&nbsp;";
      break;
    default:
      $nav_string .= "<a href=\"#\" onClick=\"do_createNav( $client, 1 )\">1</a>&nbsp;";
      $nav_string .= "...&nbsp;";
      $nav_string .= "<a href=\"#\" onClick=\"do_createNav( $client, $prev )\">$prev</a>&nbsp;";
      $nav_string .= "$act_page&nbsp;";
      $nav_string .= "<a href=\"#\" onClick=\"do_createNav( $client, $next )\">$next</a>&nbsp;";
      $nav_string .= "...&nbsp;";
      $nav_string .= "<a href=\"#\" onClick=\"do_createNav( $client, $num_pages )\">$num_pages</a>&nbsp;";
    }

    if ( $act_page != $num_pages ) {
      $nav_string .= "<a href=\"#\" onClick=\"do_createNav( $client, $next )\">&rarr;</a>";
    }
    else {
      $nav_string .= "&rarr;";
    }
    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;
  }
}
Das war's auch schon.

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
Maribeauli

Re: AJAX-Gästebuch

Beitrag von Maribeauli »

zapalotta hat geschrieben: Viel Spass beim rumspielen, bitte Fehler melden. Danke.
Grüße,
DD
Nun gut, hier der erste Fehler.
Wenn ich es hier :
dynamic elements and interaction via the DOM (Document Object Model),
und hier
On IE it is a built in ActiveX object; in Firefox, Safari and most other browsers it's a native JavaScript object.
richtig interpretiere muß beim IE AxtiveX aktiviert sein für die Anzeige.
AktivX ist gefährlich, selbst Microsoft hat in einigen Sicherheits-Veröffentlichungen empfohlen AktiveX bis auf weiteres zu deaktivieren.

Mit XP und SP2 kommt zwar ein ActiveX-Manager, aber wer kennt den schon als "Normal-Dau" und vor allem es ist trotzdem nicht sicher.

Mit FF sehe ich ein Gästebuch, mit IE kommt, wenn ich Java-Script zulassen "Seite nicht gefunden" und wenn ich Java-Script _nicht_ zulasse nur eine leere Seite.

Mein persönliches Fazit: Alles was auf ActiveX bassiert muß ich nicht haben oder ansehen 8)
zapalotta
Beiträge: 24
Registriert: Do 7. Okt 2004, 09:31
Kontaktdaten:

Hmm

Beitrag von zapalotta »

Naja, Active X (via JScript) hat wirklich einige Lücken, die hat aber (in anderen Fällen) die Gecko-Implementierung (Firefox, Mozilla...) auch genügend, weshalb es eh immer sinnvoll ist, das abzuschalten, unabhängig vom Browser (Bitte nicht als Flamewar auffassen!!!).

Genau aus dem Grund habe ich alternativ das normale Gästebuch, das bei ausgeschaltetem Scripting verwendet wird.

Ich habe das Ganze in den folgenden Browsern getestet:

IE 7 Beta mit und ohne Scripting
IE 6 auf XP SP2 mit und ohne Scripting
IE 6 auf XP SP1 mit und ohne Scripting
Firefox 1.5/XP mit ein- und ausgeschaltetem JavaScript
DeerPark Alpha 2 mit ein- und ausgeschaltetem JavaScript
Safari 2.0.3 mit ein- und ausgeschaltetem JavaScript
Konqueror aus dem CVS

Es wäre nett, wenn Du mir ein paar weitere Informationen geben könntest, wie sich die leere Seite bemerkbar macht.

Danke,
Grüße,
DD
Maribeauli

Re: Hmm

Beitrag von Maribeauli »

zapalotta hat geschrieben:Es wäre nett, wenn Du mir ein paar weitere Informationen geben könntest, wie sich die leere Seite bemerkbar macht.

Danke,
Grüße,
DD
Es geht im folgenden nur um die Darstellung im IE6 mit SP2,
mit komplett deaktiviertem ActiveX,
Java-Script mit Eingabeaufforderung-

Wenn ich Java-Script generell ablehne kommt dieses Bild:
http://i3.tinypic.com/vo0bxj.jpg

Wenn ich die 1. Eingabeaufforderung von Java-Script zulasse kommt das hier:
http://i3.tinypic.com/vo0c37.jpg

und danach die Standard-Fehlerseite von Windows.

@zapalotta,
Ich möchte dein Beitrag bzw. dein Modul nicht weiter mit meinen Beiträgen stören,
ich habe eine Allergie gegen AxtiveX und habe früher noch ganz anders über AxtiveX hergezogen.
Microsoft hat am Anfang ActiveX angepriesen als:
So schnell wurde noch nie Applicationen als Web-Anwendungen ausgeführt, durch die Integration ins Betriebsystem haben sie alle Freiheiten ...
Und VB für ActiveX kostenlos zum Download bereitgestellt um diese Applicationen zu fördern.

Und genau diese "Freiheiten" sind es die es so gefährlich machen,
und besonders wenn Java-Script/JScript noch im Spiel ist.
Gesperrt