Dev: Newsletter-Überarbeitung für V4.5

Fragen zur Installation von CONTENIDO 4.9? Probleme bei der Konfiguration? Hinweise oder Fragen zur Entwicklung des Systemes oder zur Sicherheit?
HerrB
Beiträge: 6935
Registriert: Do 22. Mai 2003, 12:44
Wohnort: Berlin
Kontaktdaten:

Dev: Newsletter-Überarbeitung für V4.5

Beitrag von HerrB » Do 5. Aug 2004, 12:26

Bitte beachten:

Dieser Code ist noch nicht fertig oder fehlerfrei. Bitte nicht verwenden, es gibt keinen Support, keine Hilfe, i.A. keine Antworten und der Code kann sich ständig ändern.

Er zeigt nur einen Zwischenstand und ist nur für V4.5 geeignet.

Alle Dateien gibt es hier: http://www.btech.de/temp/newsletter4.5/ ... 5_NEIN.zip

Auf geht's:
Classes:
Neu:
class.newsletter.recipients.php,
class.newsletter.php
class.newsletter.groups.php

Änderungen:
class.ui.php (die Änderung entspricht der Überarbeitung in nachfolgenden Versionen), da mit der vorhandenen Klasse keine "deaktivierten" Newsletter-Empfänger dargestellt werden konnten (roter Link):

Code: Alles auswählen

class Link
...
	var $content;
	var $attributes;
...
	function updateAttributes ($attributes)
	{
		$this->attributes = $attributes;
	}
...	
	function render ()
...
	$alt = " ";
        	}

	if (is_array($this->attributes))
        	{
        		foreach ($this->attributes as $key => $value)
        		{
        			$attributes .= " $key=\"$value\" ";
        		}	
        	}
...
        	switch ($this->type)
    		{
    			case "link":
    				$link =  '<a target="'.$target.'"'.$alt.'href="'.$this->link.'"'.$attributes.'>';
    				break;
    			case "clink":
    				
    				$link = '<a target="'.$target.'"'.$alt.'href="main.php?area='.$this->targetarea.
                                           '&frame='.$this->targetframe.
                                           '&action='.$this->targetaction.$custom."&contenido=".$sess->id.
                                           '"'.$attributes.'>';
                    break;
    			case "multilink":
    				$tmp_mstr = '<a '.$alt.'href="javascript:conMultiLink(\'%s\', \'%s\', \'%s\', \'%s\')"'.$attributes.'>';
    				$mstr = sprintf($tmp_mstr, 'right_top',
                                       $sess->url("main.php?area=".$this->targetarea."&frame=".$this->targetframe."&action=".$this->targetaction.$custom),
                                       'right_bottom',
                                       $sess->url("main.php?area=".$this->targetarea2."&frame=".$this->targetframe2."&action=".$this->targetaction2.$custom));
    				$link = $mstr;
    				break;                                       
    		}
...
Includes:
Neu:
include.recipients.group.subnav.php,
include.recipients.group_edit.php,
include.recipients.group_menu.php

Änderungen:
cfg_language_de.inc.php,
cfg_sql.inc.php,

include.recipients_edit.php,
include.recipients_left_top.php,
include.recipients_menu.php,
include.newsletter_edit.php,
include.newsletter_left_top.php,
include.newsletter_menu.php,
include.newsletter_send.php

Die include.*-Dateien entsprechen mit keiner Zeile mehr dem alten Code, können also einfach überschrieben werden.

cfg_language_de.inc.php enthält die Texte für die neuen Actions und Änderungen in der Bezeichnung und Beschriftung:

Code: Alles auswählen

$lngAct["news"]["news_save"]                   			= i18n("Edit newsletter"); 		/* HerrB */
$lngAct["news"]["news_create"] 					= i18n("Create newsletter");		/* HerrB */
$lngAct["news"]["news_delete"]					= i18n("Delete newsletter");
$lngAct["news_send"]["news_send"]				= i18n("Send newsletter");
/* HerrB: Old, not used
$lngAct["news_rcp"]["news_activatedeactivaterecipient"] 	= i18n("Activate/Deactivate recipient"); */
$lngAct["recipients"]["recipients_save"] 			= i18n("Edit recipient"); 		/* HerrB */
$lngAct["recipients"]["recipients_create"] 			= i18n("Create recipient");		/* HerrB */
$lngAct["recipients"]["recipients_delete"] 			= i18n("Delete recipient");
$lngAct["recipientgroups"]["recipientgroup_delete"] 		= i18n("Delete recipient group");	/* HerrB */
$lngAct["recipientgroups"]["recipientgroup_create"] 		= i18n("Create recipient group");	/* HerrB */
$lngAct["recipientgroups"]["recipientgroup_recipient_delete"]	= i18n("Delete recipient from group");	/* HerrB */
$lngAct["recipientgroups"]["recipientgroup_save_group"] 	= i18n("Save recipient group");		/* HerrB */
cfg_sql.inc.php enthält die Info zu den neuen Tabellen:

