Wie wird das Template-Verzeichnis im eigenen Plugin (5.2+) festgelegt?

Hi, also zu meinem Problem… ich habe ein altes Plugin (_engine/shopware/plugins/community…/ myOldPlugin _) auf die neue Pluginstruktur (_custom/plugins/ myNewPlugin _) umgeschrieben und es läuft auch so wie es soll. Das einzige Problem das ich habe ist, ich muss die alte Striktur drin lassen weil mein neues Plugin weiterhin auf die Templatestruktur des alten Plugins zurück greift.

Es handelt sich hier um ein neues Emotion Content Element. Das Element wird wie folgt erzeugt:

$component = $this->createEmotionComponent(array(
    'name' => 'myNewECElement',
    'template' => 'emotion_test',
    'cls' => 'emotion-content-component-class',
    'xtype' => 'emotion-components-test',
    'description' => 'Emotion Content Element erzeugen.'
));

$component->createMediaField(array(
    'name' => 'emotion_image',
    'fieldLabel' => 'Bild',
    'defaultValue' => '',
    'allowBlank' => true
));

$component->createTextField(array(
    'name' => 'emotion_link',
    'fieldLabel' => 'Link-Adresse',
    'supportText' => 'Link Adresse',
    'helpTitle' => 'Hier können Sie die Link Adresse definieren.',
    'helpText' => 'Hier können Sie die Link Adresse definieren.',
    'defaultValue' => 'http://www.google.de',
    'allowBlank' => false
));

 Meine Events und die entsprechende Methode

public static function getSubscribedEvents()
    {
        return [
            'Theme_Compiler_Collect_Plugin_Less' => 'addLessFiles',
            'Enlight_Controller_Action_PostDispatchSecure_Backend_Emotion', 'onPostDispatchBackendEmotion'
        ];
    }

public function onPostDispatchBackendEmotion(\Enlight_Controller_ActionEventArgs $args)
    {
        /** @var \Shopware_Controllers_Backend_Emotion $controller */
        $controller = $args->getSubject();
        $view = $controller->View();

        #Test ob es hiermit funktioniert
        $this->container->get('template')->addTemplateDir(
            $this->getPath() . '/Resources/Views/'
        );

        $view->addTemplateDir($this->getPath() . '/Resources/Views/');
        $view->addTemplateDir($this->getPath() . '/Views/');
        $view->extendsTemplate('backend/emotion/my_emotioncomponent/view/detail/elements/ffb_emotion.js');
    }

Hier werden mehrere TemplateDirs geadded und in jedem liegt eine emotion_test.tpl 

Der Inhalt der jeweiligen tpl ist nur ein Satz wie “Ich komme aus dem Verzeichnis X

Aber egal was ich auch bei der Templatedir schreibe… er greift immer auf die alte Struktur zurück. 

TemplateDir der alten Struktur: MyPlugin/Views/emotion_components/widgets/emotion/components/emotion_test.tpl

TemplateDir der neuen Struktur:  MyNewPlugin/Views/emotion_components/widgets/emotion/components/emotion_test.tpl

_ Optionales TemplateDir in der neuen Struktur:MyNewPlugin/Resources/Views/emotion_test.tpl

Warum nimmt er nicht das angegebe Verzeichnis?

Habe ich was vergessen oder mache es sogar falsch ?

Ich bin mir nicht 100% sicher, ob ich das so richtig verstanden habe, aber schauen wir mal…

Wenn er deine Templates nicht einliest, könnte das durchaus daran liegen, dass er diese nicht findet. Registrieren müsstest du die z.B. über

 "$this-\>container-\>get('Template')-\>addTemplateDir(DeinProjektPfad/Resources/Views)" als Reaktion auf z.B. "Enlight\_Controller\_Action\_PreDispatch\_Frontend" (oder ..\_Backend)

Allerdings könnte ich mir denken, dass du dein Plugin umschreiben musst, da Shopware nicht so flexibel zu sein scheint und starr auf die eigene Struktur besteht.

Wenn die nicht mit deinem Plugin übereinstimmt, könnte es also generell schon problematisch werden, ob die Templates nun gefunden würden oder nicht.

Hoffe das trifft in etwa dein Problem oder verweist wenigstens in die richtige Richtung.

 

So ist es ja bei mir auch im Post beschrieben.

Habe es mittlerweile hinbekommen. 

Es lag daran das ich das Plugin wohl nicht richtig übergeben habe… 

habe mir dann einfach ne Helperfunktion geschrieben…

private function getPluginPath()
{
    return $this->container->get('kernel')->getPlugins()['MyPlugin']->getPath();
}

Damit hat es dann geklappt.