Modul Erstellung für den OXID eShop
Dies ist ein Gastbeitrag von Peter Rother.
Wie vielleicht schon einige mitbekommen haben, ist der kommerzielle eShop von OXID seit nun mehr als einem Jahr auch in einer Open Source Variante (unter der GPL) verfügbar. Für all diejenigen, die sich bisher nur mit Magento beschäftigt haben, möchte ich mit dieser kurzen Einführung einmal zeigen, wie einfach der OXID Shop durch seine eingebaute Modul Logik zu erweitern ist.
Im Shop können bis auf wenige Ausnahmen alle Klasse durch eigene Erweiterungen überladen werden, ohne das in den Quellcode des Shops eingegriffen werden muss. Der Vorteil hierbei ist selbstverständlich, dass die Update Fähigkeit hierdurch in keiner Weise eingeschränkt wird.
Die Anwendung arbeitet hierbei mit einem ausgeklügelten System zum Chaining von Modulen. Die Module werden dabei „on the fly“ im Shop in die Vererbungskette eingebunden, wodurch sich auch mehrere Module, die ein und dieselbe Klasse überladen, nicht in die Wege kommen.
Ein typischer Eintrag im Backend könnte z.B. folgend aussehen:
oxarticle => myModul/increaseMyArticlePrice
Weitere Erweiterungen werden mit dem & Zeichen an den Moduleintrag gekoppelt:
oxarticle => myModul/increaseMyArticlePrice&myOtherModul/doesSomeGreatStuff
Die Module erweitern in diesem Fall beide die Klasse oxarticle, ohne von einander zu wissen und ohne in den Shop eigenen Quellcode eingreifen zu müssen.
Zeit für ein bisschen Magie
Wie bereits angesprochen verwendet der Shop bei der Klassen Erweiterung eine Methode, um während der Laufzeit eine Vererbungs Hierarchie zu erstellen. Zu beachten sei hierbei, dass als erstes immer das letzte Modul aus der Kette der Moduleinträge angesprochen wird und die weiteren Module von rechts nach links folgen. Es sollte außerdem beachtet werden, immer den parent Aufruf einer zu überladenen Methode aufzurufen, damit wir nicht andere Module, die die gleiche Methode überlagern, ausgrenzen.
Ein kleine Klasse, die in diesem Fall einfach nur den Artikelpreis um 10% erhöht, könnte damit folgendermaßen implementiert werden:
class increaseMyArticlePrice extends increaseMyArticlePrice_parent
{
public function getBasePrice( $dAmount = 1 )
{
$dPrice = parent::getBasePrice( $dAmount );
return $dPrice * 0.10;
}
}
Das Modul bekommt hier den vom Shop generierten Preis durch den parent Aufruf und wir rechnen noch einmal 10% hinzu. Das ist jetzt mit Sicherheit kein Parade Beispiel, es soll auch nur zeigen wie einfach man den Shop um eigene Module erweitern kann. Was dem aufmerksamen Leser hier bestimmt auffällt ist, dass wir von einer nicht vorhandenen Klasse Namens increaseMyArticlePrice_parent erben. Intern wird hierüber die Vererbung zu anderen Modulen und der eigentlich zu erweiternden Shop Klasse erstellt.
Das war es auch schon zu unserer kleinen Einführung in die Modul Erstellung für den OXID eShop. Alle die einmal über den Magento ( oder andere Shopsysteme ) Tellerrand schauen möchten, möchte ich noch ein Paar weiter führende Links mitgeben.
Download der Open Source Version:
http://www.oxid-esales.com/de/download/open-source-software-oxid-eshop-community-edition
Oxidforge:
http://www.oxidforge.org/wiki/Main_Page
Forum:
http://www.oxid-esales.com/forum/
Developer Mailing List:
http://www.oxidforge.org/wiki/Mailinglists
Danke für die kurze Einführung. Ich würde mich freuen, in Zukunft mehr über OXID eShop zu lesen, zum Beispiel über Vor- und Nachteile gegenüber anderen Shop-Systemen in den üblichen Problembereichen Geschwindigkeit, Import-/Export-Schnittstellen etc.
PS: werden bei deiner Berechnung nicht 10 statt 110 Prozent des Artikelpreises zurückgegeben?
@Matthias, ich kann ja mal gucken ob ich mit Damian eine kleine Gegenüberstellung zu OXID und Magento hinbekomme. Die Nachteile die jede Software mitbringt, sollen natürlich nicht verschwiegen werden.
Du hast übrigens Recht, bei dem Beispiel werden nur 10% anstatt 110% zurück gegeben. Vielleicht kann Nils das einmal anpassen.
Hi Nils, auch wenn der Artikel schon 3 Jahre alt ist, könntest du den Fehler im Text (siehe andere Kommentare) ja vielleicht noch beheben. 😉
Gruß
Roman