Hallo,
ich fange gerade an mich mit dem erstellen von Modulen zu beschäftigen.
Eine Frage habe ich:
Module erweitern ja die Klassen, in denen sie eingreifen wollen.
Wenn ich nun 2 Module habe, die oxarticle erweitern, und zwar dieselbe Methode,
denke ich dass das 2. Modul das 1. überschreibt und beide nicht gleichzeitig verwendet werden kann.
Im Grunde genommen ist das erst mal richtig, ja.
Du kannst jedoch erreichen, dass beide Modul-Methoden angesprochen werden, indem du einen parent-Call machst.
Du überlädst in beiden Modulen z.B. die Methode getTitle().
Dann sieht das folgendermaßen aus:
modules/module_a/models/module_a_oxarticle.php:
public function getTitle()
{
$sTitle = parent::getTitle();
return str_replace( 'teuer kaufen', 'günstig kaufen' );
}
modules/module_b/models/module_b_oxarticle.php:
public function getTitle()
{
$sTitle = parent::getTitle();
return str_replace( 'günstig kaufen', 'sehr günstig kaufen' );
}
Wenn du den parent-Call nicht machst, wird die “übergeordnete” Methode auch nicht ausgeführt, was jedoch zu unerwartetem Verhalten im Shop führen kann.
Ich hoffe das ist einigermaßen verständlich erklärt…
In beiden Modulen wird u.a. der oxbasket erweitert.
modul1:
1 vorhandene Methode wird überschrieben
1 neue Methode aaa die von der überschriebenen Methode gerufen wird
modul2:
2 neue Methoden bbb und ccc
Jetzt ist es so, dass modul1 soweit funktioniert, nur alles was in dem überschriebenen oxbasket gemacht werden soll, wird nicht gemacht. Es wird wohl die Methode aus dem Original-Code verwendet.
In modul2 funktioniert alles.
Wenn ich modul2 deaktiviere, geht in modul1 alles
Muss ich da auch irgendwie den Parent rufen ?
Oder liegt es daran, dass in beiden Modulen die Klassen die oxbasket überschreiben die gleichen Namen haben?
Bei Überladungen im oxBasket muss man etwas beachten.
Das Objekt wird in die Session geschrieben!
Wenn du also ein Modul erstellst, welches den oxBasket überlädt, musst du einmal komplett deine Session zurücksetzen, damit deine Methoden überhaupt geladen werden.
Wahrscheinlich hilft das schon
Diese beiden Module erweitern die Klasse order.php mit jeweils einem eigenen Feld.
Einmal einem Beraternamen, und einmal mit einer Lieblingsfarbe die dann in order.tpl angezeigt werden.
Jedes für sich funktioniert, jedoch zusammen geht nur eins.
Die Idee dahinter ist z.B. wenn ich 2 getrennte Module erstellen möchte, oder ich Module von anderen Entwicklern einsetzen möchte, die die gleiche Klasse überschreiben.
Da ich davon ausgehe, dass es möglich sein muss, dass beide gleichzeitig funktionieren, würde ich gerne wissen, welchen Fehler ich beim Überschreiben mache.
Im Anhang ist ein Verzeichnis mit 2 Modulen drin. Beide Module erweitern die Klasse order.php und schreiben in die order.tpl einmal einen Beraternamen, und einmal eine Lieblingsfarbe rein. (Step 4 des Checkout).
Wenn beide Module aktiv sind, kommt eine Fehlermeldung, dass getLieblingsFarbe (aus 2. Modul) nicht vorhanden ist.
Ist nur das 2. Modul aktiv, funktioniert das 2. Modul ohne Fehlermeldung.
Der Hintergrund zu diesem Beispiel ist der, dass es doch möglich sein muss, eine Klasse 2 mal zu überschreiben, ohne dass es Fehler gibt.
Möchte ich z.B. 2 getrennte Module erstellen, oder 2 Module anderer Entwickler einsetzen, die die gleiche Klasse überschreiben.
Ich gehe davon aus, dass ich beim Überschreiben irgend ein Fehler gemacht habe !?
@leofonic:
Sorry, beim 1. mal haben die Module aus dem Zip generell nicht funktioniert, und ich habe keine Möglichkeit gefunden, nur das Zip zu löschen.
Aber du hast recht. Es lag am gleichen Klassennamen.
D.h. bei Modulen von anderen Entwicklern sollte das Problem durch den eigenen Prefix nicht auftreten, und bei den eigenen Modulen muss ich aufpassen, die Klassennamen nicht doppelt zu vergeben.