Newsletter: Weitere Features (Entwicklung)

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

Newsletter: Weitere Features (Entwicklung)

Beitrag von HerrB » Fr 2. Dez 2005, 23:07

rok°! hat geschrieben:schritt 1:
ich möchte adressen aus einer csv-datei in den newsletter importieren, damit ich die dann als abonnenten führen kann.

schritt2:
das gleiche umgedreht, als export. also bestehende abonnenten in eine csv-datei exportieren.

das sollte nat. möglichst in die navi unter "extras > newsletter" (evtl. unter aktionen...)
Zu 1:
Eine erste Lösung gab es hier (nur so zur Info): http://www.contenido.org/forum/viewtopi ... 0294#30294

Die ist aber für eine Festintegration in Contenido nicht geeignet. Was ich benötigen würde, ist ein Formular mit einem Edit-Feld und einem Browse-Button, mit dem man die csv-Datei auswählen, hochladen und einlesen kann und welches die Daten nach Prüfung in die DB schreibt. Es ist zunächst nicht notwendig, das im Contenido-Kontext zu tun (das einfummeln würde ich übernehmen, separate PHP-Datei unter Nutzung der Contenido-Klassen genügt völlig, auch grafische Gestaltung ist unwichtig).

Wie Daten in die DB eingetragen werden, kannst Du der contenido/includes.recipients_edit.php entnehmen.

Dazu werden zunächst die Klassen eingebunden und die Objekte initialisiert:

Code: Alles auswählen

cInclude("classes", "class.newsletter.recipients.php");
cInclude("classes", "class.newsletter.groups.php");

$recipients = new RecipientCollection;
$recipient  = new Recipient;
Dann würde das Einlesen der Datei, Analysieren der Felder (z.B. E-Mail-Adresse mit isValidEmail oder so ähnlich, siehe Newsletter Module V4.6.x) und das speichern in der DB folgen.

Dazu würde in einer einer Schleife immer folgendes gemacht:

Code: Alles auswählen

$recipient = $recipients->create(<E-Mail-Adresse>,<Name>,1);
	$idrecipient = $recipient->get("idnewsrcp");
Das 1 setzt die neuen Empfänger gleich auf bestätigt. Optional könnte man hinter ,1 auch etwas wie "1,2,3" (ohne Leerzeichen) angeben - das trägt den Empfänger gleich in die Empfängergruppen mit der ID 1, 2 und 3 ein (in der ersten Version könnte man das ggf. noch ignorieren, da man sich a) wünschen könnte, dass man in der cvs-Datei nicht IDs, sondern die Gruppennamen angeben will [also statt 1,2,3 toll,geil,willig] und b) man die Werte auch überprüfen sollte [-> Aufwand]).

Hat man einen neuen Empfänger angelegt, sollte man schon mal Plugins berücksichtigen (ist Bestandteil der Schleife, wird bei jedem neuen Empfänger ausgeführt):

Code: Alles auswählen

/* Check out if there are any plugins */
    		if (is_array($cfg['plugins']['recipients'])) {
    			foreach ($cfg['plugins']['recipients'] as $plugin) {
    				if (function_exists("recipients_".$plugin."_wantedVariables") && function_exists("recipients_".$plugin."_store")) {
        				$wantVariables = call_user_func("recipients_".$plugin."_wantedVariables");
        			
	        			if (is_array($wantVariables)) {
        					$varArray = array();
        					
        					foreach ($wantVariables as $value) {
	        					$varArray[$value] = stripslashes($GLOBALS[$value]);	
        					}	
        				}
        				$store = call_user_func("recipients_".$plugin."_store", $varArray);
	    			}
    			}
	    	}
    	
	    	$recipient->store();
Wie das genau funktioniert habe ich selbst noch nicht ganz verstanden - da gibt es Beispiele von timo; es muss auch nicht sofort funktionieren, aber man sollte es schon mal im Code einbauen (auch wenn man kein Plugin drin hat), vergisst man es nicht.

Das wars auch schon.

Zu 2:
Eigentlich das Gleiche in grün (Code teilweise aus include.recipients_menu.php):

Code: Alles auswählen

cInclude("classes", "class.newsletter.recipients.php");
cInclude("classes", "class.newsletter.groups.php");

$recipients = new RecipientCollection;
$recipient  = new Recipient;

$recipients->setWhere("idclient", $client);
$recipients->setWhere("idlang", $lang);

$recipients->query();
Danach wird es ein wenig heftiger. Zunächst werden die DB-Daten in einen Array gelesen und zusätzlich jeweils ggf. vorhandene Plugin-Routinen berücksichtigt (sollte man auch von vornherein machen).

Am Anfang muss man zunächst definieren, um welche Felder es sich so handeln könnte (das kann dann später via Plugin ergänzt/überschrieben werden):

Code: Alles auswählen

