Shopware 5.2 plugin - bare template überschreiben

Hi zusammen,

ich versuche aus der neuen Plugin Struktur verzweifelt eine template Datei aus dem bare zu überschreiben. Die Template Dateien die ich für meine Controller brauche findet das System ohne Probleme, allerdings werden die Überschreibungen ignoriert.

Ich hatte die Template Dateien unter meinem Plugin schon in “Resources/Views” als auch “Views/” liegen. Beides führte zu keinem Ergebnis.

Unter Views hatte ich dann Pfade wie “frontend/checkout/items/product.tpl”. Diese wurden aber nicht gefunden. Es wird immer das default aus dem bare genommen.

Übersehe ich etwas was ich in den der neuen Struktur machen muss? Ich nutze Shopware 5.2.6 und habe mein Plugin in “custom/plugins” liegen.

Besten Dank im voraus und viele Grüße

Hi,

interessant wäre der Inhalt deiner Plugin Datei. Poste den mal bitte
Hast du den richtigen Controller angelegt in Deinplugin/Controllers/Frontend/Deinplugin.php ?

 

Hi,

Vielleicht verstehe ich den Grund deiner Frage falsch, aber die templates die für meinen Controller benötigt werden, werden korrekt geladen und funktionieren auch bereits. Also wenn ich eine indexAction habe, wird die index.tpl auch geladen.

Was ich aber gerne möchte ist, dass die product.tpl im Checkout durch meine eigene product.tpl erweitert wird. Eigentlich soll ja die Regel gelten bare -> plugin -> theme. Nur irgendwie greift mein Plugin nie. In meiner Theme habe ich die product.tpl nicht angepasst.

 

 

Hallo,

hast Du das mal testhalber den Wert von $injectBeforePlugins in der theme.php geändert: Getting started with Smarty

Passiert das unter Windows? Ich hatte mal ein ähnliches Problem, das ist aber nur unter Windows aufgetretet, unter Linux hat es dann funktioniert.

Viele Grüße

Andi

Hi,

wir haben das injectBeforePlugins eingebunden. Ohne Erfolg.

Wir haben leider kein Linux System hier um das zu testen, aber ja es tritt auf Windows Geräten auf.

Hm, dann könnte das aber schon ein Windows-Problem sein. Hatte ich, wie gesagt, auch schon. Das Erweiterte Menü z.B. läuft bei mir auch nicht unter Windows.
Könnt ihr nicht die Installation testhalber auf einen Linux-Server schieben und mit einer Subdomain testen? Irgendwann muß es ja eh auf einen Linux-Server, da Shopware Windows offiziell nicht unterstützt.

Viele Grüße

Andi

(Ich gehöre zum Fragesteller.)
Der Server läuft auf Linux, das war eben ein kleines Missverständnis. Das kann daher nicht die Ursache des Problems sein.

Das Stimmt. Der Server ist ein Linux, habe es verwechselt.

Ist es vielleicht einfach nicht vorgesehen bar templates von Shopware aus einem Plugin heraus zu erweitern bzw. zu überschreiben?

Nicht das man am Ende noch an den Core dran muss, um es Möglich zu machen :/.

Als Nebeninfo, keine Ahnung ob es was bringt, aber in der alten Pluginstruktur funktioniert alles wie gewünscht, eben nur unter custom/plugins nicht.

Muss man ggf. noch mehr einrichten in der Bootstrap.php? Wir setzen hier nur unser templateDir mit:

$this->addTemplateDir($this->getPath().'/Resources/Views/');

Unsere Views liegen dann in unserem Plugin unter Resources/Views. In dem Ordner liegt dann ein Ordner frontend und darunter checkout/items/product.tpl.

In der neuen Pluginstruktur müssen die Templates so eingebunden werden.

/DeinPluginOrdner/Resources/views/frontend/

Im Dispatcher muss dann folgender Code rein:

 

       $this->container->get('Template')->addTemplateDir(
         $this->getPath() . '/Resources/views/'
       );

 

1 Like

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 Likes

Hi derwunner,

jetzt geht es!

Respekt. Ich weiß nicht wie Du darauf gekommen bist, aber aus den Dokumentationen wurde ich nicht schlau. Ich könnte schwören das Stand dort auch nirgendswo.

Aber vielen Dank für deine Hilfe!

@Raidri_of schrieb:

Hi derwunner,

jetzt geht es!

Respekt. Ich weiß nicht wie Du darauf gekommen bist, aber aus den Dokumentationen wurde ich nicht schlau. Ich könnte schwören das Stand dort auch nirgendswo.

Aber vielen Dank für deine Hilfe!

Hallo,

das steht auch so in der Shopware Dokumentation zum neuen Pluginsystem ab Shopware 5.2 (Aufbau und Name der Datei, Events, Beispielcode): https://developers.shopware.com/developers-guide/plugin-system/ . Alternativ gibt es unten ja auch einige Beispiel-Plugins dazu.