Code: Alles auswählen

$cfg["tab"]["news_groups"]                     = $cfg['sql']['sqlprefix']."_news_groups"; /* HerrB */
$cfg["tab"]["news_groupmembers"]               = $cfg['sql']['sqlprefix']."_news_groupmembers"; /* HerrB */
xml:
Änderungen in allen XML-Dateien für neue Area recipientgroups:

Code: Alles auswählen

            <recipients>Empfänger</recipients>
            <recipientgroups>Empfänger-Gruppen</recipientgroups>
        </extra>
Die Einträge sollten aber kontrolliert werden.

DB:
Änderungen in der DB sind in der db_update.txt angegeben. Im Skript muss der Datenbank-Name angepasst werden. Außerdem muss beachtet werden, ob die neuen DB-IDs stimmen. Es wurde nicht getestet, ob das ein lauffähiges Skript ist.

Neue Features:
- Komplette Umstellung des Newsletter-Bereichs auf Klassen,
- Newsletter können kopiert werden,
- Empfänger-Gruppen,
- Spezifizierung einer Standard-Empfänger-Gruppe möglich,
- Standard-Empfänger-Gruppe verfügt über * und steht am Anfang der Liste,
- Neue Empfänger werden autom. in Standard-Empfänger-Gruppe eingetragen,
- Übergabe der Newsletter-IDCatArt über Mandanteneingenschaft,
- Versenden des Newsletters an ausgewählte Gruppen,
- Löschen von alten, unbestätigten Empfängern ("purge"),
- Bestätigungsdatum wird erfasst,
- Willkommens-Newsletter-Eigenschaft wird in DB gespeichert,
- Willkommens-Newsletter verfügt über * und steht am Anfang der Liste,
- das nachträgliche Ändern der E-Mail-Adresse wäre möglich,

Korrekturen (Achtung!):
- MAIL_DATE und MAIL_TIME zeigen Sendedatum bzw. -zeit und nicht mehr das Datum, wann der Newsletter in der DB erzeugt wurde
- Die Newsletter werden nun nach Namen und nicht mehr nach Erstellung sortiert (Willkommens-Newsletter steht ggf. oben)
- Identifizierungs-Key kann nicht mehr geraten werden...
- Alter und neuer Key sind nicht identisch, neuer Key ist 30 Zeichen lang (damit ist die versehentliche Verwendung der alten Keys ohne Folgen)
- Als Speicherplatz für den Key wird die (z.Z. unbenutzte) Spalte 'hash' verwendet
- Für das Update (Setup von Contenido) muss eine Funktion ergänzt werden, die für alle Empfänger mit hash = NULL die folgende Funktion ausführt:

Code: Alles auswählen

$item->set("hash", substr(md5(rand()),0,17) . uniqid(""));
Verlorene Features:
- Suchfunktion bei Empfängern
- Begrenzte Anzeige der Anzahl der angezeigten Empfänger (inkl. vor und zurück)

Erläuterung: Ist z.Z. mit der verwendeten UI-Klasse nicht machbar.

Damit ein Versenden eines Newsletters möglich ist, muss die idcatart der Blackbox-Modul-Seite als Mandanteneinstellung vorgenommen werden (Administration -> Mandanten -> Mandant wählen -> Mandanteneinstellungen):
Typ: Newsletter
Name: idcatart
Wert: <Die idcatart der Blackbox-Modul-Seite> (z.B. 45)

Ich hoffe, ich habe nix vergessen... Ach ja, die .po-Dateien müssen erweitert werden...

Gruß
HerrB
Zuletzt geändert von HerrB am Mi 1. Dez 2004, 17:59, insgesamt 11-mal geändert.

HerrB
Beiträge: 6935
Registriert: Do 22. Mai 2003, 12:44
Wohnort: Berlin
Kontaktdaten:

Freie Abfragen mit GenericDB

Beitrag von HerrB » Sa 14. Aug 2004, 13:58

