Aktuelle Version: 1.9.2
Bitte auch dies beachten:
- http://www.contenido.org/forum/viewtopi ... 1778#71778
- Es hatte sich in der Dokumentation ein Fehler eingeschlichen: die Formatierung des Datums wird nicht mit date(), sondern mit strftime() vorgenommen.
Folgende Funktionen sind dabei beim Eintragsmodul umgesetzt:
- Eintragsfelder: Name, E-Mail, URL, Bild, Eintrag und 3 freie Textfelder
- Das Bildeingabefeld liest ein über die Templatekonfiguration festgelegtes Verzeichnis aus.
- Ebenso wird mit den Smilies/Emoticons verfahren, die per Javascript ins Eintragfeld eingefügt werden.
- doppeltes Abschicken von Einträgen wird durch Javascript unterbunden
- Mehrfacheinträge können durch Cookies (minutengenau einstellbar) verhindert werden
- die Ausgabe der Felder des Eintragsformulars kann HTML oder XHTML-valide erfolgen, dies kann man in der Templatekonfiguration schalten
- mehrere BBCode-Schalflächen können benutzt werden (fett, kursiv, unterstrichen, URL und E-Mail)
- die Verwendung von BBCode und Smilies kann ein- und ausgeschaltet werden
- Emailbenachrichtigung bei neuen Einträgen
- Einträge direkt sichtbar oder erst nach Freischaltung
- normale oder extended Templateklasse
- Anzahl der Einträge pro Seite
- Navigation zwischen den Einzelseiten in Form von "Seite 1 2 3" oder "Einträge 1-10 11-20 21-30"
- Linktexte "vor" und "zurück" sind einstellbar
- lange Texte können nach x Zeichen umgebrochen werden
- Spracheinstellung für das Datumsformat und 2 formatierbare Datumsfelder
- normale oder extended Templateklasse
http://spielwiese.contenido-tutorials.de/vpguestbook/
Alle Informationen zum Modul, Antworten auf häufige Fragen und den Download des Moduls gibt es hier:
http://www.contenido-tutorials.de/module/vpguestbook/
Die Installation und die Anpassung wird in einem PDF, das im Download vorhanden ist, erläutert.
Das Modul bietet zur Zeit keine Möglichkeit, Spam abzuwehren. Allerdings gibt es dafür eine Lösung, die nicht nur für ein Modul Spam abwehren kann:
http://www.contenido.org/forum/viewtopic.php?t=13848
Gruß und viel Spaß
Ing
Wichtig: folgenden Moduloutput für das Ausgabe-Modul verwenden
Code: Alles auswählen
<?php
/***********************************************
* CONTENIDO MODUL - OUTPUT
*
* Modulname : vpGuestbook 1.9.2 - Ausgabe
* Author : Ingo van Peeren
* Copyright : Ingo van Peeren (ingo@van-peeren.de)
* Created : 2005-03-14
* Modified : 2008-02-05
************************************************/
// CMS_VARs initialisieren
$spez_client = "CMS_VALUE[1]";
$spez_lang = "CMS_VALUE[2]";
$tpl_datei = "CMS_VALUE[3]";
$tpl_art = "CMS_VALUE[4]";
$bilderpfad = "CMS_VALUE[5]";
$eintraege_pro_seite = "CMS_VALUE[6]";
$seitennav_art = "CMS_VALUE[7]";
$dateformat1 = "CMS_VALUE[8]";
$dateformat2 = "CMS_VALUE[9]";
$locale = "CMS_VALUE[10]";
$wrap_length = "CMS_VALUE[11]";
$link_vor = "CMS_VALUE[12]";
$link_zurueck = "CMS_VALUE[13]";
$max_seiten = "CMS_VALUE[14]";
// CMS_VARs initialisieren Ende
// eXtended-Template-Klasse (von swelpot) einbinden
// zur Verwendung siehe:
// http://www.contenido.org/forum/viewtopic.php?t=5851
if ($tpl_art == "extended") cInclude('classes', 'class.ExtendedTemplate.php');
else cInclude('classes', 'class.template.php');
$edit_url = "front_content.php?changeview=edit&client=$client&lang=$lang&action=con_editart&idartlang=$idartlang&idart=$idart&idcat=$idcat&contenido=" . $sess->id;
// locale auf ausgewählten Wert setzen
setlocale (LC_ALL, $locale);
// DB-Verbindung konfigurieren
$cfg["tab"]["vpguestbook"] = $cfg['sql']['sqlprefix']."_vpguestbook";
$db = new DB_Contenido;
// Funktionen
function htmlwrap($str, $width = 60, $break = "\n", $nobreak = "", $nobr = "pre", $utf = false) {
// Split HTML content into an array delimited by < and >
// The flags save the delimeters and remove empty variables
$content = preg_split("/([<>])/", $str, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
// Transform protected element lists into arrays
$nobreak = explode(" ", $nobreak);
$nobr = explode(" ", $nobr);
// Variable setup
$intag = false;
$innbk = array();
$innbr = array();
$drain = "";
$utf = ($utf) ? "u" : "";
// List of characters it is "safe" to insert line-breaks at
// Do not add ampersand (&) as it will mess up HTML Entities
// It is not necessary to add < and >
$lbrks = "/?!%)-}]\\\"':;";
// We use \r for adding <br /> in the right spots so just switch to \n
if ($break == "\r") $break = "\n";
while (list(, $value) = each($content)) {
switch ($value) {
// If a < is encountered, set the "in-tag" flag
case "<": $intag = true; break;
// If a > is encountered, remove the flag
case ">": $intag = false; break;
default:
// If we are currently within a tag...
if ($intag) {
// If the first character is not a / then this is an opening tag
if ($value{0} != "/") {
// Collect the tag name
preg_match("/^(.*?)(\s|$)/$utf", $value, $t);
// If this is a protected element, activate the associated protection flag
if ((!count($innbk) && in_array($t[1], $nobreak)) || in_array($t[1], $innbk)) $innbk[] = $t[1];
if ((!count($innbr) && in_array($t[1], $nobr)) || in_array($t[1], $innbr)) $innbr[] = $t[1];
// Otherwise this is a closing tag
} else {
// If this is a closing tag for a protected element, unset the flag
if (in_array(substr($value, 1), $innbk)) unset($innbk[count($innbk)]);
if (in_array(substr($value, 1), $innbr)) unset($innbr[count($innbr)]);
}
// Else if we're outside any tags...
} else if ($value) {
// If unprotected, remove all existing \r, replace all existing \n with \r
if (!count($innbr)) $value = str_replace("\n", "\r", str_replace("\r", "", $value));
// If unprotected, enter the line-break loop
if (!count($innbk)) {
do {
$store = $value;
// Find the first stretch of characters over the $width limit
if (preg_match("/^(.*?\s|^)(([^\s&]|&(\w{2,5}|#\d{2,4});){".$width."})(?!(".preg_quote($break, "/")."|\s))(.*)$/s$utf", $value, $match)) {
// Determine the last "safe line-break" character within this match
for ($x = 0, $ledge = 0; $x < strlen($lbrks); $x++) $ledge = max($ledge, strrpos($match[2], $lbrks{$x}));
if (!$ledge) $ledge = strlen($match[2]) - 1;
// Insert the modified string
$value = $match[1].substr($match[2], 0, $ledge + 1).$break.substr($match[2], $ledge + 1).$match[6];
}
// Loop while overlimit strings are still being found
} while ($store != $value);
}
// If unprotected, replace all \r with <br />\n to finish
if (!count($innbr)) $value = str_replace("\r", "<br />\n", $value);
}
}
// Send the modified segment down the drain
$drain .= $value;
}
// Return contents of the drain
return $drain;
}
function toggle_active ($entry) {
global $db, $cfg;
$sql = "UPDATE ".$cfg["tab"]["vpguestbook"]." SET active = '1' WHERE id='$entry'";
$db->query($sql);
}
function toggle_inactive ($entry) {
global $db, $cfg;
$sql = "UPDATE ".$cfg["tab"]["vpguestbook"]." SET active = '0' WHERE id='$entry'";
$db->query($sql);
}
function eintrag_loeschen ($entry) {
global $db, $cfg;
$sql = "DELETE FROM ".$cfg["tab"]["vpguestbook"]." WHERE id='$entry'";
$db->query($sql);
}
function eintraege_zaehlen () {
global $db, $cfg, $client;
$sql = "SELECT COUNT(*) as anzahl FROM ".$cfg["tab"]["vpguestbook"]." WHERE client=$client AND active=1";
$db->query($sql);
$db->next_record();
return $db->f("anzahl");
}
function eintraege_auslesen ($start, $anzahl) {
global $db, $cfg, $client, $lang, $idart, $spez_client, $spez_lang, $edit;
if ($edit && empty($_GET['edit'])) $where = "WHERE 1";
else $where = "WHERE active=1";
if ($spez_client) $where .= " AND client=$client";
if ($spez_lang) $where .= " AND lang=$lang";
$sql = "SELECT id, active, name, email, url, entry, image, comment, iphost, user1, user2, user3, UNIX_TIMESTAMP(date) as datum FROM ".$cfg["tab"]["vpguestbook"]." $where ORDER BY date DESC LIMIT $start, $anzahl";
$db->query($sql);
$eintraege = array();
$i = 0;
while ($db->next_record()) {
$eintraege[$i]['id'] = $db->f("id");
$eintraege[$i]['active'] = $db->f("active");
$eintraege[$i]['name'] = $db->f("name");
$eintraege[$i]['email'] = $db->f("email");
$eintraege[$i]['url'] = $db->f("url");
$eintraege[$i]['entry'] = $db->f("entry");
$eintraege[$i]['image'] = $db->f("image");
$eintraege[$i]['comment'] = $db->f("comment");
$eintraege[$i]['iphost'] = $db->f("iphost");
$eintraege[$i]['user1'] = $db->f("user1");
$eintraege[$i]['user2'] = $db->f("user2");
$eintraege[$i]['user3'] = $db->f("user3");
$eintraege[$i]['date'] = $db->f("datum");
$i++;
}
return $eintraege;
}
function vpgb_navigation ($start, $eintraege_pro_seite, $anzahl_eintraege, $art = 1) {
global $link_vor, $link_zurueck, $idcat, $idcatart, $max_seiten;
$hier = "front_content.php?idcatart=" . $idcatart;
$vpgb_nav = "";
if ($start > 0) {
$vpgb_nav .= "<a href=\"" . $hier . "&start=" . ($start - $eintraege_pro_seite) . "\">" . $link_zurueck . "</a>";
}
if ($anzahl_eintraege > $eintraege_pro_seite) {
$anzahl_seiten = ceil($anzahl_eintraege / $eintraege_pro_seite);
if (($max_seiten == "") || ($max_seiten > $anzahl_seiten)) {
for ($h = 1; $h <= $anzahl_seiten; $h++) {
$hstart = ($h - 1) * $eintraege_pro_seite;
if ($art == 1) {
if ($h == $anzahl_seiten) {
if ($anzahl_eintraege > ($hstart + 1)) $htext = ($hstart + 1) . "-" . $anzahl_eintraege;
else $htext = $anzahl_eintraege;
}
else $htext = ($hstart + 1) . "-" . ($hstart + $eintraege_pro_seite);
}
else $htext = $h;
if ($hstart == $start) $vpgb_nav .= " <a class=\"vpgb_aktiv\" href=\"" . $hier . "&start=" . $hstart . "\">" . $htext . "</a>";
else $vpgb_nav .= " <a href=\"" . $hier . "&start=" . $hstart . "\">" . $htext . "</a>";
}
}
else {
for ($h = 1; $h <= $anzahl_seiten; $h++) {
$hstart = ($h - 1) * $eintraege_pro_seite;
if ($art == 1) {
if ($h == $anzahl_seiten) {
if ($anzahl_eintraege > ($hstart + 1)) $htext = ($hstart + 1) . "-" . $anzahl_eintraege;
else $htext = $anzahl_eintraege;
}
else $htext = ($hstart + 1) . "-" . ($hstart + $eintraege_pro_seite);
}
else $htext = $h;
if (($hstart < $eintraege_pro_seite * 2) || ($hstart > (($anzahl_seiten - 3) * $eintraege_pro_seite)) || (($hstart > ($start - ($eintraege_pro_seite * 2))) && ($hstart < ($start + ($eintraege_pro_seite * 2))))) {
if ($hstart == $start) $vpgb_nav .= " <a class=\"vpgb_aktiv\" href=\"" . $hier . "&start=" . $hstart . "\">" . $htext . "</a>";
else $vpgb_nav .= " <a href=\"" . $hier . "&start=" . $hstart . "\">" . $htext . "</a>";
}
else $vpgb_nav .= "###";
}
}
}
if (($start + $eintraege_pro_seite) < $anzahl_eintraege) {
$vpgb_nav .= " <a href=\"" . $hier . "&start=" . ($start + $eintraege_pro_seite) . "\">" . $link_vor . "</a>";
}
$vpgb_nav = preg_replace("/(\#+)/", " <span class=\"vpgb_punkte\">…</span>", $vpgb_nav);
return $vpgb_nav;
}
function edit_comment ($entry_id, $new_entry, $type) {
global $db, $cfg, $client;
if ($type == "delete") {
$sql = "UPDATE ".$cfg["tab"]["vpguestbook"]." SET comment = '' WHERE id='$entry_id'";
$db->query($sql);
}
else {
$sql = "UPDATE ".$cfg["tab"]["vpguestbook"]." SET comment = '$new_entry' WHERE id='$entry_id'";
$db->query($sql);
}
}
// Funktionen Ende
$iEntry = (int)$_GET['entry'];
if ($edit && empty($_GET['edit'])) {
if ($_GET['toggle_active'] == "yes") toggle_active($iEntry);
if ($_GET['toggle_inactive'] == "yes") toggle_inactive($iEntry);
if ($_GET['delete'] == "yes") eintrag_loeschen($iEntry);
if ($_POST['edit_comment']) edit_comment($iEntry, $_POST['kommentar'], "edit");
if ($_POST['delete_comment']) edit_comment($iEntry, $_POST['kommentar'], "delete");
}
if (! $_GET['start']) $start = 0;
else $start = (int)$_GET['start'];
// Einträge
$anzahl_eintraege = eintraege_zaehlen();
if ($edit && empty($_GET['edit'])) {
$eintraege = eintraege_auslesen(0, 10000);
$seitennavigation = "";
}
else {
$eintraege = eintraege_auslesen($start, $eintraege_pro_seite);
if ($seitennav_art == 1) $seitennavigation = vpgb_navigation($start, $eintraege_pro_seite, $anzahl_eintraege, 1);
else $seitennavigation = vpgb_navigation($start, $eintraege_pro_seite, $anzahl_eintraege, 0);
}
if ($tpl_art == "extended") $tpl = new ExtendedTemplate();
else $tpl = new Template;
$tpl->reset();
$tpl->set('s', 'EINTRAEGE', $anzahl_eintraege);
$tpl->set('s', 'SEITENNAVIGATION', $seitennavigation);
foreach ($eintraege as $eintrag) {
if ($edit && empty($_GET['edit'])) {
$tpl->set('d', 'EDIT', "1");
if ($eintrag['active']) $adminlinks = "<a href=\"" . $edit_url . "&toggle_inactive=yes&entry=" . $eintrag['id'] . "\"><img src=\"" . $cfg['path']['contenido_fullhtml'] . "images/online.gif\" width=\"11\" height=\"12\" border=\"0\" title=\"Offline schalten\" alt=\"Offline schalten\"></a>";
else $adminlinks = "<a href=\"" . $edit_url . "&toggle_active=yes&entry=" . $eintrag['id'] . "\"><img src=\"" . $cfg['path']['contenido_fullhtml'] . "images/offline.gif\" width=\"11\" height=\"12\" border=\"0\" title=\"Online schalten\" alt=\"Online schalten\"></a>";
$adminlinks .= '<a title="Modul löschen" href="' . $edit_url . '&delete=yes&entry=' . $eintrag['id'] . '" onClick="return confirm(\'Wollen Sie den Gästebucheintrag von ' . $eintrag['name'] . ' wirklich löschen?\')" ><img src="' . $cfg['path']['contenido_fullhtml'] . 'images/delete.gif" border="0" title="Eintrag löschen" alt="Eintrag löschen"></a>';
$comment = "<form action=\"" . $edit_url . "&entry=" . $eintrag['id'] . "\" method=\"post\">";
$comment .= "<textarea name=\"kommentar\">" . htmlentities($eintrag['comment'], ENT_QUOTES) . "</textarea><input type=\"submit\" name=\"edit_comment\" value=\"ändern\"> <input type=\"submit\" name=\"delete_comment\" value=\"löschen\">";
$comment .= "</form>";
}
else {
$comment = htmlwrap(htmlentities($eintrag['comment'], ENT_QUOTES), $wrap_length, " ");
}
$tpl->set('d', 'NAME', $eintrag['name']);
$tpl->set('d', 'EMAIL', $eintrag['email']);
$tpl->set('d', 'URL', $eintrag['url']);
$tpl->set('d', 'ENTRY', htmlwrap($eintrag['entry'], $wrap_length, " "));
$tpl->set('d', 'COMMENT', $comment);
$tpl->set('d', 'USER1', $eintrag['user1']);
$tpl->set('d', 'USER2', $eintrag['user2']);
$tpl->set('d', 'USER3', $eintrag['user3']);
$tpl->set('d', 'IPHOST', $eintrag['iphost']);
$tpl->set('d', 'IMAGE', $cfgClient[$client]['upload'].$bilderpfad.$eintrag['image']);
$tpl->set('d', 'DATE1', strftime($dateformat1, $eintrag['date']));
$tpl->set('d', 'DATE2', strftime($dateformat2, $eintrag['date']));
$tpl->set('d', 'ADMINLINKS', $adminlinks);
$tpl->next();
}
$tpl->generate('templates/' . $tpl_datei);
?>