View template abhängig vom mandanten laden

Neuer Tag, neue Frage :slight_smile: Informationen zu EE Themen zu finden ist echt schwierig :frowning:

Heute möchte ich mit meinem Module folgendes realisieren. Ich habe 5 Mandanten. 4 davon laden ein DefaultTemplate, aber 1 Mandant braucht ein ExtraTemplate. Wie bekomme ich das hin? Ich habe das hier im Wiki gefunden und etwas damit rumprobiert, allerdings bekomme ich kein vernünftiges Ergebnis: wiki.oxidforge.org/Tutorials/How_template_hierarchy_and_override_system_works

ich habs jetzt so versucht:
+meinModul
++views
+++azure
++++2 <- ShopId von ExtraWurstShop
+++++tpl
++++++template.tpl <- abgeändertes template
++++tpl
+++++template.tpl <- default template für shops 1/3/4/5

Irgendwie macht das ja auch keinen Sinn, weil ich in meiner metadata.php den Pfad zum Template ja konkret angebe. Die ganzen Funktionen die auch im Wiki stehen (getTemplatePath usw.) liefern auch keine Unterscheidung nach Shops oder Sprachen.

erweitere die render() damit die je nach Shop das richtige Template ändert

Hmm… ist das so eine spezielle Anforderung, dass die EE das nicht automatisch unterstützt? Wenn man mit Subshops arbeitet kommt das doch häufig vor - zumindest haben wir in unserem alten Shop einige solcher Ausnahmen.

Dann mal ne Frage zur Struktur. Wenn man die render() Funktion überschreibt, soll das ja für alle Module so sein. Wo packe ich das dann am besten hin? In mein ModulX ist ja quatsch, nur weil es diese Funktion jetzt gerade als erstes braucht. Wenn ich die eigentliche Funktion von ModulX irgendwann nicht mehr brauche kann ich es nicht rausschmeißen, weil es die render() Funktion überschreibt. Habt ihr eine Art System-Modul für sowas, oder wie macht ihr das?

Hallo udel,

ich habe auch verstanden, dass es genau so funktionieren soll. Wenn es nicht tut, sollte der Support weiterhelfen können. Ggf. müssten wir dann die Tutorials anpassen, würd’ mich über eine Rückmeldung hier freuen.

Gruß

[QUOTE=Marco Steinhaeuser;109725]ich habe auch verstanden, dass es genau so funktionieren soll.[/QUOTE]

Hi Marco,

dann werde ich noch mal 1-2 Versuche machen (nicht das es wieder PEBKAC ist :)) und mich dann gegebenenfalls an den Support wenden. Rückmeldung bekommt ihr natürlich!

[QUOTE=udel;109712]
Irgendwie macht das ja auch keinen Sinn, weil ich in meiner metadata.php den Pfad zum Template ja konkret angebe. Die ganzen Funktionen die auch im Wiki stehen (getTemplatePath usw.) liefern auch keine Unterscheidung nach Shops oder Sprachen.[/QUOTE]
Das Override-System ist nicht für Module sondern für Templates und funktioniert nur in den Template-Ordnern (out/template/tpl bzw. application/views/template/tpl). Auch in den custom Template-Ordnern. Dort kannst du entsprechend der Struktur im Wiki Templates in Ordnern anlegen, die dann automatisch geladen werden. getTemplatePath wird z.B. mit einem relativen Pfad aufgerufen, und liefert dann automatisch das richtige Template, auch unterschieden nach Sprachen oder Shop.

Wenn du ein Template mit “templates” in einem Modul definierst, gibt es kein Override dafür sondern genau dieses Template wird geladen. Du kannst natürlich in deinen eigenen Controllern mit der render-Methode steuern welches Template geladen wird, aber so wie du das beschreibst brauchst du gar kein Modul.

Hi Frank,

besten Dank für die Antwort. Leider bringt mich das noch nicht so wirklich weiter. Was ich erreichen möchte ist ein völlig unabhängiges Modul, das heißt auch die Templates sollen im Modulordner liegen. Das funktioniert auch super, solange man kein anderes Template für einen anderen Mandanten laden möchte.
Nach meiner Vorstellung müsste das Modul, wenn ich die Struktur von application/views dort nachbaue, das jeweils gültige Template für den Mandanten laden.

Also
Shop1 hat Template1
Shop2 hat Template2(ein Child von Template1)