Ich versuche gerade, mit der GenericDB class eine Tabellen-übergreifende Abfrage zu zimmern. Leider hakt es da ein wenig.

Könnte jemand mal ein Beispiel posten, wie man "freie" Select-Statements mit dieser Klasse erzeugen kann?

Mein Stand:
Man nehme ein Objekt, welches die GenericDB-Class nutzt, z.B. FrontendUsers.

Übergeben werden müssen: die gewünschten Feldnamen, die Tabellen und das WHERE-Statement

Mit $Objekt->link(Class) wird - über den Umweg der Klasse - eine Tabelle hinzugefügt. Muss es das Item oder die ItemCollection sein? Müssen - bei diesem Weg - alle Klassen definiert werden oder nur die zur Objekt-Klasse fremde Klasse?

Mit $Objekt->addResultField(Feldname) wird das Feld angegeben.

Mit $Objekt->setWhere(Feld, Inhalt, [Operator]) wird eine einzelne WHERE-Bedingung ergänzt. Wenn ich es richtig verstanden habe, versucht die GenericDB sogar, die Felder eigenständig den Tabellen zuzuordnen. Ist das richtig? Funktioniert das auch, wenn die Felder in mehreren Tabellen vorkommen sollten (e.g. idclient und idlang)? Und müssen diese Felder dann einmal oder mehrmals mit setWhere ergänzt werden (für z.B. TabelleA.idclient = 1 AND TabelleB.idclient=1)?

Bisher sieht das dann bei mir so aus:

Code: Alles auswählen

$users->link("FrontendUser");
$users->link("FrontendUserGroup");
$users->setWhere("defaultgroup","1");
$users->setWhere("idclient","$client");
$users->setWhere("idlang","$lang");
$users->addResultField("idfrontenduser");
$users->query();
Anmerkung: Klassennamen und id-Spalte können falsch sein, nur ein Beispiel.

Die Abfrage führt aber zu dem Fehler:
[14-Aug-2004 14:34:49] PHP Fatal error: Call to a member function on a non-object in /homepages/4/d69320680/htdocs/contenido/classes/class.genericdb.php on line 383
Das ist die Zeile

Code: Alles auswählen

			$restriction = "'" . $this->_itemClassInstance->_inFilter($item["restriction"]) . "'";
in class.genericdb.php in der Funktion _buildWhereStatements.

Jemand eine Idee?

Gruß
HerrB

HerrB
Beiträge: 6935
Registriert: Do 22. Mai 2003, 12:44
Wohnort: Berlin
Kontaktdaten:

Beitrag von HerrB » Do 19. Aug 2004, 13:37

Um die Frage selbst zu beantworten: Wenn ich das alles richtig verstanden habe (und es gibt da jede Menge Arrays, Variablen und Objekte), kann man mit der GenericDB-Klasse keine "freien" Abfragen gestalten.

Die Klasse ist bei Angabe mehrerer Klassen (bzw. Tabellen) nur in der Lage, eine Verknüpfung herzustellen, die auf den jeweiligen Primary Keys basiert. Da aber der Primary Key in verschiedenen Tabellen nur selten übereinstimmen wird, ist eine Verknüpfung nicht möglich (es sei denn, man überschreibt nur für die Abfrage den Primary Key in der Klasse durch den gewünschten Key - dirty, dirty, wenn überhaupt möglich). Wie gesagt, wenn ich das alles richtig verstanden habe.

Muss ich mir was anderes ausdenken... (für abweichende Hinweise bin ich dankbar).

Gruß
HerrB

HerrB
Beiträge: 6935
Registriert: Do 22. Mai 2003, 12:44
Wohnort: Berlin
Kontaktdaten:

Beitrag von HerrB » Sa 21. Aug 2004, 15:43

Ich verwende nun eine Variante der select()-Funktion in der genericdb-Klasse, die viele Freiheiten lässt:

