Send Mail via Plugin

Fragen zur Installation von CONTENIDO 4.10? Probleme bei der Konfiguration? Hinweise oder Fragen zur Entwicklung des Systemes oder zur Sicherheit?
Antworten
snixzz
Beiträge: 22
Registriert: Mi 15. Jul 2020, 16:18
Wohnort: Schweiz
Kontaktdaten:

Send Mail via Plugin

Beitrag von snixzz » Mo 2. Nov 2020, 11:36

Hallo liebe Contenido-Community,

Weil sich der Prozess für das versenden der E-Mail geändert hat, muss ich das Versenden der Email von einem Modul in ein Plugin auslagern.

Wie kann ich ein mail.tpl für ein Plugin definieren und wo kann ich die dazugehörigen Übersetzungen definieren?

Anbei der Modul-Code für's versenden der Email.

Code: Alles auswählen

/*-----------------------------------------------
	Mail
-----------------------------------------------*/
$from = "noreply@domain.com";
$from_name = "from_name";
$subject = "subject;
$contentType = "text/html; charset=UTF-8";

$tplMail = cSmartyFrontend::getInstance();
$tplMail->assign("headline", $header1);
$tplMail->assign("member", $member);
$tplMail->assign("lblMailFirstline", mi18n("lblMailFirstline"));
$tplMail->assign("lblMailSalute", mi18n("lblMailSalute"));
$tplMail->assign("lblMailGeneratedAuto", mi18n("lblMailGeneratedAuto"));

$oMailer = new cMailer();
$message = Swift_Message::newInstance();
$message->setContentType($contentType);
$message->setSubject($subject);
$message->setFrom(array($from => $from_name));
$message->setTo($member->get('email'));
$message->setBody($tplMail->fetch("mail.tpl"));
$attachment = Swift_Attachment::newInstance($pdf, $filename, 'application/pdf');
$message->attach($attachment);
$oMailer->send($message);

xmurrix
Beiträge: 3143
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Kontaktdaten:

Re: Send Mail via Plugin

Beitrag von xmurrix » Mo 2. Nov 2020, 22:35

Hallo snixzz,
...Wie kann ich ein mail.tpl für ein Plugin definieren und wo kann ich die dazugehörigen Übersetzungen definieren?...
Templates liegen im Pluginverzeichnis im Ordner "templates". Nehmen wir an, dein Plugin hat den Namen "my_plugin_name", das Pluginverzeichnis wäre "contenido/plugins/my_plugin_name" und das Template "mail.tpl" wäre in "contenido/plugins/my_plugin_name/templates".

In Plugins verwendet man eine andere Smarty-Klasse, die cSmartyBackend.
Beispiel:

Code: Alles auswählen

$tpl = cSmartyBackend::getInstance(true);
$tpl->assign("headline", $header1);
...
$tpl->display("/var/www/contenido/plugins/my_plugin_name/templates/mail.tpl");
Anders als in Modulen muss man bei Plugins den vollen Pfad zum Template angeben.

Plugin-Übersetzungen sind anders als Modulübersetzungen. Plugins arbeiten, wie das CONTENIDO-Backend, mit GetText-PO- und POT-Dateien. Am Einfachsten ist es, wenn du nur *.po Dateien verwendest. Plugin-Übersetzungen sind im Pluginverzeichnis im Ordner "locale" abzulegen, der genaue Aufbau des "locale" Ordners sieht wie folgt aus:

Code: Alles auswählen

locale
    de_DE
        LC_MESSAGES
            my_plugin_name.po
    en_US
        LC_MESSAGES
            my_plugin_name.po
Schau dir am Besten das Plugin "search_solr" an, das mit CONTENIDO 4.10.1 mitgeliefert wird.

Im Plugin-Code verwendest du die Funktion i18n(), z. B.:

Code: Alles auswählen

i18n("lblMailFirstline", "my_plugin_name");
In der deutschen po-Datei "contenido/plugins/my_plugin_name/locale/de_DE/LC_MESSAGES/my_plugin_name.po" ist die Übersetzung dazu wie folgt:

Code: Alles auswählen

msgid "lblMailFirstline"
msgstr "Die erste E-Mail Zeile."
In der englischen po-Datei "contenido/plugins/my_plugin_name/locale/en_US/LC_MESSAGES/my_plugin_name.po" ist die Übersetzung dazu wie folgt:

Code: Alles auswählen

msgid "lblMailFirstline"
msgstr "The first eMail line."
Gruß
xmurrix
CONTENIDO Downloads: CONTENIDO 4.10.1
CONTENIDO Links: Dokumentationsportal, FAQ, API-Dokumentation
CONTENIDO @ Github: CONTENIDO 4.10 - Mit einem Entwicklungszweig (develop-branch), das viele Verbesserungen/Optimierungen erhalten hat und auf Stabilität und Kompatibilität mit PHP 8.0 bis 8.2 getrimmt wurde.

snixzz
Beiträge: 22
Registriert: Mi 15. Jul 2020, 16:18
Wohnort: Schweiz
Kontaktdaten:

Re: Send Mail via Plugin

Beitrag von snixzz » Mi 4. Nov 2020, 09:41

Vielen Dank xmurrix,

Mit deiner Hilfe konnte ich das Template in das Plugin auslagern.

Aktuell scheitere ich noch daran, die Übersetzungen auszulagern. Kurze Infos dazu.

Benutzer können an einem Wettbewerb teilnehmen, welche später über das Plugin verlost werden.

Bei der Teilnahme für den Wettbewerb, werde ich die aktuelle Sprache des Teilnehmers speichern. Bei einem Gewinn soll dann die E-Mail in der korrekten Sprache gesendet werden.

