Standard-Newslettermodul Quickfix

Gesperrt
panyasan

Standard-Newslettermodul Quickfix

Beitrag von panyasan »

Hallo nochmals,

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']);
sonst funktioniert es nicht.

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	

?>
In die select-box kann man problemlos noch den "stop" and "goon"- Modus implementieren.

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
HerrB
Beiträge: 6935
Registriert: Do 22. Mai 2003, 12:44
Wohnort: Berlin
Kontaktdaten:

Beitrag von HerrB »

Ich habe es mir jetzt nicht näher angesehen, würde aber davon ausgehen, dass bei diesem Quickfix die Links im Newsletter (MAIL_GOON usw.) nicht funktionieren werden (nur so als Hinweis).

Zur Info: Die Spalte Hash wird in kommenden Versionen vermutlich verwendet werden - wenn dort bereits Einträge stehen, muss man das beim späteren Update beachten (und die Angaben ggf. vorher löschen, ich denke, es werden beim Update neue erzeugt).

Gruß
HerrB
panyasan

Links funktionieren nicht

Beitrag von panyasan »

HerrB: Richtig, diese Links funktionieren nicht. Die wollte ich ohnehin nicht verwenden. Das ganze ist aber sowieso nur ein "Quickfix", eben für Ungeduldige.... Allen anderen sei Deine Lösung geraten.

Gruß, Christian
Gesperrt