In applications/views habe ich:
template1/ <- theme.php und ganz viele Standardtemplates
template2/ <- nur theme.php mit verweis auf template1

Dann baue ich diese Verzeichnisstruktur in meinem Modul nach:
meinModul
+views
++template1/foo.tpl
++template2/foo.tpl <- anderer Inhalt als foo.tpl von template1

foo.tpl von template1 kann ich über die metadata.php auch laden, aber da ich dort den kompletten pfad bis zu foo.tpl angeben muss, nimmt mein Modul immer template1/foo.tpl, obwohl ich gerade im Mandanten mit dem template2 bin. Das ist ja Quatsch!? Warum kann ich in metadata.php nur 1 Template fix angeben, wenn sich das für jeden Mandanten ändert?

Die Lösung mit den Templates unter application/views würde zwar gehen, allerdings führt das den Modul-Gedanken ja ad absurdum!? Kann ich mit Oxid meinen Plan nicht umsetzen?

Ok, die Antwort vom Support ist da:

as a solution - there are two options:

  1. need special render in the module, which handles by his own the overwritting of the templates according the shop ID
  2. other much more easy solution - put that template in the eshop dir for subshops… but then it will not depend on the module. means - even if module is uninstalled - subshops will use these custom templates

Schade eigentlich. Ich halte es für ein sinnvolles Feature ein Modul wirklich komplett vom ganzen Rest abzukapseln. Ich arbeite seit 5 Jahren mit einem Multishop (Eigenentwicklung) und was sich da an Datenmüll ansammelt, weil Module nicht komplett entfernt wurden ist nicht unerheblich.
Der “templates” Eintrag in der metadata.php zeigt ja auch, das OXID diesen Weg gehen wollte, aber irgendwie nicht komplett für Subshops und Sprachen zuende gedacht hat. Im Grunde müsste man doch nur hingehen und die views Ordner in den Modulen genauso auslesen wie den views Ordner unter application!?

[QUOTE=udel;109943]
Der “templates” Eintrag in der metadata.php zeigt ja auch, das Oxid diesen Weg gehen wollte, aber irgendwie nicht komplett für Subshops und Sprachen zuende gedacht hat. Im Grunde müsste man doch nur hingehen und die views Ordner in den Modulen genauso auslesen wie den views Ordner unter application!?[/QUOTE]
So oft wird das ja nicht benötigt, und das wären schon eine Menge Ordner, die zusätzlich bei jedem Template-Laden geprüft werden müssten.
Man kann das so sehen, dass alles im Modul-Ordner stehen sollte. Man kann es aber auch anders sehen, nämlich dass die Templates alle zusammen im Template-Ordner sein sollten, und nicht verstreut über die Modul-Ordner.

So oft wird das ja nicht benötigt, und das wären schon eine Menge Ordner, die zusätzlich bei jedem Template-Laden geprüft werden müssten.

Nur der vom aktuellen Modul. Wenn nicht vorhanden, dann default.

Man kann das so sehen, dass alles im Modul-Ordner stehen sollte. Man kann es aber auch anders sehen, nämlich dass die Templates alle zusammen im Template-Ordner sein sollten, und nicht verstreut über die Modul-Ordner.

Wie gesagt, es gibt ja schon ein Feld für “templates” in metadata.php. Also ist es ja anscheinend so gedacht, die templates mit den Modulen zu kapseln. Oder welchen Sinn, hat das Feld sonst? Ich bin noch recht neu bei OXID, vielleicht liegt da ja auch einfach ein Verständnisproblem meinerseits vor :slight_smile:

Das Feld “templates” ist m.E. hauptsächlich für Admin-Templates gedacht. Die wenigsten Module brauchen ja eigene Frontend-Templates.

Ich verstehe was du meinst, aber aus Anwendersicht schaut das evtl. anders aus. Wenn man das Azure-Theme ändern will, legt man einen Custom-Theme Ordner an und schreibt da seine Änderungen rein. Wenn die Dateien eines Moduls ihre Templates im Azure-Ordner haben, kann man die dort gleich mitbearbeiten, ansonsten müsste man extra nochmal im Modul-Ordner einen custom-Theme Ordner anlegen.

Gerade noch als Rückmeldung vom Support gekommen. Sehr schön! :slight_smile: Bis es soweit ist, werde ich dann mal alles in den application/views/myTheme Ordner packen, sortiert in Unterordnern mit der jeweiligen ShopId.