Beste Grüße
Sebastian

Ich kann die Info nicht finden. Kannst du mir bitte einen genaueren Link oder ein Zitat schicken?

@Orangenjäger schrieb:

Ich kann die Info nicht finden. Kannst du mir bitte einen genaueren Link oder ein Zitat schicken?

Das wirst Du auch nich alles auf einer Seite finden, da es teilweise Theme Entwicklung und teilweise Plugin Entwicklung ist.

Entweder man erstellt ein eigenes Theme und leitet sich von Bare ab, dann muss man aber alle Views (alles Smarty Templates) selber erstellen, die Shopware bietet, oder man überschreibt nur einzelne Views mittels eines Plugins (wie ich oben bereits beschrieben hatte). Beantwortet das die Frage?

 

Am Rande gilt noch die Überschreibungsreihenfolge zu erwähnen (von unten nach oben): Theme => Plugin => Artikel Theme. Gibt es kein Plugin, dass irgend eine View beeinflusst, dann gewinnt das Theme. Gibt es ein Plugin, dass einzelne Views überschreibt, dann gewinnt das Plugin. Überschreibt man z. B. die Artikel Detailseite im Plugin UND legt gleichzeitig ein Theme für den selbigen Artikel fest, dann gewinnt das Theme. Dadurch ist es zum Beispiel möglich ein Plugin zu installieren und Ausnahmen für bestimmte Artikel zu definieren, in denen sich die Plugin View nicht auswirkt (als Anwendungsfallbeispiel).

Ich würde das gern mal aufwärmen :slight_smile:

Ich bin gerade hier gelandet, weil ich das oben angesprochene Problem der Windows-Umgebung habe … :frowning: (auf dem Livesystem wird das Template aus Bare im Plugin erweitert, auf dem Windows-Rechner nicht).

Gibt es dazu inzwischen eine Lösung? 

Vielen Dank :slight_smile:

@wolkenkrieger‍:

Windows wird offiziell nicht unterstützt. Dass es nicht eingebunden wird, liegt wahrscheinlioch daran, dass Windows eine Beschränkung auf die Länge eines Pfades hat. Ich habe gesehen, dass es helfen kann, wenn man den Shop direkt unter C: laufen lässt. Also C:\shopware\shopware.php .

Dann sind die Pfade nicht zu lange und es klappt.

Viele Grüße

Versuch macht kluch :slight_smile:

 

Danke dir

 

[Nachtrag]

Klappt leider nicht :frowning:

Hallo,

versuch mal auf deinem Windows System die Funktion setTemplateDir in der Datei …shopware\engine\Library\Enlight\Template\Manager.php mit folgenden Code zu ersetzen,

   /**
     * Set template directory
     *
     * @param string|array $template_dir directory(s) of template sources
     * @return Smarty current Smarty instance for chaining
     */
    public function setTemplateDir($template_dir)
    {
        
        $template_dir = (array) $template_dir;

        foreach ($template_dir as $k => $v) {
            $template_dir[$k] = $this->resolveTemplateDir($v, $k);
            if ($template_dir[$k] === false) {
                unset($template_dir[$k]);
            }
        }

         /**
         * Filter all directories which includes the new shopware themes.
         */
        $themeDirectories = array_filter($template_dir, function ($themeDir) {
              if(stripos($themeDir, DIRECTORY_SEPARATOR . ‚Themes‘ . DIRECTORY_SEPARATOR . ‚Frontend‘ . DIRECTORY_SEPARATOR)){
                return $themeDir;
            }
        });

        /**
         * If no shopware theme assigned, we have to use the passed inheritance
         */
        if (empty($themeDirectories)) {

            return parent::setTemplateDir($template_dir);
        }
        /**
         * Select the plugin directories and the bare theme which used
         * as base theme for all extensions
         */
        $pluginDirs = array_diff($template_dir, $themeDirectories);

        if(sizeof($pluginDirs)> 0){
               $inheritance = $this->buildInheritance($themeDirectories, $pluginDirs);
                $inheritance = $this->unifyDirectories($inheritance);
                 return parent::setTemplateDir($inheritance);    
                     
        }else{
            return parent::setTemplateDir($themeDirectories);
        }
 
      
    }

 

Im Orginal wird bei Pfaden nur auf \ von Linux Dateisytemen geprüft. Dadurch wird das Plugin-Dir nicht in den Templatepfad gesetzt und Shopware lädt das Template aus dem Bare Template.

Es ist allerdings in Hack. da die Orginal Shopware Datei verändert wird. Bei einem Update kann das dann wieder weg (überschrieben) sein. Also nur zum Testen unter Windows. Bei mir geht es.

Grüße

Frank