Code: Alles auswählen

	/**
	* selectfrom ($distinct = "", $from = "", $where = "", $group_by = "", $order_by = "", $limit = "")
	* Selects all entries from the database and returns them as DBObject-objects
	* to the user. Objects are loaded using their primary key.
	* @param string $distinct Specifies if distinct will be added to the SQL statement ($distinct !== "" -> DISTINCT)
	* @param string $from     Specifies the additional from clause (inlcuding , and " AS ", elements have to be lowercase).
	* @param string $where    Specifies the where clause.
	* @param string $group_by Specifies the group by clause.
	* @param string $order_by Specifies the order by clause.
	* @param string $limit    Specifies the limit by clause.
	* @return array Array of DBObject-Objects
	*/	
	function selectfrom ($distinct = "", $from = "", $where = "", $group_by = "", $order_by = "", $limit = "")
	{
		unset ($this->objects);
		
		if ($distinct != "")
		{
			$distinct = " DISTINCT";
		}

		if ($from != "")
		{
			$from = " AS " . get_class($this) . ", " . $from;
		}		

		if ($where != "")
		{
			$where = " WHERE " . $where;
		}
		
		if ($group_by != "")
		{
			$group_by = " GROUP BY ".$group_by;
		}
		
		if ($order_by != "")
		{
			$order_by = " ORDER BY ".$order_by;
		}
		
		if ($limit != "")
		{
			$limit = " LIMIT ".$limit;
		}
		
		$sql = "SELECT" . $distinct . " " . get_class($this) . "." . $this->primaryKey ." AS " . $this->primaryKey . 
		       " FROM " . $this->table . 
		       $from . $where . $group_by . $order_by . $limit;

		$this->db->query($sql);
		$this->_lastSQL = $sql;
		$this->_mode    = "manual";

		if ($this->db->num_rows() == 0)
	    	{
			return false;
		} else {
			/* Everything ok, do nothing for now */				
		}
	}
Die Funktion liefert das Ergebniss analog der select()-Funktion als Objekte. Es wird automatisch die Tabelle und die PrimaryKey-Spalte der Klasse ausgewählt und hinzugefügt. In $from müssen daher nur die zusätzlichen Tabellen angegeben werden (inkl. AS-Statement, Namen sollten klein geschrieben werden).

Beispiel ($user = New FrontendUserCollection):

Code: Alles auswählen

$users->selectfrom("distinct", $cfg["tab"]["frontendgroups"] . " AS groups",
"frontendusercollection.idclient = '" . $client . "' AND " .
"frontendusercollection.idlang = '" . $lang . "' AND " .
"frontendusercollection.active = '1' AND " .
"frontendusercollection.idfrontenduser = groups.idfrontenduser AND " .
"groups.defaultgroup = '1'");
Für die JOINs zwischen den Tabellen muss man daran denken, dass die Klassen-Tabelle unter dem Klassennamen (lowercase) in die Abfrage eingebunden wird (hier: frontendusercollection). Die Namen der anderen Tabellen kann man natürlich frei wählen.

Wenn ich nochmal viel Zeit habe, baue ich das vielleicht nochmal um, damit man die Select-Statements nicht komplett übergeben muss (jetzt: "A = 1 AND B = 2", besser: setWhere("A","1"), setWhere("B","2")) - aber jetzt mache ich es erst mal die Newsletter-Funktion fertig.

Gruß
HerrB

EDIT (27.08.2004): Distinct ergänzt...

HerrB
Beiträge: 6935
Registriert: Do 22. Mai 2003, 12:44
Wohnort: Berlin
Kontaktdaten:

Beitrag von HerrB » Sa 4. Sep 2004, 18:00

Das Backend ist praktisch fertig (na ja, Feinschliff fehlt vielleicht noch).

Zunächst aber mal ein paar Screenshots:

Bild
Bild
Bild
Bild
Bild
Bild

Gruß
HerrB

HerrB
Beiträge: 6935
Registriert: Do 22. Mai 2003, 12:44
Wohnort: Berlin
Kontaktdaten:

Beitrag von HerrB » Di 12. Okt 2004, 14:45

Zur Info: Die z.Z. in der ZIP-Datei enthaltenen Dateien und Änderungen können für die V4.5 verwendet werden (aktuell fehlt noch ein Bild in der Datei). Allerdings sind noch nicht die benötigten Informationen für die Module enthalten.

Ich habe erst jetzt die Änderungen im CVS bemerkt, so dass ich noch ein paar Korrekturen vornehmen muss - damit man weniger am Core ändern muss. Ich hoffe aber, dass ich Ende der Woche soweit bin.

Gruß
HerrB

DEDE
Beiträge: 314
Registriert: Do 19. Feb 2004, 16:15
Kontaktdaten:

Beitrag von DEDE » Mo 1. Nov 2004, 16:45

Wie siehst es denn hierbei mit 4.5.2 aus?

Gruss und Dank

Dede

HerrB
Beiträge: 6935
Registriert: Do 22. Mai 2003, 12:44
Wohnort: Berlin
Kontaktdaten:

Beitrag von HerrB » Di 2. Nov 2004, 10:20

