eigenes Modul via shop.php ansprechen

Thema wurde von cdoo, 28. April 2021 erstellt.

  1. cdoo

    cdoo Erfahrener Benutzer

    Registriert seit:
    15. November 2018
    Beiträge:
    65
    Danke erhalten:
    29
    Danke vergeben:
    23
    Grundsätzlich beziehe ich mich auf diesen Forum Beitrag -> https://www.gambio.de/forum/threads/frage-zur-developer-seite.43546/

    Ich habe aktuell genau die gleiche Situation und möchte ein Modul - ordentlich - über folgenden Link: shop.php?do=shop.php?do=Mein ansprechen.

    Nun habe ich mich hierzu eingelesen und die folgende Ordnerstruktur erstellt:
    • GXModules/nad
    • GXModules/nad/MeinModul
    • GXModules/nad/MeinModul/Shop
    • GXModules/nad/MeinModul/Shop/Classes/Controllers/MeinModulController.inc.php
    • GXModules/nad/MeinModul/Shop/html/meine.html
    die beiden Dateien enthalten folgenden Inhalt:

    MeinModulController.inc.php
    PHP:
    <?php


    MainFactory
    ::load_class('HttpViewController');

    class 
    MeinController extends HttpViewController
    {

    /**
    * Initialize Controller
    */
    public function init()
    {
        
    $this->templatePath DIR_FS_CATALOG '/GXModules/nad/MeinModul/Shop/html/';
    }

        public function 
    actionDefault()
        {

          
    $contentView MainFactory::create_object('ContentView');
      
            
    $contentView->set_('meineDaten'$data);
     
      
    $this->templateName 'meine.html';

    $contentView->set_template_dir($this->templatePath);
    $contentView->set_content_template($this->templateName);
    $contentView->set_flat_assigns(true);
    $contentView->set_caching_enabled(false);
            
    $p_mainContentHtml =  $contentView->get_html();
      
      
            
    $GLOBALS['breadcrumb']->add('meinbreadcrumb',
                                        
    xtc_href_link('shop.php',
                                                      
    xtc_get_all_get_params(['do']) . '&do=Mein',
                                                      
    'SSL'));
      
            
    $layoutContentControl MainFactory::create_object('LayoutContentControl');
            
    $layoutContentControl->set_data('GET'$this->_getQueryParametersCollection()->getArray());
            
    $layoutContentControl->set_data('POST'$this->_getPostDataCollection()->getArray());
            
    $layoutContentControl->set_('coo_breadcrumb'$GLOBALS['breadcrumb']);
            
    $layoutContentControl->set_('coo_product'$GLOBALS['product']);
            
    $layoutContentControl->set_('coo_xtc_price'$GLOBALS['xtPrice']);
            
    $layoutContentControl->set_('c_path'$GLOBALS['cPath']);
            
    $layoutContentControl->set_('main_content'$p_mainContentHtml);
            
    $layoutContentControl->set_('request_type'$GLOBALS['request_type']);
            
    $layoutContentControl->proceed();
      
            return 
    MainFactory::create('HttpControllerResponse'$layoutContentControl->get_response());
      
        }


        
    /* shop.php?do=Mein/Meine */

        
    public function actionMeine()
        {
            return 
    MainFactory::create('RedirectHttpControllerResponse',
                                       
    xtc_href_link('admin.php''do=Mein));
        }
    }
    die Datei meine.html:
    HTML:
    <div style="background-color: #172c43; color: #b8b8b8;">
        Das ist ein Test 1234
    </div>
    Anschließend wurde von mir der Cache für Modulinformationen als auch der Cache für die Seitenausgabe geleert und im letzten Step versucht dieses Modul mit ./shop.php?do=Mein aufzurufen - ohne erfolg (leere Seite).

    Irgendetwas fehlt, freu mich auf alle Fälle auf eure Hilfe.

    Danke!
     
  2. Anonymous

    Anonymous Erfahrener Benutzer
    Mitarbeiter

    Registriert seit:
    22. Juni 2011
    Beiträge:
    4.623
    Danke erhalten:
    1.676
    Danke vergeben:
    128
    Eine leere Seite weist gerne mal auf einen Fehler hin. Im php-error-handler.log könnte näheres stehen. Ad hoc würde ich auf diese Zeile tippen:
    $data ist an der Stelle nicht initialisiert. Also entweder muss die weg oder davor ein „$data = []“ eingefügt werden.
     
  3. cdoo

    cdoo Erfahrener Benutzer

    Registriert seit:
    15. November 2018
    Beiträge:
    65
    Danke erhalten:
    29
    Danke vergeben:
    23
    Hallo Marco,

    danke für deine Rückmeldung.
    Ich hätte nund en Code in der MeinModdulController.inc.php wie folgt reduziert:

    PHP:
    <?php

    MainFactory
    ::load_class('HttpViewController');

    class 
    MeinController extends HttpViewController
    {

    /**
    * Initialize Controller
    */
    public function init()
    {
        
    $this->templatePath DIR_FS_CATALOG '/GXModules/nad/MeinModul/Shop/html/';
    }

        public function 
    actionDefault()
        {

          
    $contentView MainFactory::create_object('ContentView');
     
            
    $this->templateName 'meine.html';
           
            
    $contentView->set_template_dir($this->templatePath);
            
    $contentView->set_content_template($this->templateName);
            
    $contentView->set_flat_assigns(true);
            
    $contentView->set_caching_enabled(false);
            
    $p_mainContentHtml =  $contentView->get_html();
     
     
            
    $GLOBALS['breadcrumb']->add('meinbreadcrumb',
                                        
    xtc_href_link('shop.php',
                                                      
    xtc_get_all_get_params(['do']) . '&do=Mein',
                                                      
    'SSL'));
     
            
    $layoutContentControl MainFactory::create_object('LayoutContentControl');
            
    $layoutContentControl->set_data('GET'$this->_getQueryParametersCollection()->getArray());
            
    $layoutContentControl->set_data('POST'$this->_getPostDataCollection()->getArray());
            
    $layoutContentControl->set_('coo_breadcrumb'$GLOBALS['breadcrumb']);
            
    $layoutContentControl->set_('coo_product'$GLOBALS['product']);
            
    $layoutContentControl->set_('coo_xtc_price'$GLOBALS['xtPrice']);
            
    $layoutContentControl->set_('c_path'$GLOBALS['cPath']);
            
    $layoutContentControl->set_('main_content'$p_mainContentHtml);
            
    $layoutContentControl->set_('request_type'$GLOBALS['request_type']);
            
    $layoutContentControl->proceed();
     
            return 
    MainFactory::create('HttpControllerResponse'$layoutContentControl->get_response());
     
        }


    }
    Habe wieder beide Caches gelöscht - leider erhalte ich nur eine leere Seite und lt. Firefox Inspector eine 404 nicht gefunden Rückgabe.

    Fehlt mir hier irgendeine Datei zur Initialisierung dieses Moduls?

    Danke!
    Christian
     
  4. Anonymous

    Anonymous Erfahrener Benutzer
    Mitarbeiter

    Registriert seit:
    22. Juni 2011
    Beiträge:
    4.623
    Danke erhalten:
    1.676
    Danke vergeben:
    128
    MeinController in MeinModulController.inc.php? Das könnte ein Problem sein, entweder MeinModulController in MeinModulController.inc.php oder MeinController in MeinController.inc.php.
     
  5. Anonymous

    Anonymous Administrator
    Mitarbeiter

    Registriert seit:
    26. April 2011
    Beiträge:
    1.283
    Danke erhalten:
    975
    Danke vergeben:
    260
    Die Klasse muss genau mit dem Namen in der Datei und dem Dateinamen übereinstimmen.
    Wie Marco schon sagte muss in der Datei MeinController.inc.php die Klasse MeinController sein und in der Datei MeinModulController.inc.php die Klasse MeinModulController.

    Auch prüfe mal bitte ob du ein Theme oder Template aktiv hast. Wenn du ein Theme aktiv hast, musst du die "ThemeContentView" benutzen statt der "ContentView".

    Auch damit der Controller über /shop.php?do=Mein aufrufbar ist, muss die Datei auch eingelesen werden mit dem Modulcache.
     
  6. cdoo

    cdoo Erfahrener Benutzer

    Registriert seit:
    15. November 2018
    Beiträge:
    65
    Danke erhalten:
    29
    Danke vergeben:
    23
    Hallo Marco, hallo Till!

    Danke für eure Rückmeldung.

    Ich habe nun die Datei MeinModulController.inc.php wie folgt nach euren Anweisungen editiert:

    Code:
    <?php
    
    
    MainFactory::load_class('HttpViewController');
    
    class MeinModulController extends HttpViewController
    {
    
    /**
    * Initialize Controller
    */
    public function init()
    {
        $this->templatePath = DIR_FS_CATALOG . '/GXModules/nad/MeinModul/Shop/html/';
    }
    
        public function actionDefault()
        {
    
          $contentView = MainFactory::create_object('ThemeContentView');
          
            $this->templateName = 'meine.html';
           
            $contentView->set_template_dir($this->templatePath);
            $contentView->set_content_template($this->templateName);
            $contentView->set_flat_assigns(true);
            $contentView->set_caching_enabled(false);
            $p_mainContentHtml =  $contentView->get_html();
         
         
            $GLOBALS['breadcrumb']->add('meinbreadcrumb',
                                        xtc_href_link('shop.php',
                                                      xtc_get_all_get_params(['do']) . '&do=Mein',
                                                      'SSL'));
         
            $layoutContentControl = MainFactory::create_object('LayoutContentControl');
            $layoutContentControl->set_data('GET', $this->_getQueryParametersCollection()->getArray());
            $layoutContentControl->set_data('POST', $this->_getPostDataCollection()->getArray());
            $layoutContentControl->set_('coo_breadcrumb', $GLOBALS['breadcrumb']);
            $layoutContentControl->set_('coo_product', $GLOBALS['product']);
            $layoutContentControl->set_('coo_xtc_price', $GLOBALS['xtPrice']);
            $layoutContentControl->set_('c_path', $GLOBALS['cPath']);
            $layoutContentControl->set_('main_content', $p_mainContentHtml);
            $layoutContentControl->set_('request_type', $GLOBALS['request_type']);
            $layoutContentControl->proceed();
         
            return MainFactory::create('HttpControllerResponse', $layoutContentControl->get_response());
         
        }
    
    
    }
    
    ?>
    Wir nutzen das Honeygrid Theme, somit habe ich auch auf create_objekt('ThemeContentView'); gewechselt.
    Ich habe nun die Module neu eingelesen und auch den Seitencache geleert, leider erhalte ich noch immer eine leere Ausgabe.

    Danke für eure Hilfe!
     
  7. Moritz (Gambio)

    Moritz (Gambio) Administrator
    Mitarbeiter

    Registriert seit:
    26. April 2011
    Beiträge:
    5.624
    Danke erhalten:
    2.594
    Danke vergeben:
    855
    Die Datei muss MeinController.inc.php heißen und folgenden Inhalt haben:
    PHP:
    <?php


    class MeinController extends HttpViewController
    {

        
    /**
         * Initialize Controller
         */
        
    public function init()
        {
            
    $this->templatePath DIR_FS_CATALOG '/GXModules/nad/MeinModul/Shop/html/';
        }

        public function 
    actionDefault()
        {

            
    $contentView MainFactory::create_object('ThemeContentView');

            
    $this->templateName 'meine.html';

            
    $contentView->set_template_dir($this->templatePath);
            
    $contentView->set_content_template($this->templateName);
            
    $contentView->set_flat_assigns(true);
            
    $contentView->set_caching_enabled(false);
            
    $p_mainContentHtml =  $contentView->get_html();


            
    $GLOBALS['breadcrumb']->add('meinbreadcrumb',
                                        
    xtc_href_link('shop.php',
                                                      
    xtc_get_all_get_params(['do']) . '&do=Mein',
                                                      
    'SSL'));

            
    $layoutContentControl MainFactory::create_object('LayoutContentControl');
            
    $layoutContentControl->set_data('GET'$this->_getQueryParametersCollection()->getArray());
            
    $layoutContentControl->set_data('POST'$this->_getPostDataCollection()->getArray());
            
    $layoutContentControl->set_('coo_breadcrumb'$GLOBALS['breadcrumb']);
            
    $layoutContentControl->set_('coo_product'$GLOBALS['product']);
            
    $layoutContentControl->set_('coo_xtc_price'$GLOBALS['xtPrice']);
            
    $layoutContentControl->set_('c_path'$GLOBALS['cPath']);
            
    $layoutContentControl->set_('main_content'$p_mainContentHtml);
            
    $layoutContentControl->set_('request_type'$GLOBALS['request_type']);
            
    $layoutContentControl->proceed();

            return 
    MainFactory::create('HttpControllerResponse'$layoutContentControl->get_response());

        }


    }
     
  8. cdoo

    cdoo Erfahrener Benutzer

    Registriert seit:
    15. November 2018
    Beiträge:
    65
    Danke erhalten:
    29
    Danke vergeben:
    23
    Hallo Moritz,

    vielen Dank, so funktioniert es.

    Noch eine Frage:
    Ich generiere mit der MeinController.inc.php und dem Zugriff auf die meine.html jetzt eine perfekte Ausgabe mit dem HTML-Code aus der meine.html.

    Ich habe jetzt testweise probiert die meine.html auf meine.php zu ändern und dort ein einfaches php-echo auszugeben. Leider ohne erfolgt, hier wird dann eine leere Seite geladen.

    Besteht irgendwie die Möglichkeit PHP Dateien im Content-Bereich des Themes zu laden?
    Ich könnte ein include auf eine php Datei setzen, jedoch wird diese außerhalb des Content-Frames geladen.

    Danke
    Christian
     
  9. Anonymous

    Anonymous Erfahrener Benutzer
    Mitarbeiter

    Registriert seit:
    22. Juni 2011
    Beiträge:
    4.623
    Danke erhalten:
    1.676
    Danke vergeben:
    128
    Das ist etwas unsauber und ich habe das im Zweifel nie gesagt, aber ersetze
    PHP:
            $this->templateName 'meine.html';
            
    $contentView->set_template_dir($this->templatePath);
            
    $contentView->set_content_template($this->templateName);
            
    $contentView->set_flat_assigns(true);
            
    $contentView->set_caching_enabled(false);
            
    $p_mainContentHtml =  $contentView->get_html();
    durch
    PHP:
    ob_start();
    require 
    'wo/auch/immer/mein_script_mit_ausgabe.php';
    $p_mainContentHtml ob_get_clean();
     
  10. cdoo

    cdoo Erfahrener Benutzer

    Registriert seit:
    15. November 2018
    Beiträge:
    65
    Danke erhalten:
    29
    Danke vergeben:
    23
    geb ich dir vollkommen recht :D

    Danke, funktioniert perfekt, ich werds keinem verraten ;)
     
  11. cdoo

    cdoo Erfahrener Benutzer

    Registriert seit:
    15. November 2018
    Beiträge:
    65
    Danke erhalten:
    29
    Danke vergeben:
    23
    Hallo miteinander,

    ich darf mich besonders bei @Marco (Gambio) hierzu kurz melden.
    Mit dem aktuellen/neusten Gambio Update und der Abschaffung des alten Template System erzeugt der oben umgesetzte Code einen Fatal Error.

    Könntest du hier einen Tipp zur Kompatiblität mit dem aktuellen Template System geben.

    Danke!
     
  12. Anonymous

    Anonymous Erfahrener Benutzer
    Mitarbeiter

    Registriert seit:
    22. Juni 2011
    Beiträge:
    4.623
    Danke erhalten:
    1.676
    Danke vergeben:
    128
    Hast du etwas mehr Details zu dem Fehler, der da geworfen wird?
     
  13. cdoo

    cdoo Erfahrener Benutzer

    Registriert seit:
    15. November 2018
    Beiträge:
    65
    Danke erhalten:
    29
    Danke vergeben:
    23
    Leider aktuell nicht. Ich wollte im Zuge des Security Updates heute auf die neuste Version upgraden, bin jedoch zum einen an den nicht kompatiblen Xycon Plugins sowie eben der Fehlermeldung dieses von mir damals umgesetzten Moduls gestoßen und habe anschließend eine Rücksicherung gemacht.

    Rückwirkend kann ich mich nur erinnern, dass ich direkt nach dem Login in das Admin Interface nicht dorthin, sondern auf dieses Modul weitergeleitet wurde und um unteren bereich ein Fatal Error mit "main not found" o.ä. stand.

    Ich werde in den nächsten Tagen eine Testumgebung aufsetzen und das nochmals prüfen und dir dann eine genaue Fehlermeldung liefern. Sorry.
     
  14. cdoo

    cdoo Erfahrener Benutzer

    Registriert seit:
    15. November 2018
    Beiträge:
    65
    Danke erhalten:
    29
    Danke vergeben:
    23
    @Marco (Gambio) ich darf mich nochmal an dich wenden. Ich habe nun im Testshop ein Update auf die aktuellste GX Version durchgeführt und erhalte hier als Fehlermeldung "Class 'main_ORIGIN' not found" sowie das oben hinzugefügte Modul direkt auf der Startseite ausgegeben.

    Ich habe ebenfalls dazu ein Ticket erstellt. Eventuell haben hier auch noch andere dieses Problem. Dann könnten wir hier eine Lösung dafür finden :)

    Besten Dank!