Reihenfolge verdreht - Plugin soll Theme Smarty Block überschreiben

Hallo,

ich möchte innerhalb eines Plugins einen Block von der Artikeldetailseite anpassen. Leider wird dieser Block vom Shopware Standard Theme Responsive immer überschrieben. Prinzipiell funktioniert es, ich sehe auch im Profiler, dass mein Block zum Überschreiben geladen wird. Aber die Reihenfolge stimmt noch nicht. Das Plugin soll das Responsive Theme überschreiben.

Bisher habe ich folgenden Code (5.2 Plugin):

namespace ExampleMyPlugin;

use Shopware\Components\Plugin;
use Shopware\Components\Plugin\Context\InstallContext;

class ExampleMyPlugin extends Plugin
{
    public static function getSubscribedEvents()
    {
        $ar = parent::getSubscribedEvents();
        $ar['Enlight_Controller_Action_PostDispatchSecure_Frontend_Detail'] = 'onPostDispatchDetail';

        return $ar;
    }

    public function install(InstallContext $context)
    {
        parent::install($context); // TODO: Change the autogenerated stub
    }

    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();
        //Check if there is a template and if an exception has occured
        if (!$request->isDispatched() || $response->isException() || !$view->hasTemplate()) {
            return;
        }
        // the $view->addTemplateDir does not support the position element.
        $view->Engine()->addTemplateDir(
            $this->getPath() . 'Resources' . DIRECTORY_SEPARATOR . 'Themes' . DIRECTORY_SEPARATOR,
            null,
            \Enlight_Template_Manager::POSITION_APPEND
            );
        $view->extendsTemplate('frontend' . DIRECTORY_SEPARATOR . 'detail' . DIRECTORY_SEPARATOR . 'index.tpl');
    }
}

Es war nicht direkt möglich, über $view->addTemplateDir die Reihenfolge festzulegen, deswegen der Umweg über $view->Engine(). Der Parameter prepend oder append hat anscheinend auch keine Auswirkung. Bei beidem kommt das selbe Ergebnis raus.

Welcher Block ausgegeben wird, habe ich letzendlich über die Definition eines eigenen Blocks mit jeweils unterschiedlichem Inhalt heraus gefunden. Zur Zeit wird mir der Inhalt vom Responsive Theme angezeigt. Ich möchte aber, dass mir der Inhalt vom Plugin angezeigt wird.

Für Hilfe wäre ich dankbar.

 

MFG derwunner

Hi derwunner, 

@derwunner schrieb:

Es war nicht direkt möglich, über $view->addTemplateDir die Reihenfolge festzulegen, deswegen der Umweg über $view->Engine().

Die Reihenfolge lautet: Bare > Responsive > Plugins > Custom Theme.

  1. Daher musst du an der Reihenfolge gar nichts ändern. Bitte nutze daher die addTemplateDir-Methode des $view-Objektes. 

  2. Folgende if-Abfrage kannst du dir sparen. Diese wird im PostDispatchSecure bereits von Shopware durchgeführt (siehe hier). Das ist unsauber und doppelt.

    //Check if there is a template and if an exception has occured
    if (!$request->isDispatched() || $response->isException() || !$view->hasTemplate()) {
    return;
    }

  3. Diese Zeile muss entfernt werden, damit das mit der Reihenfolge klappt. Du möchtest ja das Bare/Responsive-Theme überschreiben.

    $view->extendsTemplate(‚frontend‘ . DIRECTORY_SEPARATOR . ‚detail‘ . DIRECTORY_SEPARATOR . ‚index.tpl‘);

Sollte es danach noch nicht klappen, zeige uns doch mal den Inhalt deiner .tpl Datei.

Viele Grüße

1 „Gefällt mir“

Hat nun geklappt, nach dem ->getPath hat ein Pfadtrenner gefehlt (immer diese Falle mit qualifizierten und unqualifzierten Pfadangaben), das war alles. Ich finde es aber komisch, dass dann von Smarty keine Exception fliegt, dass er das Template nicht gefunden hat.

Ich werde es noch verbessern gemäß Deiner Antwort. Vielen Dank dafür!