2 Module für gleichen Bereich ?

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.

Ist das richtig?

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…

Super, Danke.

Das hat funktioniert.

Jetzt habe ich doch noch ein Problem mit 2 Modulen.

Struktur:
modules/mymod/abc/modul1
modules/mymod/def/modul2

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 :wink:

D.h. ich muss die Session in beiden Modulen zurück setzen ?

Wie mache ich das genau ?

Cookies löschen.

OK, Cookies habe ich gelöscht, es geht aber trotzdem nicht.

Habt ihr mir noch einen Tipp ?

Evtl. irgendwo Großbuchstaben in metadata.php oder Klassennamen verwendet. Oder bei Modul 1 und Modul 2 gleiche Klassennamen verwendet.

  • keine Großbuchstaben
  • unterschiedliche Klassennamen sowie Dateinamen
    • modul1/mod_oxbasket
    • modul2/mod2_oxbasket

Sobald Modul2 aktiv ist, werden die Änderungen in Modul1 für den oxbasket nicht mehr verwendet.

Dann zeig doch mal dein Modul.

Ich habe es im Moment so gelöst, dass ich beide Module zu einem gemerge habe. Nun funktioniert alles.

Aber ich werde sobald ich dazu komme nochmals ein Beispiel erstellen und es hier posten.

Erst mal Danke an alle.

Wie versprochen hier ein Beispiel.

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.

Wieso löschen heute alle ihre Beiträge? Du hattest 2x den gleichen Klassennamen verwendet.

Wie versprochen hier ein Beispiel.

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 !?

Siehe Posting #13

@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.

Vielen Dank für Eure Hilfe.

Wenn du als Prefix für die Klassen nicht Vendor verwendest (womic_order) sondern Modul-Id (womicmod1_order) dann hast du automatisch eindeutige Namen.

Das ist eine gute Idee mit der Modul-ID.
Ich werde das in meinem Modulen so anwenden.