Ich fummele noch, zumal noch die Module fehlen (aber einfache Versionen stelle ich demnächst zur Verfügung).

Gruß
HerrB

DEDE
Beiträge: 314
Registriert: Do 19. Feb 2004, 16:15
Kontaktdaten:

Beitrag von DEDE » Di 2. Nov 2004, 10:33

Also ich bekommen jetzt wahrscheinlich den tierischen Rüffel ... aber ich habs halt mal blauäugig implementiert. Es hat mir soweit auch nichts zerlegt.
Bei Sendung an Gruppe kommt eben die Fehlermeldung:
[02-Nov-2004 10:27:50] PHP Fatal error: Call to undefined function: selectfrom() in /www/htdocs/v126156/contenido/classes/class.newsletter.php on line 187
[02-Nov-2004 10:24:31] PHP Fatal error: Call to undefined function: selectfrom() in /www/htdocs/v126156/contenido/classes/class.newsletter.php on line 187
Und der Aufruf der beim Empfänger im Mail genannten URL führt lediglich auf ide Startseite.
Na, dann hoffe ich, dass ich mir nicht doch irgendwo ein Bein gestellt hab. :oops:

Dicken Dank
Dede

HerrB
Beiträge: 6935
Registriert: Do 22. Mai 2003, 12:44
Wohnort: Berlin
Kontaktdaten:

Beitrag von HerrB » Di 2. Nov 2004, 14:54

Nein, haue gibt es natürlich nicht - nur kann ich im Moment nicht sehr schnell reagieren.

Augenblick noch.

Gruß
HerrB

HerrB
Beiträge: 6935
Registriert: Do 22. Mai 2003, 12:44
Wohnort: Berlin
Kontaktdaten:

Beitrag von HerrB » Di 2. Nov 2004, 15:39

So, jetzt. Ich habe das Paket oben mit dem neuesten Stand aktualisiert.

Warnung: Verwende das Ganze nur, wenn Du Dich mit Datenbanken, IDs und ein wenig mit PHP auskennst. Da kann ich gerade aus Zeitgründen nicht helfen. Ansonsten siehe oben. Alles auf eigene Gefahr!

Es wird empfohlen, die Änderungen in class.ui.php und class.genericdb.php manuell vorzunehmen und nicht die Dateien mit den beigefügten zu ersetzen (denn die haben irgendeinen Stand, der von der letzten V4.5-Version abweichen kann). Dies gilt auf jeden Fall für die XML-Dateien.

Die update.txt muss auf jeden Fall an die eigenen Gegebenheiten (Datenbank-Name, Prefix, verfügbaren IDs in den Tabellen) angepasst werden. Besonders die IDs sind wichtig, da man sich sonst ggf. Contenido-Funktionen überschreibt.

Deine Fehlermeldung zeigt, dass die selectfrom-Methode in der class.genericdb.php nicht eingefügt wurde.

Beachte: Es gibt in den Dateien keine Routine, die bei den vorhandenen Empfängern den benötigten, eindeutigen, 30-stelligen, alphanumerischen hash-Wert erzeugt. Ohne diesen ist keine Pflege über das Blackbox-Modul möglich.

Ich versuche, noch ein paar Module zu ergänzen.

Gruß
HerrB

HerrB
Beiträge: 6935
Registriert: Do 22. Mai 2003, 12:44
Wohnort: Berlin
Kontaktdaten:

Beitrag von HerrB » Di 2. Nov 2004, 15:48

Modul Newsletter Subscription (das wird sich noch ändern, keine Ahnung, ob es funktioniert):

Input:

Code: Alles auswählen

<?php 
   $properties = new PropertyCollection;
   
   echo '<form name="frmNewsletter" method="post" action="front_content.php?changelang='.$lang.'">',chr(10); 
   echo '  <table width="100%" border="0" cellspacing="0" cellpadding="0"> ',chr(10);
   echo '    <tr>',chr(10); 
   echo '      <td>'.mi18n("htmlName").'</td>',chr(10); 
   echo '      <td><input name="emailname" type="text"></td>',chr(10); 
   echo '    </tr>',chr(10);
   echo '    <tr>',chr(10); 
   echo '      <td>'.mi18n("htmlEMail").'</td>',chr(10);
   echo '      <td><input name="email" type="text"><input type="hidden" name="idcatart" value="'.$properties->getValue("clientsetting", $client, "Newsletter", "idcatart").'"></td>',chr(10); 
   echo '    </tr>',chr(10);
   echo '    <tr>',chr(10); 
   echo '      <td>&nbsp;</td>',chr(10); 
   echo '      <td><select name="action" id="action">',chr(10); 
   echo '            <option value="subscribe" selected>'.mi18n("txtSubscribe").'</option>',chr(10); 
   echo '            <option value="delete">'.mi18n("txtUnsubscribe").'</option>',chr(10); 
   echo '          </select></td>',chr(10);
   echo '    </tr>',chr(10); 
   echo '    <tr>',chr(10); 
   echo '      <td>&nbsp;</td>',chr(10); 
   echo '      <td><input name="subscribe" type="submit" id="subscribe" value="'.mi18n("txtOK").'"></td>',chr(10);
   echo '    </tr>',chr(10);
   echo '  </table>',chr(10); 
   echo '</form>',chr(10);