Bei der Übersetzung m18in sehe ich keine Möglichkeit die Sprache zu definieren, vielleicht übersehe ich auch etwas :wink:
Ich nehme an es wird automatisch in die aktuelle Sprache übersetzt. Beim Plugin muss ich jedoch eine Sprache gemäss des Teilnehmers setzen können.

Es können pro Verlosung mehrere Gewinner gezogen werden, sprich die Sprache kann sich während einer Ziehung ändern.

Liebe Grüsse aus der Schweiz.

xmurrix
Beiträge: 3143
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Kontaktdaten:

Re: Send Mail via Plugin

Beitrag von xmurrix » Mi 4. Nov 2020, 10:23

Gern geschehen.
snixzz hat geschrieben:
Mi 4. Nov 2020, 09:41
...Beim Plugin muss ich jedoch eine Sprache gemäss des Teilnehmers setzen können...
Versuche vor dem Versenden der E-Mail das Locale entsprechend der Sprache des Teilnehmers zu setzen. Damit sollte es möglich sein, die richtigen Übersetzungen zu verwenden. Hier ein Beispiel-Code:

Code: Alles auswählen

// Aktuelle locale sichern
$belangBackup = $GLOBALS['belang'];

// Locale des Benutzers setzen und Übersetzung initialisieren z. B. 
$GLOBALS['belang'] = 'en_US';

// ... Die Plugin Funktion zum Versenden der E-Mail ausführen ...

// Locale und Übersetzung wieder auf den ursprünglichen Wert setzen
$GLOBALS['belang'] = $belangBackup;
Nachtrag:
Nachdem ich mir den Code der Übersetzungen angesehen habe, gehe ich davon aus, dass das nicht möglich ist.
Anstatt also die Funktion i18n() zu verwenden, kannst du deine eigene Übersetzung definieren.

In der contenido/plugins/my_plugin_name/includes/config.plugin.php:

Code: Alles auswählen

global $myPluginNameLang;

$myPluginNameLang = [
    'de_DE' => [
        'lblMailFirstline' => 'Die erste E-Mail Zeile.'
    ],
    'en_US' => [
        'lblMailFirstline' => 'The first eMail line.'
    ],
];
Dann im Plugin-Code wie folgt verwenden:

Code: Alles auswählen

global $myPluginNameLang;
$lblMailFirstline = $myPluginNameLang['en_US']['lblMailFirstline'];
Gruß
xmurrix
CONTENIDO Downloads: CONTENIDO 4.10.1
CONTENIDO Links: Dokumentationsportal, FAQ, API-Dokumentation
CONTENIDO @ Github: CONTENIDO 4.10 - Mit einem Entwicklungszweig (develop-branch), das viele Verbesserungen/Optimierungen erhalten hat und auf Stabilität und Kompatibilität mit PHP 8.0 bis 8.2 getrimmt wurde.

snixzz
Beiträge: 22
Registriert: Mi 15. Jul 2020, 16:18
Wohnort: Schweiz
Kontaktdaten:

Re: Send Mail via Plugin

Beitrag von snixzz » Mi 4. Nov 2020, 11:18

Vielen Dank für deine Unterstützung.

Hat nicht geklappt mit dem Setzen der $GOBALS aber du hast mich auf die richtige Fährte geführt.

Code: Alles auswählen

// i18nInit vor den Übersetzungen ausführen.
i18nInit($cfg['path']['contenido_locale'], $langHandle);
	
// Übersetzungen kommen hier
....
	
// i18nInit wieder auf ursprünglichen Wert zurücksetzen
i18nInit($cfg['path']['contenido_locale'], $belangBackup);

Liebe Grüsse aus der Schweiz

snixzz
Beiträge: 22
Registriert: Mi 15. Jul 2020, 16:18
Wohnort: Schweiz
Kontaktdaten:

Re: Send Mail via Plugin

Beitrag von snixzz » Mi 4. Nov 2020, 17:14

Kurzes Update.

Code: Alles auswählen

i18nInit($cfg['path']['contenido_locale'], $langHandle)
Scheint nur einmalig zu funktionieren. bzw. ist nicht geeignet für mehrere Teilnehmer mit unterschiedlichen Sprachen.

Gibt es noch weitere Ansätze die gewünschte Funktionalität zu erreichen?

Liebe Grüsse aus der Schweiz

xmurrix
Beiträge: 3143
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Kontaktdaten:

Re: Send Mail via Plugin

Beitrag von xmurrix » Mi 4. Nov 2020, 17:52

snixzz hat geschrieben:
Mi 4. Nov 2020, 17:14
...

Code: Alles auswählen

i18nInit($cfg['path']['contenido_locale'], $langHandle)
Scheint nur einmalig zu funktionieren. bzw. ist nicht geeignet für mehrere Teilnehmer mit unterschiedlichen Sprachen.

Gibt es noch weitere Ansätze die gewünschte Funktionalität zu erreichen?
...
Probiere es mit dem Beispiel, das ich im Kommentar unter "Nachtrag" angegeben habe, also mit einer eigenen Übersetzung.
CONTENIDO Downloads: CONTENIDO 4.10.1
CONTENIDO Links: Dokumentationsportal, FAQ, API-Dokumentation
CONTENIDO @ Github: CONTENIDO 4.10 - Mit einem Entwicklungszweig (develop-branch), das viele Verbesserungen/Optimierungen erhalten hat und auf Stabilität und Kompatibilität mit PHP 8.0 bis 8.2 getrimmt wurde.

snixzz
Beiträge: 22
Registriert: Mi 15. Jul 2020, 16:18
Wohnort: Schweiz
Kontaktdaten:

Re: Send Mail via Plugin

Beitrag von snixzz » Do 5. Nov 2020, 08:24

Sorry habe den Nachtrag übersehen.

Jetzt hat's geklappt! Vielen Dank.

Antworten