Wunschliste Snippet
von Hannes am 05.11.2011 in My Modx mit 0 Kommentaren
Tweet
Ein Möglichkeit in Communities und anderem seine Lieblingsartikel oder Seiten zu abonnieren ist was Feines. Dieses Snippet erfüllt diesen Wunsch.
Bevor wir loslegen
Geht es um eine sogenannte Wunschliste, so sollte man differenzieren, wer wann was an der Wunschliste nutzen darf. Würde jeder Nutzer ohne sich anzumelden eine Wunschliste auf Dauer aufbauen können, so verfliegt der Reiz einer Community. Deshalb unterscheidet unser Snippet namens memmoryList, ob wir nun eingeloggt sind oder nicht. Für Ausgeloggte ist das Ganze eine Art Appetizer, der Lust auf mehr machen soll. Sind wir offizielles Mitglied und eingeloggt, so wird unsere Wunschliste nicht terminiert. Andernfalls wird die Wunschliste nach Session IDs verwaltet und nach zwei Tagen gelöscht.
Die Installation
Zunächst erstellen wir uns eine Konfigurationsdatei namens memoryList.config.php:
<?php
// Verbindung zum Datenbankserver
mysql_connect(
"Dein Host", // Host
"Dein Benutzername", // User
"Dein Passwort" // Passwort
) or die("Keine Verbindung zum Datenbankserver!");
// Der Name der Datenbank muss angegeben werden!
mysql_select_db("Datenbankname")
or die("Die Datenbank ist momentan nicht erreichbar!");
?>
In einem weiteren Schritt müssen wir noch eine Tabelle mit dem Namen modx_memoryList_stats in unserer Datenbank anlegen:
<?php
include("memoryList.config.php");
$sql = "CREATE TABLE `modx_memoryList_stats` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`session` VARCHAR( 255 ) NULL ,
`user` VARCHAR( 255 ) NULL ,
`resources` VARCHAR( 255 ) NULL ,
`time` NULL ,
UNIQUE (
`resources`
)
) ENGINE = MYISAM ;
";
if (mysql_query($sql)) {
echo "<p>Tabelle `modx_meomryList_stats` wurde erstellt.</p>";
}
?>
Wichtig dabei ist, dass beide Dateien im gleichen Verzeichnis abgelegt sind, sonst müsste man den Includebefehl modifizieren.
Das eigentliche Snippet
<?php
// Wunschlistensystem mit MySQL - Version v1.0.1 (c) Hannes Letsch
include("core/components/memoryList/memoryList.config.php");
$ip = $_SERVER["REMOTE_ADDR"];
$page = $modx->resource->get('id');
$user = $modx->getLoginUserID();
$session = $_REQUEST['PHPSESSID'];
// Ausführung des Abonnierens
if ($_POST['addPage']) {
if ($user != 0) {
// Ist für mich schon etwas registriert?
if (!mysql_fetch_row(mysql_query("SELECT `user` FROM `modx_memoryList_stats` WHERE `user` = '" . $user . "'"))) {
// Nein, dann bitte Zeile anlegen
mysql_query("INSERT INTO `modx_memoryList_stats` (`user`) VALUES ('" . $user . "')");
} else {
$listResources = mysql_fetch_assoc(mysql_query("SELECT `resources` FROM `modx_memoryList_stats` WHERE `user` = '" . $user . "'"));
$listResourcesNum = $listResources['resources'];
if ($listResourcesNum == 0) {
mysql_unbuffered_query("UPDATE `modx_memoryList_stats` SET `resources` = '" . $page . "' WHERE `user` = '" . $user . "'");
} else {
$listResourcesNew = "$listResourcesNum,$page";
mysql_unbuffered_query("UPDATE `modx_memoryList_stats` SET `resources` = '" . $listResourcesNew . "' WHERE `user` = '" . $user . "'");
}
}
}
else {
// Ist für mich schon etwas registriert?
if (!mysql_fetch_row(mysql_query("SELECT `session` FROM `modx_memoryList_stats` WHERE `session` = '" . $session . "'"))) {
// Nein, dann bitte Zeile anlegen
mysql_query("INSERT INTO `modx_memoryList_stats` (`session`,`resources`,`time`) VALUES ('" . $session . "','" . $page . "','". time() . "')");
}
else {
$listResources = mysql_fetch_assoc(mysql_query("SELECT `resources` FROM `modx_memoryList_stats` WHERE `session` = '" . $session . "'"));
$listResourcesNum = $listResources['resources'];
if ($listResourcesNum == 0) {
mysql_unbuffered_query("UPDATE `modx_memoryList_stats` SET `resources` = '" . $page . "' WHERE `session` = '" . $session . "'");
} else {
$listResourcesNew = "$listResourcesNum,$page";
mysql_unbuffered_query("UPDATE `modx_memoryList_stats` SET `resources` = '" . $listResourcesNew . "' WHERE `session` = '" . $session . "'");
}
}
}
}
// Seite aus der Liste entfernen
if ($_POST['delPage']) {
if ($user != 0) {
// Finde und Lösche
$listResources = mysql_fetch_assoc(mysql_query("SELECT `resources` FROM `modx_memoryList_stats` WHERE `user` = '" . $user . "'"));
$listResourcesNum = $listResources['resources'];
$listResourcesArray = explode(',', $listResourcesNum);
for ($i=0; $i<count($listResourcesArray); $i++) {
if($listResourcesArray[$i]=="$page") {
unset ($listResourcesArray[$i]);
}
}
$comma_separated = implode(",", $listResourcesArray);
mysql_unbuffered_query("UPDATE `modx_memoryList_stats` SET `resources` = '" . $comma_separated . "' WHERE `user` = '" . $user . "'");
}
else {
// Finde und Lösche
$listResources = mysql_fetch_assoc(mysql_query("SELECT `resources` FROM `modx_memoryList_stats` WHERE `session` = '" . $session . "'"));
$listResourcesNum = $listResources['resources'];
$listResourcesArray = explode(',', $listResourcesNum);
for ($i=0; $i<count($listResourcesArray); $i++) {
if($listResourcesArray[$i]=="$page") {
unset ($listResourcesArray[$i]);
}
}
$comma_separated = implode(",", $listResourcesArray);
mysql_unbuffered_query("UPDATE `modx_memoryList_stats` SET `resources` = '" . $comma_separated . "' WHERE `session` = '" . $session . "'");
}
}
// Überprüfung ob ich schon diese Seite in meiner Wunschliste habe
if($user != 0) {
$list = mysql_fetch_assoc(mysql_query("SELECT `resources` FROM `modx_memoryList_stats` WHERE `user` = '" . $user . "'"));
$listNum = $list['resources'];
$listArray = explode(',', $listNum);
$ret=0;
}
else{
$list = mysql_fetch_assoc(mysql_query("SELECT `resources` FROM `modx_memoryList_stats` WHERE `session` = '" . $session . "'"));
$listNum = $list['resources'];
$listArray = explode(',', $listNum);
$ret=0;
}
if(in_array($page,$listArray)) {
$ret=1;
}
// Templating
$tplAddPage = $modx->getOption('tplAddPage',$scriptProperties,'tplAddPage');
$tplDelPage = $modx->getOption('tplDelPage',$scriptProperties,'tplDelPage');
if ($ret==0) {
$outputChunk = "$tplAddPage";
}
else {
$outputChunk = "$tplDelPage";
}
// Alte auf Session ID basierende Einträge löschen
$ablaufzeit = time() - 172800; // 172800 Sekunden (= 2 Tage)
mysql_query("DELETE FROM `modx_memoryList_stats` WHERE `time` <= " . $ablaufzeit . " AND `user` IS NULL");
mysql_close();
// Ausgabe des richtigen Chunks
$output = $modx->getChunk($outputChunk);
return $output;
?>
Benutzung: Chunks und Funktionen
Zunächst einmal rufen wir auf der gewünschten Seite unser Snippet auf:
[[!memoryList? &tplAddPage=`tplAddPage` &tplDelPage=`tplDelPage`]]
Zu beachten ist dabei, dass wir mit Hilfe von &tpl unsere Chunks ansteuern, in denen der eigentliche html Output enthalten ist. Verweisen wir nicht, so wird standardmäßig auf die Chunks tplAddPage und tplDelPage verwiesen. Existieren diese auch nicht, dann wird einfach nichts ausgegeben. tplAddPage regelt, was angezeigt werden soll, sprich wenn die Seite noch nicht abonniert wurde. TplDelPage ist das Gegenstück
Beispiele der beiden Chunks, in denen der Name des submit Buttons nicht geändert werden sollte. Das ist sehr wichtig!
<form action="[[~[[*id]]]]" method="post"> <input type="submit" name="addPage" title="Abonnieren" value="Eintragen" /> </form>
<form action="[[~[[*id]]]]" method="post"> <input type="submit" name="delPage" title="Löschen" value="Austragen" /> </form>
Für dieses Snippet gibt es keine Placeholder. Allerdings gibt es ein Addon, den Wunschlisten-Manager.












