Template per Plugin erweitern - Neues Pluginsystem

Hallo,

ich habe hier ein kleines Problem. Es geht um ein Plugin das, unter anderem, im Checkout dem Template etwas hinzufügen soll. Wenn ich das “neue” Pluginsystem richtig verstanden habe sollte das so funktionieren wie ich es gemacht habe:

 public static function getSubscribedEvents()
    {
        return [
            'Enlight_Controller_Action_PostDispatchSecure_Frontend_Checkout' => 'onCheckoutFinish'
        ];
    }

    public function onCheckoutFinish(\Enlight_Event_EventArgs $args)
    {
        /** @var \Enlight_Controller_Action $controller */
        $controller = $args->getSubject();

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

        if ($request->getActionName() !== 'finish') {
            return;
        }

        $controller->View()->addTemplateDir( __DIR__.'/Resources/views/frontend/checkout');
    }

Unter Resources/Views/frontend/checkout/index.tpl:

{extends file="parent:frontend/checkout/index.tpl"}
{block name='frontend_checkout_confirm_product_table' prepend}
//Stuff
{/block}

Es passiert nach einer neuinstallation schlicht garnichts. Der Subscriber wird allerdings aufgerufen. Ich habs auch schon per extendsTemplate(…) versucht, hier wirft zumindest smarty einen Fehler, aber das soll man ja wohl nicht mehr benutzen. Bisher hab ich mit dem alten Plugin System gearbeitet und da hat das alles funktioniert aber irgendwann ist nunmal Zeit das umzustellen.

Ich vermute ich habe hier einen Grundlegenden Fehler drin.  Kann mich mal jemand draufschubsen ?

Zwei Sachen fallen mir auf zu meinem Plugin (auch neues System):

  • Wenn dein Controller in einem Ordner liegt wie z.B. controller ist der Pfad falsch da du zuerst “eins höher” gehen musst.
  • Das frontend hab ich bei mir nicht obwohl es den Ordner wie bei mir auch gibt.

Versuch mal folgendes:

$controller->View()->addTemplateDir( __DIR__.'/../Resources/views/checkout');

Wenn’s nicht geht probier mal das ContainerInterface per DI einzubinden und dann das Template so zu registrieren:

class YourClass implements SubscriberInterface
{
  private $container;

  public function __construct(ContainerInterface $container)
  {
    $this->container = $container;
  }

  public function onBlabla(\Enlight_Event_EventArgs $args)
  {
    // ...
    $this->container->get('template')->addTemplateDir( __DIR__. '/../Resources/views');
  }
}

services.xml:

 

Danke für die Antwort, 

leider hilft mir das nicht weiter.

Ich hab die Services XML um den Container erweitert. Der Kontruktor wird auch aufgerufen. Allerdings ist der Container null:  Fatal error : Call to a member function get() on null.

Der Subscriber ist auch registriert, wird auch aufgerufen. Nur im Frontend kommt nichts an.

Ich habe das ganze soweit entschlackt wie möglich um alle Fehler auszuschliessen, aber es passiert schlicht nichts.

Daher habe ich den Template Teil in ein simples Testplugin gepackt damit es übersichtlich bleibt.

Hier ist allerdings der Fehler unverändert.

Das Plugin habe ich mal bei Dropbox hochgeladen: Dropbox - File Deleted

 

 

@jensfiedler schrieb:

controller->View()->addTemplateDir( __DIR__.'/Resources/views/frontend/checkout'); }

Das ist falsch. Du musst quasi nur das Start-Verzeichnis angeben, wenn du die Struktur des Bare-Themes beibehälst. Also so z.B.:

	public function onFrontendPostDispatch(\Enlight_Controller_ActionEventArgs $args)
	{
		 /** @var \Enlight_Controller_Action $controller */
		  $controller = $args->get('subject');
		  $view = $controller->View();
		  $this->container->get('Template')->addTemplateDir(
		  $this->getPath() . '/Resources/views/'
		  );
	}

Versuch es daher nur mal mit /Resources/views. 

Hallo,

das hatte ich im Ursprungsplugin auch schon. Wenn ich das ganze nun so, wieder mit dem Container mache kommt es zu folgender Meldung:

Fatal error : Call to undefined method testplugin\Subscribers\Testsubscriber::getPath() in  /data/www/shopware/testumgebung/shopware/custom/plugins/testplugin/Subscribers/Testsubscriber.php  on line  35

namespace testplugin\Subscribers;

use Enlight\Event\SubscriberInterface;

