Email Neuer Kunde - Template bringt Fehlermeldung

Hallo zusammen,

ich bin gerade dabei ein Modul zu erstellen, welches Kunden aus dem WaWi importiert, in Oxid anlegt und anschließend eine Mail verschickt.
Ich habe dazu die Originaldateien OrderOverview.php, Email.php und order_cust.tpl als Grundlage genommen.
Import und Anlegen der Kunden klappt erfolgreich. Lediglich beim Emailversand kommt es zur folgenden Fehlermeldung:

Fatal error: Uncaught Error: Call to a member function getShop() on null in /home/xyz/abc.company.net/source/tmp/smarty/cc4a7056501ecdae1ca60eba3c65e410^%%04^04D^04D10A41%%kundenimport_email_html.tpl.php:3 Stack trace: #0 /home/xyz/abc.company.net/vendor/smarty/smarty/libs/Smarty.class.php(1270): include() #1 /home/xyz/abc.company.net/source/modules/vendor/module/Core/sendData.php(130): Smarty->fetch(‘kundenimport_…’) #2 /home/xyz/abc.company.net/source/modules/vendor/module/Application/Model/kundenimport.php(262): sendData->sendEmail(Object(OxidEsales\Eshop\Application\Model\User), ‘’, ‘123456’) #3 /home/xyz/abc.company.net/source/modules/vendor/module/public/kundenimport_cron.php(58): kundenimport->KundenImport(’/home/xyz/…’, ‘Kunden.csv’, ‘|’, ‘"’) #4 {main} thrown in /home/xyz/abc.company.net/source/tmp/smarty/cc4a7056501ecdae1ca60eba3c65e410^%%04^04D^04D10A41%%kundenimport_email_html.tpl.php on line 3

In der abgewandelten order_cust.tpl beginne ich wie im Original mit den folgenden Zeilen:

[{assign var="shop"      value=$oEmailView->getShop()}]
[{assign var="oViewConf" value=$oEmailView->getViewConfig()}]
[{assign var="user"      value=$oEmailView->getUser()}]

Da will er aber nicht akzeptieren. Was mache ich falsch?
Danke für eure Unterstützung.

“als Grundlage genommen” sagt jetzt nicht all zu viel aus darüber, was davon geblieben oder was daran verändert wurde.
Ist diese Zeile noch drin?

Aus der Email.php wurde die Funktion sendSendedNowMail abgewandelt, sodass nicht die order-Details benutzt werden, sondern die des users.

In der oben erwähnten Funktion habe ich folgende Zeile:
$this->setViewData("shop", $shop);

Ich habe es mal entsprechend deinem Vorschlag angeändert, aber es gibt keine Änderung in der Fehlermeldung.

der wichtige Teil der Fehlermelduing ist “Call to a member function getShop() on null”,
das bedeutet in etwa: die Variable, deren Funktion getShop() ausgeführt werden muss, gibts nicht.
Das wäre dann diese Zeile: [{assign var="shop" value=$oEmailView->getShop()}]
Deswegen würde $this->setViewData("shop", $shop); auch nicht zur Lösung beitragen.

Erbt Deine Klasse “sendData” von Email oder von PhpMailer?

1 Like

Die erbt von Email.

Probier mal oxemail

Nachtrag:
Sorry. ist ja 6x. Dann sollte

\OxidEsales\Eshop\Core\Email::class => \vendor\module\folder\file::class,

stimmen.

Da ich noch mit files arbeiten musste, habe ich oxemail im extend-array in der metadata (version 1.1).

Wie sieht denn die Versandfunktion aus?

public function sendRegisterEmail($user, $subject = null)
{
    $sMailTemplateSubject = 'email_subject.tpl';
    $sMailTemplateHTML    = 'email_html.tpl';
    $sMailTemplatePLAIN   = 'email_plain.tpl';
	
	$myConfig = $this->getConfig();

  
	$shop = $this->_getShop();

    //set mail params (from, fromName, smtp)
    $this->_setMailParams($shop);

    //create messages
    $lang = \OxidEsales\Eshop\Core\Registry::getLang();
	$smarty = $this->_getSmarty();
	$this->setViewData('oEmailView', $this);
	

    // Process view data array through oxoutput processor
    $this->_processViewArray();

	$this->setUser($user);  // old

    //V send email in order language
    $oldTplLang = $lang->getTplLanguage();
    $oldBaseLang = $lang->getBaseLanguage();


    // force non admin to get correct paths (tpl, img)
    $myConfig->setAdminMode(false);
    
	$this->setBody($smarty->fetch($sMailTemplateHTML));
    $this->setAltBody($smarty->fetch($sMailTemplatePLAIN));
	
    $myConfig->setAdminMode(true);
    $lang->setTplLanguage($oldTplLang);
    $lang->setBaseLanguage($oldBaseLang);

    //Sets subject to email
	$this->setSubject(($subject !== null) ? $subject : $this->$sMailTemplateSubject);
	$sFullName = $user->oxuser__oxfname->getRawValue() . " " . $user->oxuser__oxlname->getRawValue();

	$this->setRecipient($user->oxuser__oxusername->value, $sFullName);
    $this->setReplyTo($shop->oxshops__oxorderemail->value, $shop->oxshops__oxname->getRawValue());

    return $this->send();
}

