Shopware 5.2 plugin - bare template überschreiben

Hallo,

ich musste auch etwas suchen, bis ich das nach der neuen 5.2 Plugin Struktur gefunden hatte. Die alte Bootstrap.php ist jetzt gleichzusetzen mit Deiner genamespacten Klasse, also so in etwa (in dem Beispiel gehe ich davon aus, dass dein Plugin CompanyPlugin heißt):

Datei custom/plugins/CompanyPlugin/CompanyPlugin.php:

 'onGetControllerPath',
            'Enlight_Controller_Action_PostDispatchSecure_Frontend_Detail' => 'onPostDispatchDetail'
        ];
    }

    public function install(InstallContext $context)
    {
        // prepare plugin, e. g. create own db tables
    }

    public function uninstall(UninstallContext $context)
    {
        // clean up, e. g. drop plugin db tables
    }

    public function onGetControllerPath()
    {
        // register the template directory for the controller actions
        $this->container->get('Template')->addTemplateDir(
            $this->getPath() . '/Resources/Views'
        );

        return $this->getPath() . '/Controllers/Frontend/MyController.php';
    }

    public function onPostDispatchDetail(\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();

        $sArticle = $view->getAssign('sArticle');

        $view->Engine()->addTemplateDir(
            $this->getPath() . DIRECTORY_SEPARATOR . 'Resources' . DIRECTORY_SEPARATOR . 'Themes' . DIRECTORY_SEPARATOR
        );

        $sArticle['someCustomVar'] = 'hello article detail page!';
        $view->assign('someCustomVar', $sArticle);
    }
}

Das obige Beispiel zeigt, wie du einen eignenen Controller im Modul Frontend anlegen kannst und wie Du dafür eigene Smarty Template Views vergibst. Der zweite Event Listener steht beispielhaft dafür, wie Du Shopware Views überschreiben und dessen View Variablen beeinflussen kannst. In dem Beispiel habe ich dafür die Artikel Detail Ansicht gewählt. Für die meisten Shopware Controller Actions gibt es ein PreDispatch und ein PostDispatch Event. Pre ist immer vor- und Post immer nach der Action Ausführung.

Willst jedoch generell alle Views von Bare oder Responsive überschreiben, dann musst Du deinen View Ordner bereits in einem recht frühen und vor allem allgemeinen Event registrieren. Wichtig ist, egal ob Du einzelne Views überschreiben willst, oder einfach alle, Shopware muss den Pfad zu deinen Views kennen. Die Ordnerstruktur darunter muss auch zwingend so aufgebaut sein, wie es im Bare Theme vorgegeben ist. Andernfalls findet Shopware deine Views nicht und es wird das im Shop ausgewählte Theme anstatt von Deinen Views angezeigt.

Außerdem empfehle ich dir eher zu einem eigenen Theme, wenn du einfach alles überschreiben willst, denn genau das macht ein Theme. Das Responsive Theme ist zum Beispiel vom Bare Theme abgeleitet. Also schaue Dir einfach an, wie es dort gelöst ist und leite dich selbst mit einem eigenen Theme von Bare ab. Wenn du dein Theme in den Shopware App Store stellen willst, dann muss es widerrum ein Plugin sein. Also Du siehst, es läuft im Endeffekt aufs selbe raus.

 

Das hat also nichts mit Windows zu tun, sondern es liegt rein an der Template Registrierung, damit Shopware es kennt. Ganz wichtig ist auch allgemein, wenn es um die Ordnerstruktur geht: Beachte Groß- und Kleinschreibung der jeweiligen Ordner. Das mag unter Windows nicht wichtig sein, weil das dort nicht unterschieden wird, sobald aber dein PHP Skript unter Linux oder Mac läuft, geht plötzlich gar nichts mehr, wenn man das nicht beachtet. Shopware ist da laut meiner Erfahrung nicht so sensibel, würde mich aber trotzdem vorsichtshalber daran halten.

2 „Gefällt mir“