+ Antworten
Seite 1 von 2 1 2 LetzteLetzte
Ergebnis 1 bis 10 von 20

Thema: Mehrer Controller aus Frontend ansprechen

  1. #1
    Neu an Board
    Registriert seit
    24.05.2010
    Beiträge
    13
    Bedankte sich
    2
    Erhielt 0 Danksagungen
    in 0 Beiträgen

    Standard Mehrer Controller aus Frontend ansprechen

    Hallo,

    habe im Frontend verschiedene Views/Layouts.
    Für jedes View möchte ich gerne einen extra Controller ansprechen.

    Mein Einstiegspunkt komponentenname.php:
    PHP-Code:
    // no direct access
    defined('_JEXEC') or die('Restricted access');

    // Require the base controller
    require_once( JPATH_COMPONENT.DS.'controller.php' );

    // Require specific controller if requested
    if( $controller JRequest::getWord('controller'))
    {
       
    $path JPATH_COMPONENT.DS.'controllers'.DS.$controller.'.php';
       if( 
    file_exists($path))
        {
           require_once 
    $path;
       } else
       {
           
    $controller '';
       }
    }

    // Create the controller
    $classname    'komponentenNameController'.$controller;
    $controller   = new $classname( );

    // Perform the Request task
    $controller->executeJRequest::getVar'task' ) );

    // Redirect if set by the controller
    $controller->redirect(); 
    controller.php
    PHP-Code:
    class komponentenNameController extends JController
    {
        
    /**
         * Method to display the view
         *
         * @access    public
         */
        
    function display()
        {
            
    parent::display();
        }
    // function
    }// class 
    Der gewünschte controller wos ../controllers/wos.php:
    PHP-Code:
    defined('_JEXEC') or die('Restricted access');
    jimport('joomla.application.component.controller');

    class 
    komponentenNameControllerwos extends komponentenNameController
    {

        function 
    __construct()
        {
            
    parent::__construct();

        }
    // function
        
        
    function display()
        {
            
    JRequest::setVar('view''wos' );
            
    parent::display();
        } 
    Das Problem ist nun, dass ich eigentlich immer im Basiscontroller lande, auch wenn ich die View wos (class komponentenNameViewwos extends JView) aufrufe.
    Der Menülink, den ich über Joomla erzeuge, enthält allerdings keine Angabe zum Controller, sondern sieht so aus:
    PHP-Code:
    http://localhost/test-installation/index.php?option=com_meinekomponente&view=wos&layout=wos&Itemid=56 
    Wie kann ich erreichen, dass über einen solchen Menülink der entsprechende Controller aufgerufen wird?

    Vielen Dank
    Tami

  2. #2
    Verbringt hier viel Zeit
    Registriert seit
    24.01.2006
    Beiträge
    594
    Bedankte sich
    108
    Erhielt 359 Danksagungen
    in 203 Beiträgen

    Standard

    Theoretisch kann man dem View spezielle URL-Parameter mitgeben, aber für was braucht denn jeder View einen eigenen Controller? Controller sind doch nur notwendig, wenn du besondere Funktionen mehrfach benutzen willst, die sich dann aber jeweils anders verhalten sollen (wie z.B. save), also insbesondere, wenn Daten verarbeitet und gespeichert werden sollen. In den meisten Fällen zeigen Views doch nur Content an und dafür reicht der Basiscontroller vollkommen.

  3. #3
    Pöser Moderator Avatar von SniperSister
    Registriert seit
    23.09.2005
    Ort
    /home/köln
    Alter
    22
    Beiträge
    2.506
    Bedankte sich
    77
    Erhielt 680 Danksagungen
    in 465 Beiträgen

    Standard

    Zitat Zitat von Tamiflu Beitrag anzeigen
    PHP-Code:
    http://localhost/test-installation/index.php?option=com_meinekomponente&view=wos&layout=wos&Itemid=56 
    Wie kann ich erreichen, dass über einen solchen Menülink der entsprechende Controller aufgerufen wird?
    PHP-Code:
    http://localhost/test-installation/index.php?option=com_meinekomponente&controller=wos 
    Beste Grüße
    Snipy

  4. #4
    Neu an Board
    Registriert seit
    24.05.2010
    Beiträge
    13
    Bedankte sich
    2
    Erhielt 0 Danksagungen
    in 0 Beiträgen

    Standard

    Zitat Zitat von bembelimen Beitrag anzeigen
    Theoretisch kann man dem View spezielle URL-Parameter mitgeben, aber für was braucht denn jeder View einen eigenen Controller? Controller sind doch nur notwendig, wenn du besondere Funktionen mehrfach benutzen willst, die sich dann aber jeweils anders verhalten sollen (wie z.B. save), also insbesondere, wenn Daten verarbeitet und gespeichert werden sollen. In den meisten Fällen zeigen Views doch nur Content an und dafür reicht der Basiscontroller vollkommen.
    Die views beinhalten ganz verschiedene Inhalte und Aktionen, sind also nicht einfach nur andere Ansichten. Daher benötigen manache auch ein Model aus dem admin-Bereich, andere nicht. Deshalb würde ich das gerne mit den verschiedenen Controllern machen.
    Geändert von Tamiflu (24.05.2010 um 13:30 Uhr)

  5. #5
    Neu an Board
    Registriert seit
    24.05.2010
    Beiträge
    13
    Bedankte sich
    2
    Erhielt 0 Danksagungen
    in 0 Beiträgen

    Standard

    Zitat Zitat von SniperSister Beitrag anzeigen
    PHP-Code:
    http://localhost/test-installation/index.php?option=com_meinekomponente&controller=wos 
    Beste Grüße
    Snipy
    Vielen Dank!
    Leider hilft mir das nicht soviel weiter, da ja der Menülink über das Backend von Joomla erzeugt wird und ich damit keinen direkten Einfluss drauf habe wie er aussieht.

    zur Verdeutlichung: Ich erstelle im Backend im Bereiche Menü einen Link auf eine spezielle View der Komponente. Der so erzeugte Link schaut folgendermaßen aus:
    PHP-Code:
    http://localhost/test-installation/index.php?option=com_meinekomponente&view=wos&layout=wos&Itemid=56 
    Wenn ich diesen link aufrufe und mir den Inhalt von "$classname" aus der komponentenname.php anzeigen lasse, so erhalte ich "komponentenNameController" anstatt wie gewünscht "komponentenNameControllerwos"

    Gruß Tami
    Geändert von Tamiflu (24.05.2010 um 13:34 Uhr)

  6. #6
    Hat hier eine Zweitwohnung Avatar von CirTap
    Registriert seit
    12.12.2005
    Ort
    Karlsruhe
    Beiträge
    1.628
    Bedankte sich
    83
    Erhielt 539 Danksagungen
    in 438 Beiträgen

    Standard

    dito bembelinen.
    Zudem kann Joomla schlecht einem Controller ermitteln, wenn du den Namen auf eine Request-Variable stützt, diese aber nicht gesetzt wird, also kann nur der Basis-Controller dabei rauskommen.

    Zudem will Joomla, um die ganzen Namen zu berechnen, dass die Controller-Klasse mit 'Controller' aufhört und nicht mit "wos" oder sowas.
    Aus "WosController" ermittelt J! dann kaputtautomatisch die View "WosViewWos".
    Aus "SchnubbiController" wird die View "SchnubbiViewSchnubbi".
    Sieht blöd aus, klingt blöd, ist blöd, ist aber nunmal das "Namenskonzept":
    ControllernameViewViewname

    Wenn du auf "komponentenNameControllerWos" bestehst, musst du selbst den richtigen Namen der View angeben beim Laden, weil dein Controller durch das Anhängsel "wos" ja nicht mehr dem Namenskonzept entspricht:
    $view = &$this->getView("wos", "komponentenName");
    und dann müssen auch die Models und Tables angepasst werden.
    Viel Stress...

    Wenn du eine Zuordnung zwischen $view und Controller festklopfen kannst, d.h. die "wos" View sowieso nur mit dem "wos" Controller zusammen funzt, dann nimm $view und ermittel daraus den Namen der Controller-Datei und -Klasse.
    Code:
    $view = JRequest::getCmd('view');
    switch ( strtolower($view) )
    {
       case 'wos':
       case 'was':
          $controller = 'wos';
          break;
       case 'foo':
       case 'bar':
          $controller = 'fubar';
          break;
       default:
          $controller = '';
    }
    
    // im unterordner "/controller/XXXXcontroller.php" laden
    require_once JPATH_COMPONENT.DS.'controller' .DS. $controller .'controller.php';
    $classname    = ucfirst($controller) . 'Controller';
    $controller   = new $classname( ); /// z.B. FubarController, WosController
    Dein Controller muss übrigens nicht den Namen der Komponente tragen, der muss nur im "bootstrap" stimmen, also der Datei die alle Bibliothekn und einen Controller läd und dann execute() und redirect() anwirft.

    Wirf mal einen Blick auf die "com_weblinks", dort werden mehrere Controller verwendet.

    Viel Spaß,
    CirTap
    Joomla FAQ | CSS-Probleme? Verstehen Entdecken Anwenden Meistern

    "I love deadlines. I like the whooshing sound they make as they fly by." (Douglas Adams)
    Man kann Software schnell, gut und günstig schreiben, sich aber nur 2 Dinge aussuchen.


  7. Erhielt Danksagungen von:


  8. #7
    Hat hier eine Zweitwohnung Avatar von CirTap
    Registriert seit
    12.12.2005
    Ort
    Karlsruhe
    Beiträge
    1.628
    Bedankte sich
    83
    Erhielt 539 Danksagungen
    in 438 Beiträgen

    Standard

    Zitat Zitat von Tamiflu Beitrag anzeigen
    Leider hilft mir das nicht soviel weiter, da ja der Menülink über das Backend von Joomla erzeugt wird und ich damit keinen direkten Einfluss drauf habe wie er aussieht.
    das stimmt so nicht.
    Deine View hat sicherlich auch ein Layout (/tmpl/default.php) In das Verzeichnis packstdu eine default.xml mit einem <url> Block (statt <params> und einem <param name="controller"> und dann kannst du fröhlich die URL verwursten.
    Beispiele dazu findest du bei den Standard-Komponenten. Schau einfach mal die .xml Dateien in den /tmpl/ Ordnern durch.

    CirTap
    Joomla FAQ | CSS-Probleme? Verstehen Entdecken Anwenden Meistern

    "I love deadlines. I like the whooshing sound they make as they fly by." (Douglas Adams)
    Man kann Software schnell, gut und günstig schreiben, sich aber nur 2 Dinge aussuchen.


  9. #8
    Verbringt hier viel Zeit
    Registriert seit
    24.01.2006
    Beiträge
    594
    Bedankte sich
    108
    Erhielt 359 Danksagungen
    in 203 Beiträgen

    Standard

    Zitat Zitat von CirTap Beitrag anzeigen
    In das Verzeichnis packstdu eine default.xml mit einem <url> Block (statt <params> und einem <param name="controller"> und dann kannst du fröhlich die URL verwursten.
    Exakt das was ich meinte.

    Aber das Thema ist Interessant. Hast du mal ein Beispiel für so einen "speziellen" Controller, der am View gekoppelt sein muss? Ich persönlich finde ja, dass Controller per GET Parameter zu übergeben irgendwie schlecht durchdacht ist. Weil, wenn es nur möglich ist, den Controller per GET zu übergeben, dann passiert im Prinzip ja keine Interaktion* auf der Seite sondern es wird "statisch" einfach ein View aufgerufen. Und da sehe ich aktuell keine Situation, wo man einen anderen Controller braucht. Somit wäre evtl. hilfreich, wenn du mal so einen Controller postest, der keine Datein verarbeitet sich aber trotzdem vom Basiscontroller unterscheidet.

    * Interaktion = ein Besucher füllt ein Formular aus, etc.

  10. #9
    Neu an Board
    Registriert seit
    24.05.2010
    Beiträge
    13
    Bedankte sich
    2
    Erhielt 0 Danksagungen
    in 0 Beiträgen

    Standard

    Zitat Zitat von CirTap Beitrag anzeigen
    Wenn du auf "komponentenNameControllerWos" bestehst, musst du selbst den richtigen Namen der View angeben beim Laden, weil dein Controller durch das Anhängsel "wos" ja nicht mehr dem Namenskonzept entspricht:
    $view = &$this->getView("wos", "komponentenName");
    und dann müssen auch die Models und Tables angepasst werden.
    Viel Stress...

    Wenn du eine Zuordnung zwischen $view und Controller festklopfen kannst, d.h. die "wos" View sowieso nur mit dem "wos" Controller zusammen funzt, dann nimm $view und ermittel daraus den Namen der Controller-Datei und -Klasse.
    Code:
    $view = JRequest::getCmd('view');
    switch ( strtolower($view) )
    {
       case 'wos':
       case 'was':
          $controller = 'wos';
          break;
       case 'foo':
       case 'bar':
          $controller = 'fubar';
          break;
       default:
          $controller = '';
    }
    
    // im unterordner "/controller/XXXXcontroller.php" laden
    require_once JPATH_COMPONENT.DS.'controller' .DS. $controller .'controller.php';
    $classname    = ucfirst($controller) . 'Controller';
    $controller   = new $classname( ); /// z.B. FubarController, WosController
    Dein Controller muss übrigens nicht den Namen der Komponente tragen, der muss nur im "bootstrap" stimmen, also der Datei die alle Bibliothekn und einen Controller läd und dann execute() und redirect() anwirft.

    Wirf mal einen Blick auf die "com_weblinks", dort werden mehrere Controller verwendet.

    Viel Spaß,
    CirTap
    Danke, das hat geholfen.

  11. #10
    Neu an Board
    Registriert seit
    24.05.2010
    Beiträge
    13
    Bedankte sich
    2
    Erhielt 0 Danksagungen
    in 0 Beiträgen

    Standard

    Zitat Zitat von CirTap Beitrag anzeigen
    das stimmt so nicht.
    Deine View hat sicherlich auch ein Layout (/tmpl/default.php) In das Verzeichnis packstdu eine default.xml mit einem <url> Block (statt <params> und einem <param name="controller"> und dann kannst du fröhlich die URL verwursten.
    Beispiele dazu findest du bei den Standard-Komponenten. Schau einfach mal die .xml Dateien in den /tmpl/ Ordnern durch.

    CirTap
    habe zwar nachgeschaut, aber konnte nicht wirklich etwas damit anfangen. Trotzdem danke.

    Ich lasse den Thread mal als "nicht-gelöst" markiert, da bembelimen ja noch ein anliegen hat, das mich auch interessiert.

    schade, dass alle mir bekannten Tutorials eigentlich immer genau da aufhören, wo es interessant wird. Das 10. hello-Tutorial mti einem controller und einer view, ohne verschiedene layouts, ... hilft dann nicht mehr.

    Gruß Tami

+ Antworten
Seite 1 von 2 1 2 LetzteLetzte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein