Einleitung

Standardgemäß werden im oxBasket Model, welches in der Session in OXID hinterlegt wird alle relevanten Informationen zu einem Bestellvorgang transportiert. Sei es die Warenkorbartikel,
Liefer- und Rechnungsanschrift oder ähnliches. Daher eignet sich das Erweitern von oxBasket auch prinzipiell gut um weitere Daten später an oxOrder zu übergeben. Ebenso ist das oxBasket-Objekt in der Session überall in OXID auffindbar, auch bereits vor dem Checkout-Prozess, weswegen es sich auch ebenfalls zur Mitgabe von Daten eignet.

Implementation

Für die Implementation von weiteren Feldern müssen wir einige bestehende Klassen in OXID modulseitig überladen. OxBasket alleine reicht uns nicht. Wir müssen schließlich die Daten, auch wenn wir sie bereits in das oxBasket-Objekt geschrieben haben, transportieren. Dazu muss ebenso auch die oxSession-Klasse überladen werden. In dieser ist standardgemäß keine sichtbare „Save“-Methode für den oxBasket implementiert. Es gibt zwar die Methode „freeze“, auf die für einen Speichervorgang zugegriffen werden kann, jedoch beendet diese auch nach dem Schreibzugriff die Session und ist daher nicht optimal einsetzbar.

oxBasket überladen
<?php
	class myCustomoxBasket extends myCustomoxBasket_parent{
		
		private $_oAnyRelevantObject;
		private $_sAnyRelevantField;
		
		public function setAnyRelevantObject(AnyRelevantObject $oAnyRelevantObject){
			$this->_oAnyRelevantObject = $oAnyRelevantObject;
			return $this;
		}
		
		public function getAnyRelevantObject(){
			return $this->_oAnyRelevantObject;
		}
		
		
		public function setAnyRelevantField($sAnyRelevantField){
			$this->_sAnyRelevantField = $sAnyRelevantField;
			return $this;
		}
		
		public function getAnyRelevantField(){
			return $this->_sAnyRelevantField;
		}
	}
oxSession überladen
<?php
	class myCustomoxSession extends myCustomoxSession_parent{

		/**
		 * Save Basket to Session
		 * @param oxBasket $oBasket
		 * @return $this
		 */
		public function saveBasket(oxBasket $oBasket){
			$this->setBasket($oBasket);
			$this->setVariable($this->_getBasketName(), serialize($oBasket));
			return $this;
		}
		
	}

Die Methode setBasket die in der saveBasket Methode von uns aufgerufen wird, ist enorm wichtig. Sollte ein modifizierter Warenkorb gespeichert werden, so muss das Attribut $_oBasket der Klasse gesetzt werden.
Andernfalls kann es auftreten, dass Daten worauf ggf. während einer Laufzeit nach dem Speichervorgang Informationen z.B. am Frontend nicht bereitstehen.

oxSession greift erst auf die Session zu, wenn $_oBasket als Attribut leer ist, damit werden unnötige Lesezugriffe auf die eigentliche Session unterbunden.

Schreibender Zugriff
<?php

	$oAnyRelevantObject = oxNew("AnyRelevantObject");

	$oSession = $this->getSession();
	$oBasket  = $oSession->getBasket();
	$oBasket->setAnyRelevantObject($oAnyRelevantObject);
	$oBasket->setAnyRelevantField("foobar");
	$oSession->saveBasket($oBasket);

Im Anschluss kann aus jeder anderen Klasse heraus auf die geschriebenen Daten zugegriffen werden, wenn diese in der Session abgelegt sind.

0