?> 
Code für Übersetzungs-XML-Datei:

Code: Alles auswählen

<?xml version="1.0" encoding="ISO-8859-1"?>
<module>
<translation origin-language-id="1" origin-language-name="deutsch">
	<string>
		<original>htmlName</original>
		<translation>Ihr Name:</translation>

	</string>
	<string>
		<original>htmlEMail</original>
		<translation>Ihre E-Mail-Adresse:</translation>
	</string>
	<string>
		<original>txtSubscribe</original>
		<translation>Anmelden</translation>
	</string>
	<string>
		<original>txtUnsubscribe</original>
		<translation>Abmelden</translation>
	</string>
	<string>
		<original>txtOK</original>
		<translation>OK</translation>
	</string>
</translation>
</module>
Gruß
HerrB
Zuletzt geändert von HerrB am Mi 24. Nov 2004, 13:04, insgesamt 3-mal geändert.

HerrB
Beiträge: 6935
Registriert: Do 22. Mai 2003, 12:44
Wohnort: Berlin
Kontaktdaten:

Beitrag von HerrB » Di 2. Nov 2004, 15:59

Modul Newsletter Blackbox (das wird sich noch ändern, keine Ahnung, ob es funktioniert):

Beschreibung:

Code: Alles auswählen

Newsletter-Modul V3.0 (Contenido V4.5ff)
Input:

Code: Alles auswählen

?>
<table cellspacing="0" cellpadding="5" border="0">
  <tr>
    <td>Absender E-Mail-Adresse:</td>
    <td><input type="text" name="CMS_VAR[100]" value="<?php echo "CMS_VALUE[100]"; ?>"></td>
  </tr>
  <tr>
    <td>Newsletter Artikel-ID:</td>
<?php 
   $properties = new PropertyCollection;
   $idcatart = $properties->getValue("clientsetting", $client, "Newsletter", "idcatart");
   if (!$idcatart)
   {
     echo "  <td>Achtung: Keine Artikel-ID definiert!!!</td>";
   } else {
     echo "  <td>".$idcatart."</td>";
   }
?>
  </tr>
</table>
<?php 
Output:

Code: Alles auswählen

<?php
  cInclude("classes", "class.newsletter.recipients.php");
  cInclude("classes", "class.newsletter.php");
  // cInclude("classes", "class.properties.php"); /* Already included */
  $recipients = New RecipientCollection;

  $from = "CMS_VALUE[100]"; // "do-not-reply@domain.de "; /* Specify sender e-mail */ 

if ($action == "subscribe") 
{ 
  if (!isset($email) || !$email) { 
    echo mi18n("htmlErrNoEMail"); 
  } else {
    if ($recipient = $recipients->checkEMail($email))
    {
      echo mi18n("htmlErrSubscribeMail");
    } else {
      /* $emailname = str_replace (";","",$emailname); 
      $emailname = str_replace ("--","",$emailname); 
      $emailname = str_replace ("'","",$emailname); 
      $emailname = str_replace ("\"","",$emailname);
      $emailname = urlencode($emailname); */
      if ($recipient = $recipients->create($email,$emailname))
      {
        $properties = new PropertyCollection;
        $blackboxidcatart = $properties->getValue("clientsetting", $client, "Newsletter", "idcatart");
        $body = mi18n("txtMsgSubscribe")."\n".$cfgClient[$client]["path"]["htmlpath"]."front_content.php?changelang=".$lang."&idcatart=".$blackboxidcatart."&confirm=".$recipient->get("hash")."\n\n";

        if (mail("$email", mi18n("txtMsgSubscribeHeader"), "$body", 'From: '.$from."\n"."X-Mailer: Contenido [PHP/" . phpversion()."]"))
        {
          echo mi18n("htmlOKSubscribe");
        } else {
          echo mi18n("htmlErrSubscribe");
        }
      } else {
        echo mi18n("htmlErrSubscribe");
      }
    }
  } 
} 

