Guten Abend
möchte gerne die Methode init() im Controller thankyou.php überschreiben
Original
public function init()
{
parent::init();
// get basket we might need some information from it here
$oBasket = $this->getSession()->getBasket();
$oBasket->setOrderId( oxSession::getVar( 'sess_challenge' ) );
// copying basket object
$this->_oBasket = clone $oBasket;
// delete it from the session
$oBasket->deleteBasket();
oxSession::deleteVar( 'sess_challenge' );
}
Überschriebene Methode
public function init()
{
#parent::init();
// get basket we might need some information from it here
$oBasket = $this->getSession()->getBasket();
$oBasket->setOrderId( oxSession::getVar( 'sess_challenge' ) );
// copying basket object
$this->_oBasket = clone $oBasket;
// delete it from the session
#$oBasket->deleteBasket();
#oxSession::deleteVar( 'sess_challenge' );
}
Wie Ihr seht habe ich $oBasket->deleteBasket(); und oxSession::deleteVar(‘sess_challenge’); auskommtiert. Den dies möchte ich erst nach der Methode render() ausführen. Zusätzlich habe ich die parent::init(); auskommentiert.
Problem
parent::init() sorgt dafür, dass die Methoden aus der oxUBase und oxView verfügbar sind. Beziehungsweise, dass diese Methoden überladen oder erweitert werden können. Fehlen diese führt dies zu Folge-Problemen…
Ziel
Methode init() zu überschreiben ohne, dass folgender Code ausgeführt wird:
$oBasket->deleteBasket();
oxSession::deleteVar( 'sess_challenge' );
Auf der Thankyou Seite sollen nochmal alle bestellten Artikel angezeigt werden + die Gesamtsumme.
Bisheriger Bug
Liegt im Warenkorb ein Artikel, bei welchem der Lagerbestand = 1 ist. Steht dieser auf der Thankyou Seite $oBasket->getBasket() nicht mehr zur Verfügung. Dies führt dazu, dass z.B. die zu bezahlende Gesamtsumme falsch ausgewiesen wird…
Hintergrund
Der Klone des $oBasket enthält wahrscheinlich Referenzen. Das spätere Löschen des Originals führt wahrscheinlich dazu, dass ein Artikel mit Lagerbestand = 1 aus dem Klone Basket entfernt wird und dieser auf der Thankyou Seite nicht mehr in $oBasket zur Verfügung steht.
Siehe auch http://php.net/manual/de/language.oop5.cloning.php:
“Wenn ein Objekt geklont wird, wird PHP 5 eine seichte Kopie der Eigenschaften des Objektes durchfuehren. Alle Eigenschaften, die Referenzen auf andere Variablen sind, werden Referenzen bleiben.”
Jemand eine Idee? Ratschlag?
Viele Grüße
indianer3c