über Plugin PHP-Datei includen

Hallo,

 

ich versuche verzweifelt, über ein selbsterstelltes Plugin eine PHP-Datei zu includen.
Leider scheitere ich an der Funktion, wie ich die Datei als smarty übergebe.
Kann man nicht innerhalb der funktion die Datei einfach übergeben?
 

public function onFrontendPostDispatch(Enlight_Event_EventArgs $args)
    {
        /** @var \Enlight_Controller_Action $controller */
        $controller = $args->get('subject');
        $view = $controller->View();

        $view->addTemplateDir(
            __DIR__. '/Views'
        );
        $view->assign('slogan', $this->getSlogan());
    }

Hier der Beispielcode der Vorlage aus dem Wiki.

Also so wie: $view->assign(‚slogan‘ , …datei.php ???

Und dann in der index.tpl (views) als {$slogan} einen Block erweitern?

 

Hi, wo ist der Rest des Codes? Hast du den Link zum Wiki?

hier: https://developers.shopware.com/developers-guide/plugin-quick-start/

Hi, also was du machen könntest wäre

/**
     * Event listener function which returns the controller path of the plugin frontend controller.
     *
     * @param Enlight_Event_EventArgs $arguments
     *
     * @return string
     */
    public function onGetFrontendController(Enlight_Event_EventArgs $arguments)
    {
        $this->Application()->Template()->addTemplateDir(
            $this->Path() . 'Views/'
        );
        return $this->Path() . 'Controllers/Frontend/deineDatei.php';
    }

In dieser Datei „deineDatei.php“ assignst du die Variable fürs Frontend

kann man nicht eine function innerhalb der bootstrap.php nutzen, in der der Inhalt meiner php-Datei bereits ausgeführt wird? Es handelt sich nämlich nur um eine DB-Abfrage die in einem div ausgegeben werden soll. Diesen div könnte man dann doch als smarty per views ausgeben?

Leider bin ich nicht der große Programmierer  Crying

@Gesundwürzen schrieb:

kann man nicht eine function innerhalb der bootstrap.php nutzen, in der der Inhalt meiner php-Datei bereits ausgeführt wird? Es handelt sich nämlich nur um eine DB-Abfrage die in einem div ausgegeben werden soll. Diesen div könnte man dann doch als smarty per views ausgeben?

Leider bin ich nicht der große Programmierer  Crying

Hallo,

dann frage ich mich, wieso du nicht einfach in der onFrontendPostDispatch die Datenbankabfrage machst und dann die Rückgabe der Abfrage per assign der Template-Datei übergibst und die Rückgabe dann in einem Shopware Block verarbeitest? Dafür brauch man doch nicht versuchen, irgendwelche Dateien rumschieben zu wollen.

Beste Grüße

Sebastian

Geht auch, du kannst auch den inhalt deiner PHP-Datei in Bootstrap ausführen, aber ein include hab ich selbst dort noch nicht gesehen. Vll hat ein anderer Programmierer eine Idee?

public function onPostDispatchFrontend(Enlight_Event_EventArgs $arguments)
    {
        /** @var $controller Shopware_Controllers_Frontend_Index */
        $controller = $arguments->getSubject();

        /** @var $request Zend_Controller_Request_Http */
        $request = $controller->Request();

         /** @var $response Zend_Controller_Response_Http */
        $response = $controller->Response();

         /** @var $view Enlight_View_Default */
        $view = $controller->View();

        if(!$request->isDispatched()||$response->isException()||!$view->hasTemplate() || $request->getModuleName() != "frontend") {
                return;
            }

        $view->deinSmarty = "" . $this->getSlogan() . "";

        $view->addTemplateDir($this->Path() . 'Views/');
        $view->extendsTemplate('responsive/frontend/plugins/deinPluginName/index.tpl');

    }

public function getSlogan()
    {
    
        $sql = "SELECT ...";

        $result = Shopware()->Db()->fetchRow($sql, array(1));

        return $result;
    }

in deinem Template dann:

{deinSmarty}

 

irgendwie kapiere ich den Ausgabe-Pfad nicht. So sieht das jetzt aus:
 

public function onPostDispatchFrontend(Enlight_Event_EventArgs $arguments)
    {
        /** @var $controller Shopware_Controllers_Frontend_Index */
        $controller = $arguments->getSubject();

        /** @var $request Zend_Controller_Request_Http */
        $request = $controller->Request();

         /** @var $response Zend_Controller_Response_Http */
        $response = $controller->Response();

         /** @var $view Enlight_View_Default */
        $view = $controller->View();

        if(!$request->isDispatched()||$response->isException()||!$view->hasTemplate() || $request->getModuleName() != "frontend") {
                return;
            }

        $view->cloud = "" . $this->getSlogan() . "";

        $view->addTemplateDir($this->Path() . 'Views/');
        $view->extendsTemplate('responsive/frontend/plugins/Swagsearchcloud/index.tpl');

    }

public function getSlogan()
    {

        $sql = 'SELECT *
FROM s_search_keywords
WHERE LENGTH( keyword ) >5 AND keyword NOT RLIKE "^[0-9]"ORDER BY RAND() LIMIT 100';

        $result = Shopware()->Db()->fetchRow($sql, array(1));

        return $result;
    }

die Index liegt in: engine/Shopware/Plugins/Local/Frontend/Swagsearchcloud/Views/frontend/index

aber es wird im template nichts eingefügt, auch kein anderer Text:

Inhalt der index.tpl:
 

{extends file='parent:frontend/index/footer.tpl'}

{block name='frontend_index_footer_menu' append}
{$cloud}test test test test 
{/block}

Undecided

Hallo,

also:

$view->extendsTemplate('...');

ist das updateunsicherste was man nur machen kann und Shopware sagt selbst, das man es nicht mehr nutzen soll. Genau deshalb wirst du es auch in keiner (aktuellen) Dokumentation von Shopware mehr finden. Man brauch es auch überhaupt nicht mehr - solange man  $view->addTemplateDir(’…’) nutzt und die Dateien so ablegt, wie Sie im Bare - Theme abgelegt wurden, passiert die Vererbung automatisch.

Beste Grüße

Sebastian

also habe ich das jetzt so geändert:
 

  /** @var $view Enlight_View_Default */
        $view = $controller->View();

        if(!$request->isDispatched()||$response->isException()||!$view->hasTemplate() || $request->getModuleName() != "frontend") {
                return;
            }

        $view->cloud = "" . $this->getSlogan() . "";

        $view->addTemplateDir(
        __DIR__. '/Views'
    );

wird aber auch nichts angezeigt… Es kommt aber auch kein Fehler. Ich habe in der config.php die display-errors eingeschaltet…

@Gesundwürzen schrieb:

also habe ich das jetzt so geändert:
 

/** @var $view Enlight_View_Default */
$view = $controller->View();

if(!$request->isDispatched()||$response->isException()||!$view->hasTemplate() || $request->getModuleName() != “frontend”) {
return;
}

$view->cloud = “” . $this->getSlogan() . “”;

$view->addTemplateDir(
DIR. ‘/Views’
);

wird aber auch nichts angezeigt… Es kommt aber auch kein Fehler. Ich habe in der config.php die display-errors eingeschaltet…

Hallo,

also  $view->cloud wird wahrscheinlich auch nie funktionieren, eher:

$view->assign('cloud', $this->getSlogan());

Wo befüllst du denn überhaupt die Funktion getSlogan()?

Heißt deine Datei auch “footer.tpl” und liegt im Verzeichnis “Views/frontend/index”?

Hast du es mal mit diesem Inhalt probiert:

{extends file='parent:frontend/index/footer.tpl'}

{block name='frontend_index_footer_menu'}
     {$smarty.block.parent}
     {$cloud}test test test test 
{/block}

Beste Grüße

Sebastian

updateunsicher und abwärtskompatibel. Your choice.

Die SQL erwartet 100 Einträge, bei meinem Beispiel war das eine Zeile. Schau mal nach ob das Ergebnis anders ge"fetch"tt werden kann. Dann wird dieses Array in ein div gepresst, das ist nicht gut, besser wäre dann, du machst die ganze logik für das array im template und in der Bootstrap nur $view->cloud = $this->getSlogan();

Hast du deine SQL schon einmal in der Datenbank selbst getestet? Sind die Events richtig registriert?

@brettvormkopp schrieb:

updateunsicher und abwärtskompatibel. Your choice.

Hallo,

du willst also sagen, Shopware hat unrecht? Shopware sagt selbst, man soll $view->extendsTemplate(’…’); nicht mehr nutzen Wink. Und warum? Ganz einfach, man blockiert mit $view->extendsTemplate(’…’); jegliche Anpassungsmöglichkeit durch das eigene Theme.

Beste Grüße

Sebastian

@sschreier‍
ich habe deine Vorschläge umgesetzt:
 

public function onPostDispatchFrontend(Enlight_Event_EventArgs $arguments)
    {
        /** @var $controller Shopware_Controllers_Frontend_Index */
        $controller = $arguments->getSubject();

        /** @var $request Zend_Controller_Request_Http */
        $request = $controller->Request();

         /** @var $response Zend_Controller_Response_Http */
        $response = $controller->Response();

         /** @var $view Enlight_View_Default */
        $view = $controller->View();

        if(!$request->isDispatched()||$response->isException()||!$view->hasTemplate() || $request->getModuleName() != "frontend") {
                return;
            }
        $view->assign('cloud', $this->getSlogan());
        //$view->cloud = "" . $this->getSlogan() . "";

        $view->addTemplateDir(
        __DIR__. '/Views'
    );

    }

die footer.tpl liegt in: /engine/Shopware/Plugins/Local/Frontend/Swagsearchcloud/Views/frontend/index

@brettvormkopp‍
ich habe den Div rausgenommen und in das template gesetzt.

Und die Abfrage funktioniert, das wurde in einer externen Datei getestet.
Ergebnis: es wird nix angezeigt im footer  Undecided

Hallo,

Du solltest Dich mal mit den Templating Grundlagen von Shopware befassen. Deine Frage kannst Du Dir wunderbar anhand der Dokumentation beantworten.

 

Außerdem: PHP Dateien “includen” macht man nicht in der View, dafür sind die Controller Actions bzw. Events da. Dein Vorhaben, so wie ich Dich jedenfalls verstanden habe, widerspricht dem MVC Pattern. Views sollen bzw. dürfen keinerlei Logik enthalten. Die View zeigt lediglich vorbereitete Daten an. Das einzige, was mehr oder weniger legitim an Logik in der View ist, sind einfache if Abfragen, die je nach Benutzer Berechtigung, unterschiedliche Inhalte anzeigen. Das hat sich so eingebürgert, ist aber deswegen nicht ideal, wenn man streng nach dem MVC Pattern vor geht.

 

 

MFG

 

derwunner

du willst also sagen, Shopware hat unrecht? 

Fahr dich mal runter, das habe ich gar nicht gesagt. Ich weiss ja nicht wie deine 4er Plugins aussehen, aber bei mir ging das nicht ohne extendsTemplate(); 

 $view->cloud wird wahrscheinlich auch nie funktionieren,

wahrscheinlich… mhhh …doch? 

@Gesundwürzen‍, wenn da gar nichts ankommt, dann könnte es auch irgendwo anders haken. hast du schonmal probiert $view->cloud = “hallo welt” zu schreiben um das zu testen? Alternativ kannst du mir auch ein PN mit dem ganzen Code schicken.

Gruss.

1 Like