Mails erneut senden - zu wenig Speicher

#1

Hallo zusammen,

ich habe bei den Bestellungen einen neuen Reiter im Backend erstellt um die Bestellmails erneut senden zu können.

Der Code sieht gekürzt so aus:
$oEmail = oxNew( ‘oxemail’ );
$oOrder = oxNew( ‘oxorder’ );
$oOrder->load($oxid);
$oOrder->getOrderArticles();
$oEmail->sendOrderEmailToUser($oOrder);

print_r($oOrder); zeigt mir alle Daten der Bestellung.

Beim Senden der Mail bekomme ich diese Meldung:
Fatal error: Allowed memory size of 536870912 bytes exhausted

Kommentiere ich die letzte Zeile aus, gibt es keinen Fehler.

Der Shop (Community Edition 4.10.4) läuft bei AllInkl und habe in der htaccess den Speicher auf 512M erhöht.

Warum braucht diese Mail so viel Speicher?
Muss ich etwas anders machen? Was habe ich vergessen?

Viele Grüße
Thoni

#2

Trotz …

public function sendOrderEmailToUser($oOrder, $sSubject = null)
{
}

einer testweise geleerten Funktion gibt es die Fehlermeldung.
Sie wird hier erzeugt:
/core/oxstrmb.php on line 222

An der Stelle steht:
return preg_replace($aPattern, $sString, $sSubject, $iLimit, $iCount);
in der …
public function preg_replace

#3

Die Erweiterung ’ Exceptions-Benachrichtigung’ brachte den Fehler.

Die Mail kommt nun an, aber mit dem Inhalt:

Warning : Smarty error: unable to read resource: “email/html/order_cust.tpl” in /www/htdocs/xxx/core/smarty/Smarty.class.php on line 1094

#4

Wenn ich an den Shopbetreiber die Mail erneut senden möchte (sendOrderEmailToOwner), bekomme ich das im Backend:

#5

&&

#6

Danke rubbercut,

das hat mich einen Schritt weiter gebracht.

Es funktioniert leider immer noch nicht, weil das basket-Objekt nicht vorhanden ist.
Kann man das im Template erzeugen (bestimmt) und aus dem order-Objekt einfach befüllen oder muss man jede position adden?

#7

Ich habe es so versucht:
[{if $basket == NULL}]
[{php}]
$basket = oxNew(“oxBasket”);
$order = $this->get_template_vars(‘order’);
foreach ($order->getOrderArticles() AS $article) {
$basket->addOrderArticleToBasket($article);
}
[{/php}]
[{assign var=“basket” value=$basket }]
[{/if}]

Dann kommt aber dieser Fehler:
Fatal error : Call to a member function getBasketArticles() on NULL

… in dieser Zeile:
[{assign var=“basketitemlist” value=$basket->getBasketArticles() }]

#8

Nein, man kann es nicht einfach im Template erstellen. Schau dir mal in der DB die oxorderremarks an (ggf ox remarks), da sind html Versionen von verschickten Bestellmails in der DB gespeichert. In der Benutzerverwaltung ist das der Reiter “Historie”

#9

Danke vanilla_thunder,

leider gingen durch einen Fehler ein paar Mails nicht raus und diese sind auch nicht in der Historie.

#10

Ich habe oxOrder um diese Funktion erweitert:

class addtobasket extends addtobasket_Parent
{
public function setBasketFromOrder () {
$basket = oxNew(“oxbasket”);
foreach ($this->getOrderArticles() AS $oArticle) {
$basket->addOrderArticleToBasket($oArticle);
}
$this->_oBasket = $basket;
}
}

Nun gibt es ein Basket-Objekt im Template, aber es gibt auch wieder einen Fehler:
Function ‘getThumbnailUrl’ does not exist or is not accessible! (oxOrderArticle)

Die gesuchte Funktion gibt es in oxArticle.

#11

$oBasket = $oOrder->_getorderBasket(); //(resp. $this-> )

#12

Leider ändert sich nichts.

#13

Ich bin jetzt weiter gekommen:

class addtobasket extends oxorder
{
public function setBasketFromOrder () {
$basket = oxNew(“oxbasket”);
foreach ($this->getOrderArticles() AS $oArticle) {
$basket->addToBasket($oArticle->getProductId(),$oArticle->oxorderarticles__oxamount->value,NULL,$oArticle->getPersParams());
}
$basket->setPayment($this->oxorder__oxpaymenttype->value);
$basket->calculateBasket();
$this->_oBasket = $basket;
}
}

Fehler: ‘Call to a member function getRawValue() on null’ bei der Ausgabe der zahlungsart.

#14

Das Payment wird aus $order ausgelesen, aber auch …
$this->_setPayment($this->oxorder__oxpaymentid->value);
… bringt nichts.

#15

Nicht nur dort. Bevor Du hier verzweifelst: Anbei eine Demo, mit einer Methode (sendemailnochmal()) und 2 Hilfsmethoden (s.o.). Damit kannst die Mails in einem neuen Order-Tab erneut versenden: Link entfernt

1 Like
#16

Vielen Dank,

es funktioniert nun.
Nur eine Zeile fehlte bei mir:
$this->_oPayment = $Payment;

Mit “Das Payment wird aus $order ausgelesen” meinte ich im Template order_cust.tpl:
[{assign var=“payment” value=$order->getPayment() }]