Layout wählen abhängig von Parameter

  • Hey,

    ich schreibe an einer Komponente zur Zeit und stehe nun vor folgendem Problem: Ich möchte verschiedene Layouts laden, je nach angegebenem GET-Parameter. Das Standard-Komponenten-Template funktionert und wenn ich "?id=5" an die URL anhänge wird auch versucht, ein anderes Layout anzuzeigen-das ist daran zu sehen, dass eine Fehlermeldung erscheint: 500 - Layout „default_singleEvent.php“ nicht gefunden!


    Das "singleEvent" ist dabei der String, den ich beim Aufruf von parent::display($tpl) für $tpl angegeben habe (also mit dem id-GET-Parameter gesetzt ist $tpl bei dem Aufruf 'singleEvent.php'). Dachte, dann wird einfach nach der "singleEvent.php" gesucht und dann die Seite mit der Vorlage geladen. Aber das scheint nicht der Fall zu sein-woher kommt sonst das "default_"?


    Wie kann ich dafür sorgen, dass die richtige Datei geladen wird? Bekomme ich den Prefix weg oder muss ich meine Datei immer in "default_IRGENDWAS.php" umbenennen?

    Die letzte Variante funktioniert auch nicht einfach so, hat jemand einen Vorschlag, wie ich überhaupt ein anderes Layout laden kann als das "default.php"?


    Danke und LG

  • So ganz einfach kann man das nicht sagen, was du falsch machst. "default" ist jedenfalls das finale Fallback für ein passendes Lyout, wenn sonst nichts angegeben ist. Weil man deinen GESAMTcode und -Aufbau eben nicht kennt.


    Und ja, in Joomla sind manche Dinge etwas "unklar" benannt im Code. Deshalb tue ich mich folgend auch etwas schwer ;-)


    $tpl ist auch nicht wirklich das, was man normalerweise unter "Layout" vertsteht. Sondern eben so wie du es entdeckt hast, eine Unterdatei des aktuellen Layouts, wenn man $tpl angibt.


    Normalerweise hat eine Komponente für die Einzelansicht ein eigenes Layout, oder besser einen eigenen View, vergleichsweise mit /com_content/views/article/, das man aufruft, wenn man eben das "singleEvent" sehen will. Den View übergibt man per URL, z.B.


    index.php?option=com_content&view=article&id=4564


    Das parent::display($tpl) landet im Normalfall hier:

    https://github.com/joomla/joom…ew/HtmlView.php#L228-L230


    Zeile 230 verzweigt dann an:

    https://github.com/joomla/joom…VC/View/HtmlView.php#L642


    und, wenn du diese Methode debuggst, wird mit deinem Code eben das $tpl an das aktuelle "View-Layout" angehängt und dann nach der Datei gesucht. Und, wenn das "View-Layout" nicht angegeben ist, versuchts Joomla mit "default".


    Vielleicht hilft dir bspw. diese Setter-Methode weiter:

    https://github.com/joomla/joom…VC/View/HtmlView.php#L545


    Bei eigenen Komponenten sollte man sich etwas an bestehenden Core-Komponenten-Codes orientieren, auch, wenn nicht immer ausreichend, um "voll zu blicken".

  • Danke für die schnelle Antwort.


    In welcher Datei wird denn abgefangen, welcher View jetzt geladen werden soll? Dort könnte ich ja die Abfrage des GET-Parameters einbauen, sodass es anders aussieht. Allerdings find ich es dann nicht so gut gelöst, wenn ich nicht auf eine andere Datei als die default.php in meinem tmpl-Ordner zugreifen kann um etwas anzeigen zu lassen.


    Am liebsten wäre mir, ich habe mehrere "Schablonen" in dem tmpl-Ordner und kann in der view.html.php anhand verschiedener Parameter auswählen lassen, welche davon jetzt gebraucht wird.


    Bei setLayout() wird immer ein Template-Name gebraucht-aber ich möchte kein installiertes Template der Website verwenden, sondern nur eine bestimmte Ansicht aus dem tmpl-Ordner auswählen.

  • Seh ich nicht, dass setLayout einen fixen Templatenamen braucht. Ich sehe eine Prüfung, ob ein Doppelpunkt im Layout ist, wenn nicht, wirds weitergereicht.


    Wenn ein Doppelpunkt drinnen ist, gibts für den späteren Verlauf 2 Möglichkeiten

    _:layoutname

    templatename:layoutname


    Und das Templategedöns kommt ja letztlich eh nur ins Spiel, um nach einem Template-Override zu suchen. Gibt es keinen, ist eh deine Komponente "Alleinherrscher".


    Normalerweise switcht man das Layout via

    Code
    1. $this->setLayout('dingsbums');

    in der eigenen

    public function display($tpl = null)

    in seiner view.html.php des Views um, bevor parent::display($tpl); aufgerufen wird.


    Geht auch irgendwie über den Controller, aber dann muss man sich erst eine View-Instanz "basteln". Siehe Beispiele hier

    https://github.com/joomla/joom…gories/controller.php#L79