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:
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 ?
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.
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:
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/'
);
}
}
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.