Bionicman: Joomla Komponente - view in view?

Hallo Forum,

ich hänge gerade an einem Logikproblem fest. Vielleicht könnt ihr mir ein paar Ideen liefern :)

Ich schreibe gerade eine Komponente für Joomla, die aus mehreren Views besteht. Allerdings möchte ich in jeder View einen kleinen gleichbleibenden Bereich haben. Soll heissen, es werden immer die selben Informationen angezeigt.

Nun halte ich es aber für recht umständlich, in jedem Model von jeder View die Daten neu zu laden. Und dann auch noch in jeder View das Layout einzufügen. Dann müsste ich bei Layoutänderungen in jeder View Anpassungen vornhemen :(

Gibt es eine Möglichkeit diesen gleichbleibenden Bereich modular zu machen? Mir fallen dazu folgende prinzipiellen Möglichkeiten ein: View in View oder Modul in View. Allerdings weiß ich nicht, ob etwas davon machbar ist oder es eine bessere Lösung gibt.

Danke und Gruß
Olli

  1. Hallo Forum,

    ich hänge gerade an einem Logikproblem fest. Vielleicht könnt ihr mir ein paar Ideen liefern :)

    Ich schreibe gerade eine Komponente für Joomla, die aus mehreren Views besteht. Allerdings möchte ich in jeder View einen kleinen gleichbleibenden Bereich haben. Soll heissen, es werden immer die selben Informationen angezeigt.

    Nun halte ich es aber für recht umständlich, in jedem Model von jeder View die Daten neu zu laden. Und dann auch noch in jeder View das Layout einzufügen. Dann müsste ich bei Layoutänderungen in jeder View Anpassungen vornhemen :(

    Gibt es eine Möglichkeit diesen gleichbleibenden Bereich modular zu machen? Mir fallen dazu folgende prinzipiellen Möglichkeiten ein: View in View oder Modul in View. Allerdings weiß ich nicht, ob etwas davon machbar ist oder es eine bessere Lösung gibt.

    Warum sollte irgend etwas nicht machbar sein? Mit php kannst du in deinen Code einbeziehen was immer du willst.

    Ich nehme an die gleichbleibenden Informationen sind auch dynamisch? Wenn du für alle unterschiedlichen Ansichten eigene Models gemacht hast, dann solltest du vielleicht ein "Über"-Model erstellen in dem du die fixen, immer gleichen Daten lädst plus zusätzlich dann auf das jeweilige Submodel weiterleitest, die du schon hast.

    Du kannst dann für diese Daten auch eine eigene View erstellen, die du dann in den anderen Views einbeziehen kannst.

    Gruss

    1. Hallo,

      Gibt es eine Möglichkeit diesen gleichbleibenden Bereich modular zu machen? Mir fallen dazu folgende prinzipiellen Möglichkeiten ein: View in View oder Modul in View. Allerdings weiß ich nicht, ob etwas davon machbar ist oder es eine bessere Lösung gibt.

      Ich nehme an die gleichbleibenden Informationen sind auch dynamisch? Wenn du für alle unterschiedlichen Ansichten eigene Models gemacht hast, dann solltest du vielleicht ein "Über"-Model erstellen in dem du die fixen, immer gleichen Daten lädst plus zusätzlich dann auf das jeweilige Submodel weiterleitest, die du schon hast.

      Du kannst dann für diese Daten auch eine eigene View erstellen, die du dann in den anderen Views einbeziehen kannst.

      Super, klingt nach der Lösung meines Problems :) Ich wusste nicht, dass man eine View in einer anderen View einbeziehen kann. Und leider weiss ich auch nicht wie ich das bewerkstelligen kann. Aufgrund des MVC-Modells scheint mir das etwas verzwickt. Hast du dafür vielleicht ein Beispiel?

      Danke und Gruß
      Olli

      1. Super, klingt nach der Lösung meines Problems :) Ich wusste nicht, dass man eine View in einer anderen View einbeziehen kann. Und leider weiss ich auch nicht wie ich das bewerkstelligen kann. Aufgrund des MVC-Modells scheint mir das etwas verzwickt. Hast du dafür vielleicht ein Beispiel?

        Nun im Endeffekt hast du konkret zwei Möglichkeiten.

        1. Variante: Du erstellst für diese zusätzlichen Teile eine eigene, separate view-Klasse. Dann kannst du ganz gewohnt ein Objekt davon erstellen und die Daten von diesem an der von dir gewünschten Stelle darstellen lassen.

        2. Variante: Die Tatsache, dass du bestimmte Teile hast, die für alle unterschiedlichen Typen deiner Viewklassen gleich sind, spricht dafür, dass du eine neue Parent Klasse erstellst. Diese implementiert dann die Gemeinsamkeiten, alle andere Views extenden diese. So hast du die Gemeinsamkeiten an einer zentralen Stelle verwaltet, hast aber in all deinen Views Zugriff auf die Funktionen, die die gleichbleibenden Teile darstellen.

        Gruss

        1. Nun im Endeffekt hast du konkret zwei Möglichkeiten.

          1. Variante: Die Tatsache, dass du bestimmte Teile hast, die für alle unterschiedlichen Typen deiner Viewklassen gleich sind, spricht dafür, dass du eine neue Parent Klasse erstellst. Diese implementiert dann die Gemeinsamkeiten, alle andere Views extenden diese. So hast du die Gemeinsamkeiten an einer zentralen Stelle verwaltet, hast aber in all deinen Views Zugriff auf die Funktionen, die die gleichbleibenden Teile darstellen.

          eine einfache Lösung, aber damit bliebe das Problem, dass ich das Layout immer noch in jeder view separat anlegen müsste.

          1. Variante: Du erstellst für diese zusätzlichen Teile eine eigene, separate view-Klasse. Dann kannst du ganz gewohnt ein Objekt davon erstellen und die Daten von diesem an der von dir gewünschten Stelle darstellen lassen.

          so stelle ich mir das vor. Leider kenne ich mich mit dem MVC-Modell nicht so gut aus. Kannst du mir einen Hinweis geben, wo ich das View-Objekt erstelle!? Und wie stellst du dir "... an der von dir gewünschten Stelle darstellen lassen." vor? Ich müsste doch quasi im template eines views einen Aufruf von display() starten. Oder verstehe ich das falsch?

          Danke Gruß

          1. Problem GELÖST:

            Im Komponenten-Controller den Output einer View cachen:

              
            $navView = &$this->getView('navigation', $viewType);  
              
            ob_start();  
            $navView->display();  
            $navigation = ob_get_contents();  
            ob_end_clean();  
              
            $view = &$this->getView('someSite', $viewType);  
            $view->assign('navigation', $navigation);  
              
            $view->display();  
            
            

            jetzt noch in der view.html.php:

              
            $this->assignRef('navigation', $this->navigation);  
            
            

            und fertig. Jetzt kann man den Output der View an jeder beliebigen Stelle im Template der anderen View ausgeben.

            Gruß
            Olli

            1. Hi nochmals

              Im Komponenten-Controller den Output einer View cachen:

              Das funktioniert natürlich, ist aber nicht sonderlich elegant, oder?

              Ich persönlich hätte nach allem was ich von dir gehört habe zu Variante 2 tendiert (Wie hast du das gemeint von wegen das Problem bleibe da?) oder zumindest die gleichbleibende View innerhalb der anderen View geladen.

              Bei Variante zwei hättest du dann in der Elternklasse die Funktion schreiben können, die dir den Code für die Navigation (lese ich aus dem Code oben) zurückgegeben hätte. Diese Funktion hättest du dann im template der anderen Views verwenden können um die Navigation zu platzieren. Der eigentliche Code wäre dann aber durchaus zentral und angenehm zu verwalten.

              Die jetzt von dir gewählte Variante hätte ich zumindest so realisiert, dass die View selbst eine Funktion beinhaltet, die direkt den Code zurückgibt ohne ihn auszugeben. Also

                
              $navView = &$this->getView('navigation', $viewType);  
              $navigation=$navView->getCode();  
              
              

              Buffern im Controller halte ich jetzt nicht unbedingt für die schönste Lösung.

              Gruss