if ($action == "delete") 
{ 
  if (!isset($email) || !$email) { 
    echo mi18n("htmlErrNoEMail");
  } else {
    if ($recipient = $recipients->checkEMail($email))
    {
      $properties = new PropertyCollection;
      $blackboxidcatart = $properties->getValue("clientsetting", $client, "Newsletter", "idcatart");
      $body = mi18n("txtMsgDelete")."\n".$cfgClient[$client]["path"]["htmlpath"]."front_content.php?changelang=".$lang."&idcatart=".$blackboxidcatart."&unsubscribe=".$recipient->get("hash")."\n\n"; 

      if (mail($recipient->get("email"), mi18n("txtMsgDeleteHeader"), "$body", 'From: '.$from."\n"."X-Mailer: Contenido [PHP/" . phpversion()."]"))
      { 
        echo mi18n("htmlOKDelete");
      } else {
        echo mi18n("htmlErrDelete");
      }
    } else { 
      echo mi18n("htmlErrDelete");
    } 
  } 
} 

if (strlen($confirm) == 30 && is_alphanumeric($confirm)) 
{
  $newsletters = New NewsletterCollection;
  $recipients->select("hash = '$confirm'");
  
  if ($recipient = $recipients->next())
  {
    $idrecipient = $recipient->get("idnewsrcp");
    $recipient->set("confirmed",1);
    $recipient->set("confirmeddate", date("Y-m-d H:i:s"), false);
    $recipient->set("deactivated",0);
    $recipient->store();
    echo mi18n("htmlOKConfirm");

    $newsletters->select("idclient = '$client' AND idlang='$lang' AND welcome='1'");
    if ($newsletter = $newsletters->next())
    {
      $properties = New PropertyCollection;
      $result = $newsletter->send($properties->getValue("clientsetting", $client, "Newsletter", "idcatart"),"single",$idrecipient);
      // HIER: Ergebnis anzeigen...
      echo mi18n("htmlOKConfirmWelcome");
    }
  } else {
    echo mi18n("htmlErrConfirm");
  }
} 

if (strlen($stop) == 30 && is_alphanumeric($stop))
{
  $recipients->select("hash = '$stop'");

  if ($recipient = $recipients->next())
  {
    $recipient->set("deactivated",1);
    $recipient->store();

    echo mi18n("htmlOKStop");
  } else { 
    echo mi18n("htmlErrStop");
  } 
} 

if (strlen($goon) == 30 && is_alphanumeric($goon))
{ 
  $recipients->select("hash = '$goon'");

  if ($recipient = $recipients->next())
  {
    $recipient->set("deactivated",0);
    $recipient->store();

    echo mi18n("htmlOKGoOn");
  } else { 
    echo mi18n("htmlErrGoOn");
  }  
} 

if (strlen($unsubscribe) == 30 && is_alphanumeric($unsubscribe))
{
  $recipients->select("hash = '$unsubscribe'");

  if ($recipient = $recipients->next())  
  {
    $recipients->delete($recipient->get("idnewsrcp"));

    echo mi18n("htmlOKUnsubscribe");
  } else { 
    echo mi18n("htmlErrUnsubscribe");
  }    
} 
?> 
Code für Übersetzungs-XML-Datei:

Code: Alles auswählen

