Verschiedene Templates im Controller nutzen

Ich versuche gerade, mich in die OXID-Modulerstellung einzuarbeiten. Leider mit wechselndem Erfolg. Trotz Version 6 bin ich einige Beispiele aus dem “Kochbuch” durch, finde es aber etwas mühsam, aus den Beipielen ein grundsätzliches Vorgehen für die Modulentwicklung. Die Beispiele laufen zwar alle in der neuen Version, ich bin mir aber nicht sicher, inwieweit das dort beschriebene Vorgehen noch aktuell bzw. “Best Practise” ist.

Konkret verstehe ich nicht, wie ich im Controller verschiedene Templates aufrufen kann, wenn ich Objekte via Methode erstellen, anzeigen oder editieren möchte. In Symfony kann ich via Routing verschiedenste Aktionen abbilden, die ihreseits wieder ihre eigenen Templates rendern. Aber wie bilde ich das in einem OXID Controller ab?

Soweit ich in den Controllern des Core Systems (und den mir bekannten Beispielen) gesehen habe, wird die render-Methode jeweils nur einmal implementiert und dieser wird über $_sThisTemplate ein Template zugewiesen. Über den Parameter ‘fnc’ im Aufruf des Controllers kann ich zwar eine bestimmte Methode im Controller ansprechen, gerendert wird aber immer nur ein Template.

Ausnahme: im ContentController wird im Aufruf ein Template per Parameter ‘tpl’ übergeben und dann via render-Methode ausgeführt. Ist das der Weg, um nicht pro View einen Controller einsetzen zu müssen?

Vielleicht kann mir da jemand auf die Sprünge helfen. Gerne auch mit Hinweisen auf bestehende Quellen zur Modulerstellung in OXID 6.

Hallo Thomas und herzlich Willkommen!

Zur Modulentwicklung mit OXID 6 stehen hier einige Dinge: https://docs.oxid-esales.com/developer/en/6.1/modules/index.html

Ansonsten empfehle ich immer wieder gern diese Screencast-Reihe, auch wenn das ganz schön viel Zeit ist: https://www.youtube.com/playlist?list=PLyrxtI-PbhJwDWljUJz6b_gPBUpoQdS-R

Tutorials etc. zu Modulentwicklung für ältere OXID-Versionen sowie weitere Informationen findest Du auf https://oxidforge.org

$_sThisTemplate kann man ja ändern, z.B. in AccountController:

$this->_sThisTemplate = $this->_getLoginTemplate();
...
return $this->_sThisTemplate;

Ist es das was du meinst?

Danke für den Hinweis mit den Screencasts, die Zeit nehme ich mir :slight_smile:
Auf https://oxidforge.org scheinen einige gute Blogbeiträge zu sein, da schaue ich mich mal um.

1 Like

Im Prinzip ja. Es spricht also nichts dagegen, innerhalb der render-Methode je nach Anwendungsfall verschiedene Templates anzusprechen? Wie gesagt, die render-Methode im ContentController bekommt das Template ja über einen eigenen Parameter mitgeteilt. Das entspricht so ungefähr dem Routing in Symfony und trifft meinen Anwednungsfall am ehesten.

Nein spricht nichts dagegen.

in der Regel hat jeder Controller sein dazugehöriges Template, es gibt aber einige Sonderfälle, wie z.B:
Content Seiten Controller kann die CMS Seiten in einer abgespeckten Version rendern (ohne Header, Footer etc, z.b. für Popups)
Detailseite kann nur bestimmte Bereiche fürs Nachladen per Ajax rendern.
Kategorien-Controller kann das hinterlegte Alternativ-Template (Kategorieneinstellung im Admin) rendern.

Du kannst aber nicht Templates und Controller wild miteinander mischen, die beiden müssen schon zueinander passen.

Prinzipiell kann man sogar gleich in der aufgerufenen Funktion mit dem Code Output anfangen und auf render() verzichten, wenn man die ganzen Sachen aus render() nicht braucht.

Vielen Dank für die Tipps. Die empfohlenen Videos waren schon mal sehr hilfreich und haben für mehr Übersicht gesorgt!

1 Like