/* Initialization */
$aFields = array();
$aFields["name"]  	= array("field" => "name", "caption" => i18n("Name"), "type" => "base,sort,search");
$aFields["email"] 	= array("field" => "email", "caption" => i18n("E-Mail"), "type" => "base,sort,search");
$aFields["confirmed"]	= array("field" => "confirmed", "caption" => i18n("Confirmed"), "type" => "base");
$aFields["deactivated"] = array("field" => "deactivated", "caption" => i18n("Deactivated"), "type" => "base");

$aDataTable = array();

while ($recipient = $recipients->next()) {

	$aDataTable[$recipient->get("idnewsrcp")]["id"] = $recipient->get("idnewsrcp");

	foreach ($aFields as $sKey => $aData) {
		if (strpos($aData["type"], "base") !== false) {
			if ($sKey == "name") {
				$name = $recipient->get("name");
				if (empty($name)) {
					$aDataTable[$recipient->get("idnewsrcp")][$sKey] = $recipient->get("email");
				} else {
					$aDataTable[$recipient->get("idnewsrcp")][$sKey] = $name;
				}
			} else {
				$aDataTable[$recipient->get("idnewsrcp")][$sKey] = $recipient->get($aData["field"]);
			}
		} else {
			$aDataTable[$recipient->get("idnewsrcp")][$sKey] = call_user_func("recipients_".$aData["field"]."_getvalue", $sKey);
		}
	}
	
	if ($_REQUEST["filter"] != "") {
		if ($_REQUEST["searchin"] == "--all--" || $_REQUEST["searchin"] == "") {
			$found = false;
			
			foreach ($aDataTable[$recipient->get("idnewsrcp")] as $key => $value) {
				if (strpos($value, htmlentities($_REQUEST["filter"])) !== false) {
					$found = true;
				}
			}
			
			if ($found == false) {
				unset($aDataTable[$recipient->get("idnewsrcp")]);
			}			
		} else {
			if (strpos($aDataTable[$recipient->get("idnewsrcp")][$_REQUEST["searchin"]], htmlentities($_REQUEST["filter"])) === false) {
				unset($aDataTable[$recipient->get("idnewsrcp")]);
			}
		}
	}
}

if ($_REQUEST["sortorder"] == "asc") {
	$sortorder = SORT_ASC;	
} else {
	$sortorder = SORT_DESC;
}

$aDataTable = array_csort($aDataTable, $_REQUEST["sortby"], $sortorder);
Zum Schluss wird sortiert und alle Daten stehen in $aDataTable, bereit, um in eine cvs-Datei gegossen und zum Anwender gesendet zu werden. Die Sortierung ist nicht unbedingt notwendig - die Daten werden hier aus dem Formular ermittelt, da genügen zunächst statische Werte.

Viel Spaß. Für Rückfragen stehe ich gerne zur Verfügung, würde mich aber zunächst um ein rumspielen, z.B. mit include.recipients_menu.php, freuen. Wie gesagt, um die Integration in Contenido-Menüs und das (spätere) Plugin-Abrakadabra würde ich mich kümmern, das Bekommen der Datei, das Einlesen, Aufbereiten, Speichern und wieder die Ausgabe in eine cvs-Datei mit dem Senden an den Nutzer would be yours (bitte das Senden nicht vergessen - habe ich noch nicht gemacht, würde mir daher echt Arbeit abnehmen).

Wenn akzeptabel, bitte in etwa die vorgefundene Nomenklatur verwenden, d.h. Variablen mit Typ definieren, e.g. $sValue (für string-value, a steht z.B. für Array). Das ist im Code nicht so brennend konsistent, ich weiss, ich arbeite dran ... :wink:

Gruß
HerrB
Bitte keine unaufgeforderten PMs oder E-Mails -> use da Forum!

Newsletter: V4.4.x | V4.6.0-15 (Module, Backend) | V4.6.22+
Standardartikelliste: V4.4.x | V4.6.x
http://www.contenido.org/forum/search.php | http://faq.contenido.org | http://www.communido.net

emergence
Beiträge: 10645
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Mi 7. Dez 2005, 12:08

das mit dem export gabs aber auch schon
-> http://www.contenido.org/forum/viewtopi ... newsletter
*** make your own tools (wishlist :: thx)

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

Beitrag von HerrB » Do 8. Dez 2005, 19:56

Ok, DEN Thread habe ich übersehen (oder verdrängt ... :wink: ). Danke.

Gruß
HerrB
Bitte keine unaufgeforderten PMs oder E-Mails -> use da Forum!

Newsletter: V4.4.x | V4.6.0-15 (Module, Backend) | V4.6.22+
Standardartikelliste: V4.4.x | V4.6.x
http://www.contenido.org/forum/search.php | http://faq.contenido.org | http://www.communido.net

Antworten