das Standard-Newslettermodul, wie es in der Demo von 4.4.4 eingebaut ist, hat bei mir nicht funktioniert. Ich wollte aber nicht bis Version 4.5 warten und die anderen hier im Forum angebotenen Lösungen waren mir zu kompliziert.
Hier ist meine schnelle Lösung, die vielleicht anderen Ungeduldigen hilft:
In der Datei "new.php" im frontend-verzeichnis muss die letzte Zeile folgendermaßen lauten
Code: Alles auswählen
header ("Location: ".$cfgClient[$client]["path"]["htmlpath"]."front_content.php?idcatart=".$_GET['idcatart']."&mode=".$_GET['mode']."&hash=".$_GET['hash']."&email=".$_GET['email']);
Das Modul habe ich folgendermaßen umgeschrieben:
Code: Alles auswählen
<?php
/* Der Workflow funktioniert folgendermaßen:
*
* - Jede Aktion muß vom Benutzer bestätigt werden
* - Die Aktion "subscribe" meldet einen Benutzer an
* - Die Aktion "unsubscribe" meldet einen Benutzer ab
* - Die Aktion "stop" deaktiviert die Newsletterverteilung an den Benutzer
* - Die Aktion "goon" nimmt die Newsletterverteilung an den Benutzer wieder auf
*/
$_news_lang["nosuchlastaction"] = "Konnte gewählte Newsletter-Aktion nicht ausführen.";
$_news_lang["hashdoesntmatch"] = "Hash stimmt nicht überein. Bitte Newsletter-Aktion erneut ausführen.";
$_news_lang["invalidemail"] = "Ungültige Email-Adresse";
$_news_lang["subscribe"] = "Sie wurden in den Newsletterverteiler eingetragen.";
$_news_lang["unsubscribe"] = "Sie wurden aus dem Newsletterverteiler entfernt.";
$_news_lang["stop"] = "Sie wurden temporär aus dem Newsletterverteiler entfernt, können sich aber jederzeit wieder anmelden.";
$_news_lang["goon"] = "Sie wurden wieder in den Newsletterverteiler eingetragen.";
$_news_lang["alreadyexists"] = "Diese E-Mail-Addresse ist bereits für den Newsletter eingetragen.";
$_news_lang["confirm"]["subject"] = "Newsletter-Bestätigung";
$_news_lang["confirm"]["couldnotsend"] = "Konnte Bestätigung nicht versenden.";
$_news_lang["confirm"]["confirmsent"] = "Es wurde eine Email versendet, mir der Sie Ihre Anfrage bestätigen können. Bitte rufen Sie Ihre E-Mails ab und klicken Sie auf den Bestätigungslink.";
$_news_lang["confirm"]["alreadyconfirmed"] = "Diese E-Mail-Addresse wurde bereits bestätigt.";
$_news_lang["confirm"]["subscribe"] = "
Guten Tag,
Sie oder jemand anderes hat sie auf der Homepage .... für den Newsletter eingetragen. Damit verhindert wird, dass dies gegen Ihren Willen geschieht, haben wir Ihnen diese Email gesendet, mit der Sie den Bezug des Newsletters bestätigen müssen, bevor er Ihnen zugesendet wird. Die Bestätigung führen Sie mit dem Klick auf folgenden Link aus:
%s
Sollte der Link nicht funktionieren, kopieren Sie diesen bitte komplett in die Addressleiste Ihres Browsers.
";
$_news_lang["confirm"]["stop"] = "Sehr geehrter Newsletter-Abonnent,\n\nSie möchten sich vorrübergehend für unseren Newsletter abmelden.\n Bitte klicken Sie auf folgenden Link, um diese Aktion zu bestätigen:\n\n %s\n\n Sollte der Link nicht funktionieren, kopieren Sie diesen bitte komplett in die Addressleiste Ihres Browsers.";
$_news_lang["confirm"]["goon"] = "Sehr geehrter Newsletter-Abonnent,\n\nSie möchten unseren Newsletter wieder beziehen.\n
Bitte klicken Sie auf folgenden Link, um diese Aktion zu bestätigen:\n\n %s\n\n Sollte der Link nicht funktionieren, kopieren Sie diesen bitte komplett\n in die Addressleiste Ihres Browsers.";
$_news_lang["confirm"]["unsubscribe"] = "
Sehr geehrte/r Newsletter-Abonnent/in,
Sie möchten sich unseren Newsletter abbestellen.
Bitte klicken Sie auf folgenden Link, um diese Aktion zu bestätigen:
%s
Sollte der Link nicht funktionieren, kopieren Sie diesen bitte komplett in die Addressleiste Ihres Browsers.
";
$_news_lang["subscribtion"] = "Newsletter";
function _news_confirm ($hash, $email)
{
global $db, $client, $lang, $_news_lang, $cfg;
/* Check if the hashcode matches the db one */
$sql = "SELECT idnewsrcp, lastaction, hash FROM ".$cfg["tab"]["news_rcp"]."
WHERE email='$email' AND idclient='$client' AND idlang='$lang'";
$db->query($sql);
if ($db->next_record())
{
if ($db->f("hash") != $hash)
{
$GLOBALS['msg'] = $_news_lang["hashdoesntmatch"];
} else {
$idnewsrcp = $db->f("idnewsrcp");
if ($db->f("lastaction") == "")
{
$GLOBALS['msg'] = $_news_lang["confirm"]["alreadyconfirmed"];
return;
}
switch ($db->f("lastaction"))
{
case "subscribe":
$sql = "UPDATE ".$cfg["tab"]["news_rcp"]." SET deactivated='0', confirmed='1', lastaction='' WHERE idnewsrcp = '$idnewsrcp'";
break;
case "unsubscribe":
$sql = "DELETE FROM ".$cfg["tab"]["news_rcp"]." WHERE idnewsrcp = '$idnewsrcp'";
break;
case "stop":
$sql = "UPDATE ".$cfg["tab"]["news_rcp"]." SET deactivated='1', confirmed='1', lastaction='' WHERE idnewsrcp = '$idnewsrcp'";
break;
case "goon":
$sql = "UPDATE ".$cfg["tab"]["news_rcp"]." SET deactivated='0', confirmed='1', lastaction='' WHERE idnewsrcp = '$idnewsrcp'";
break;
default:
$sql = "";
}
$db->query($sql);
$GLOBALS['msg'] = $_news_lang[$db->f("lastaction")];
}
} else {
$GLOBALS['msg'] = $_news_lang["nosuchlastaction"];
}
//switch ($action)
}
function _news_createconfirm ($idnewsrcp, $action)
{
global $auth,$db, $lang, $client, $_news_lang, $cfg, $cfgClient, $idcatart;
$sql = "SELECT email, hash FROM ".$cfg["tab"]["news_rcp"]." WHERE idnewsrcp = '$idnewsrcp'";
$db->query($sql);
if (!$db->next_record())
{
return;
}
$hash = $db->f("hash");
$email = $db->f("email");
$path = $cfgClient[$client]["path"]["htmlpath"]."news.php?idcatart=$idcatart&mode=confirm&hash=$hash&email=$email";
$sql = "UPDATE ".$cfg["tab"]["news_rcp"]." SET lastaction='$action' WHERE idnewsrcp = '$idnewsrcp'";
$db->query($sql);
$mailtext = sprintf($_news_lang["confirm"][$action], $path);
if (!mail($db->f("email"), $_news_lang["confirm"]["subject"], $mailtext, "X-Mailer: Contenido [PHP/" . phpversion())) {
$GLOBALS['msg'] = $_news_lang["confirm"]["couldnotsend"];
} else {
$GLOBALS['msg'] = $_news_lang["confirm"]["confirmsent"];
}
}
if ($mode == "subscribe")
{
if (!preg_match('/^[.\w-]+@([\w-]+\.)+[a-zA-Z]{2,6}$/', $email)) {
$GLOBALS['msg'] = $_news_lang["invalidemail"];
} else {
/* Check if the recipient already exists */
$sql = "SELECT idnewsrcp FROM ".$cfg["tab"]["news_rcp"]." WHERE idclient='$client' and idlang='$lang' and email='$email'";
$db->query($sql);
if ($db->next_record())
{
$GLOBALS['msg'] = $_news_lang["alreadyexists"];
} else {
$newsrcpid = $db->nextid($cfg["tab"]["news_rcp"]);
$timestamp = date("Y-m-d H:i:s");
/* Create a new hash */
for ($i=0;$i<10;$i++)
{
$r .= rand();
}
$hash = md5($r);
if ($name == "")
{
$name = $email;
}
$sql = 'INSERT INTO
'.$cfg["tab"]["news_rcp"].'
SET
name="'.$name.'",
email="'.$email.'",
deactivated="0",
created="'.$timestamp.'",
lastmodified="'.$timestamp.'",
idclient="'.$client.'",
confirmed="0",
idlang="'.$lang.'",
hash="'.$hash.'",
idnewsrcp = "'.$newsrcpid.'"';
$db->query($sql);
_news_createconfirm($newsrcpid, "subscribe");
}
}
}
if ($mode == "stop" || $mode == "goon" || $mode == "unsubscribe")
{
$sql = "SELECT idnewsrcp FROM ".$cfg["tab"]["news_rcp"]." WHERE email='$email' and idclient='$client' and idlang='$lang'";
$db->query($sql);
if ($db->next_record())
{
$idnewsrcp = $db->f("idnewsrcp");
_news_createconfirm($idnewsrcp, $mode);
}
}
if ($mode == "confirm")
{
_news_confirm($hash, $email);
}
?>
<div class="newsletter">
<form action="front_content.php" method="post">
<input type="hidden" name="idcatart" value="<?php echo $idcatart; ?>">
<fieldset>
<legend>
<?php echo $_news_lang["subscribtion"]; ?>
</legend>
E-Mail: <input type="text" name="email"><br/>
Newsletter:
<select name="mode">
<option value="subscribe" selected>abonnieren</option>
<option value="unsubscribe">abbestellen</option>
</select>
<button type="submit">Absenden</button>
<?php if($msg) echo"<script>alert(\"".addslashes($msg)."\");</script>";?>
</fieldset>
</form>
</div>
<?php
?>
Insgesamt sind die Module der Demoversion, soweit ich sehe, alle in Bezug auf Trennung von Content und Style nicht sauber genug programmiert, viel zu viele STYLE="" - Angaben, die ins CSS gehören. Aber das nur am Rande.
Gruß,
Christian