D.h. Du benutzt die gleichnamige Funktion (angepasst) aus dem Shop in der Erweiterung von oxemail?

Copy-Paste Fehler, sorry. Funktion heißt sendRegisterEmail_xyz. Habe es beim Bereinigen übersehen.

Eine Anpassungen zum Original ist die Zeile $renderer = $this->getRenderer();
Die habe ich ersetzt durch $smarty = $this->_getSmarty();

Wie muss ich die ViewData richtig setzen, sodass ich sie im tpl wieder aufgreifen kann?
Wenn ich den Body nicht mit dem Template verknüpfe, sondern einfach ‘Body’ übergebe, wird die Mail sauber verschickt.

Es gibt im Original keine Zeile

$renderer = $this->getRenderer();

Umgekehrt? Also

$smarty = $this->_getSmarty();

durch

$renderer = $this->getRenderer();

ersetzt?

doch, doch, seit der Implementierung von Twig wurde es auf $renderer = $this->getRenderer(); umgestellt

könntest du es mal mit $renderer Zeug probieren?
ich habe mal den Code der beiden Funktionen verglichen und es scheint so, als würden bei ‘_getSmarty’ ein paar Schritte fehlen.

in 6.1?

Aber gut, wenn eine neuere Version als angegeben benutzt wird, ist klar, dass etwas vermischt wird. Hier müsst man den kompletten Code haben, um helfen zu können.

Habe ich gemacht, dann bekomme ich aber diese Fehlermeldung:

Fatal error : Uncaught OxidEsales\Eshop\Core\Exception\SystemComponentException: Function ‘getRenderer’ does not exist or is not accessible!

Enschuldige bitte die Verwirrung. Es geht um Version 6.2. Mit Original meinte ich die Original-Funktion sendRegisterEmail. Meine abgewandelte Funktion heißt sendRegisterEmail_xyz und unterscheidet sich eigentlich nur in der oben erwähnten Render-Funktion und anderen Templates. Das ist alles. Ich hoffe, das hilft beim Nachvollziehen. Danke für die Geduld mit mir. :slight_smile:

Das liegt an

private function getRenderer()

Ist aber auch nicht nötig und es wäre sicher schon längst erledigt, wenn man sich das Modul (zumindest die metadata inkl. der von oxemail erbenden Klasse) anschauen könnte.

Hallo rubbercut. Die Versandfunktion hatte ich bereits oben eingekopiert.
Anbei die metadata:

‘extend’ => array(
‘oxemail’ => ‘vendor/module/Core/sendData’,
),
‘files’ => array(
‘kundenimport’ => ‘vendor/module/Application/Model/kundenimport.php’,
),
‘templates’ => array(
‘email_html.tpl’ => ‘vendor/module/Application/views/admin/tpl/email/kundenimport_html.tpl’,
‘email_plain.tpl’ => ‘vendor/module/Application/views/admin/tpl/email/kundenimport_plain.tpl’,
‘email_subject.tpl’ => ‘vendor/module/Application/views/admin/tpl/email/kundenimport_subject.tpl’,
),

Konnte mir 6.2 gerade mal näher anschauen. Füge

use OxidEsales\EshopCommunity\Internal\Framework\Templating\TemplateRendererBridgeInterface;

und

private function getRenderer()
{
$bridge = $this->getContainer()->get(TemplateRendererBridgeInterface::class);
$bridge->setEngine($this->_getSmarty());

    return $bridge->getTemplateRenderer();
}

in sendData.php ein. Und die Verarbeitung entsprechend auf

$this->setBody($renderer->renderTemplate(…

umstellen.

Macht das denn überhaupt Sinn, dass die getRenderer private ist? Die wird doch praktisch bei jeder Erweiterung der Email-Klasse benötigt…

IMHO nein.