<?xml version="1.0" encoding="ISO-8859-1"?>
<module>
<translation origin-language-id="1" origin-language-name="deutsch">
	<string>
		<original>htmlErrNoEMail</original>
		<translation>Bitte geben Sie eine E-Mail-Adresse an.</translation>
	</string>
	<string>
		<original>txtMsgSubscribe</original>
		<translation>Sehr geehrter Interessent,\n um Ihre Teilnahme am Newsletter zu bestätigen, klicken Sie bitte auf den unten stehenden Link:</translation>
	</string>
	<string>
		<original>htmlOKConfirm</original>
		<translation>Aktion erfolgreich, vielen Dank!<br><br>Sie gehören nun zum Kreis der Newsletter-Abonnenten.</translation>
	</string>
	<string>
		<original>htmlOKConfirmWelcome</original>
		<translation> Bereits unser Willkommens-Newsletter ist auf dem Weg zu Ihnen!</translation>
	</string>
	<string>
		<original>htmlErrConfirm</original>
		<translation>Aktion fehlgeschlagen!<br><br>Newsletter-Account konnte nicht bestätigt werden.</translation>
	</string>
	<string>
		<original>htmlErrSubscribe</original>
		<translation>Bei der Registrierung ist ein Fehler aufgetreten. Bitte wenden Sie sich an den Webmaster.</translation>
	</string>
	<string>
		<original>txtMsgSubscribeHeader</original>
		<translation>Newsletter: Bestätigung</translation>
	</string>
	<string>
		<original>htmlOKSubscribe</original>
		<translation>Sehr geehrter Interessent,<br><br>Sie erhalten gleich eine E-Mail. Bitte bestätigen Sie Ihre Teilnahme am Newsletter.</translation>
	</string>
	<string>
		<original>txtMsgDelete</original>
		<translation>Sehr geehrter Newsletter-Abonnent, \n um den Newsletter zu kündigen, klicken Sie bitte auf untenstehenden Link:</translation>
	</string>
	<string>
		<original>txtMsgDeleteHeader</original>
		<translation>Newsletter: Abbestellen</translation>
	</string>
	<string>
		<original>htmlOKDelete</original>
		<translation>Sehr geehrter Abonnent,<br><br>Sie erhalten gleich eine eMail. Bitte bestätigen Sie die Kündigung des Newsletters.</translation>
	</string>
	<string>
		<original>htmlErrDelete</original>
		<translation>Diese E-Mail-Addresse ist nicht für den Newsletter eingetragen.</translation>
	</string>
	<string>
		<original>htmlOKStop</original>
		<translation>Ihr Newsletter-Abonnement pausiert.</translation>
	</string>
	<string>
		<original>htmlErrStop</original>
		<translation>Aktion fehlgeschlagen!<br><br>Newsletter-Account konnte nicht pausiert werden.</translation>
	</string>
	<string>
		<original>htmlOKGoOn</original>
		<translation>Aktion erfolgreich. Wir senden Ihnen gerne wieder unseren Newsletter.</translation>
	</string>
	<string>
		<original>htmlErrGoOn</original>
		<translation>Aktion fehlgeschlagen!<br><br>Newsletter-Account konnte nicht reaktiviert werden.</translation>
	</string>
	<string>
		<original>htmlOKUnsubscribe</original>
		<translation>Wir bestätigen hiermit die Kündigung Ihres Newsletter-Abonnements.</translation>
	</string>
	<string>
		<original>htmlErrUnsubscribe</original>
		<translation>Aktion fehlgeschlagen!<br><br>Newsletter-Account wurde nicht gekündigt.</translation>
	</string>
	<string>
		<original>htmlErrSubscribeMail</original>
		<translation>Diese E-Mail-Addresse ist bereits für den Newsletter eingetragen.</translation>
	</string>
</translation>
</module>
Gruß
HerrB
Zuletzt geändert von HerrB am Mi 24. Nov 2004, 13:05, insgesamt 2-mal geändert.

DEDE
Beiträge: 314
Registriert: Do 19. Feb 2004, 16:15
Kontaktdaten:

Beitrag von DEDE » Di 2. Nov 2004, 21:59

hmmm, ich kann mir das mit der Übersetzungsdatei nicht erschliessen. Wie heisst dasfile an das ich muss und von welcher update.txt ist die Rede?

Ich hab da nun wirklich gegrübelt aber komme nicht drauf.

Grüsse und frohes Schaffen
Dede

HerrB
Beiträge: 6935
Registriert: Do 22. Mai 2003, 12:44
Wohnort: Berlin
Kontaktdaten:

Beitrag von HerrB » Mi 3. Nov 2004, 07:24

Die db_update.txt findest Du in der ZIP-Datei oben. Diese enthält die SQL-Statements für die notwendigen Änderungen in der Contenido-Datenbank.

Den Code für die XML-Datei musst Du in einfach in eine leere Textdatei kopieren und als "irgendein_Name.xml" speichern. Dann kannst Du - nachdem Du den Code für das jeweilige Modul in Ein- bzw. Ausgabe eingefügt hast - im Bereich Übersetzungen die XML-Datei einlesen und erhältst damit für die aktuelle Sprache (hier: deutsch) die Übersetzungen für die im Code verwendeten Einträge (z.B. mi18n("htmlErrNoEMail") -> "Es wurde keine E-Mail-Adresse angegeben").

Gruß
HerrB

Antworten