class Testsubscriber implements SubscriberInterface
{
    private $container;

    public function __construct(ContainerInterface $container)
    {
        $this->container = $container;
    }

    public static function getSubscribedEvents()
    {
        return [
            'Enlight_Controller_Action_PostDispatchSecure_Frontend' => 'onFrontend'
        ];
    }

    public function onFrontend(\Enlight_Event_EventArgs $args)
    {
        /** @var \Enlight_Controller_Action $controller */
        $controller = $args->get('subject');
        $view = $controller->View();
        $this->container->get('Template')->addTemplateDir(
            $this->getPath() . '/Resources/views/'
        );
    }
}

Vorher war im Test folgendes hinterlegt, da war der Pfad auch korrekt. Trotzdem hats nicht funktioniert:

$controller = $args->get('subject');
$view = $controller->View();
$view->addTemplateDir($this->pluginDirectory . '/Resources/Views/');

 

Hast du auch pluginDirectory injectet?

Nee das hab ich bei den ganzen Versuchen übersehen.

Unabhängig davon sollte doch :

$controller->View()->addTemplateDir(__DIR__.’/…/Resources/views’); 

auch funktionieren ?

So plugin Directory wird nun auch injected. Habs auch kontrolliert, der Pfad stimmt. Funktioniert aber trotzdem nicht :confused:

Kannst du mal deine aktuelle Datei posten? Ich bin gerade verwirrt bei welchen Stand du bist :smiley:

Subscriber:

namespace testplugin\Subscribers;

use Enlight\Event\SubscriberInterface;

class Testsubscriber implements SubscriberInterface
{
    private $pluginDirectory;
    private $container;

    public function __construct(ContainerInterface $container,$pluginDirectory)
    {
        $this->container = $container;
        $this->pluginDirectory = $pluginDirectory;

    }
    public static function getSubscribedEvents()
    {
        return [
            'Enlight_Controller_Action_PostDispatchSecure_Frontend' => 'onFrontend'
        ];
    }

    public function onFrontend(\Enlight_Event_EventArgs $args)
    {
        $controller = $args->get('subject');
        $view = $controller->View();
        $view->addTemplateDir($this->pluginDirectory . '/Resources/Views/');
    }
}

Services:

            %testplugin.plugin_dir%

 

Das ganze Event Gedöns muss man doch gar nicht mehr machen seit Shopware ( habe die Version vergessen :smiley: )?

Schau dir als Code Beispiel einfach mal folgendes Theme Plugin an -> GitHub - Blur-Creative/theme-foundation

$this->pluginDirectory . ‘/Resources/Views/’

Lass dir das mal ausgeben und beachte Groß- und Kleinschreibung.

Viele Grüße
https://www.digitvision.de

Ich habe das jetzt mal nachgebaut - bei mir funktioniert das auch einwandfrei. Auffällig ist, dass es garkeine checkout/index.tpl gibt, also kann dein Template auch nie greifen. Mein test sah so aus:

MNTest.php

 

Subscriber/Frontend.php

container = $container;
        $this->pluginDirectory = $pluginDirectory;
    }

    public static function getSubscribedEvents()
    {
        return [
            'Enlight_Controller_Action_PreDispatch_Frontend' => 'onFrontend',
            'Enlight_Controller_Action_PreDispatch_Widgets' => 'onFrontend'
        ];
    }

    public function onFrontend(\Enlight_Event_EventArgs $args)
    {
        $this->container->get('Template')->addTemplateDir(
            $this->pluginDirectory . '/Resources/views/'
        );
    }
}

Resources/services.xml

            %m_n_test.plugin_dir%

 

Resources/views/frontend/checkout/confirm.tpl

{extends file="parent:frontend/checkout/confirm.tpl"}
{block name='frontend_checkout_confirm_product_table'}
    Hallo
{/block}

 

Sieht dann so aus:

 

Getestet habe ich das jetzt in der 5.5. Die Theme-Dateien müssen aber die Struktur des Themes wiederspiegeln. 

1 „Gefällt mir“

@Moritz Naczenski schrieb:

Die Theme-Dateien müssen aber die Struktur des Themes wiederspiegeln. 

Kennt ihr das wenn die Lösung unglaublich simpel ist ? Durch das viele herumprobieren hatte ich aus versehen einen zweiten ordner (index) paralell zu checkout im Plugin liegen…

Kaum war der entfernt wurden die Templates geladen. Dann stand nur noch ein Vererbungsfehler mit unserem Theme im Weg.