# Plugin: Uncaught SmartyException: directory not allowed by security setting

**URL:** <https://forum.shopware.com/t/plugin-uncaught-smartyexception-directory-not-allowed-by-security-setting/48703>\
**Category:** Programmierung\
**Created:** [9. Oktober 2017 um 09:34 UTC](https://forum.shopware.com/t/plugin-uncaught-smartyexception-directory-not-allowed-by-security-setting/48703 "2017-10-09T09:34:05Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![devnullroot](https://avatars.discourse-cdn.com/v4/letter/d/3bc359/32.png) [@devnullroot](https://forum.shopware.com/u/devnullroot)\
**Post date:** [9. Oktober 2017 um 09:34 UTC](https://forum.shopware.com/t/plugin-uncaught-smartyexception-directory-not-allowed-by-security-setting/48703/1 "2017-10-09T09:34:05Z")

</div>

Moin Zusammen,

zwar existieren schon ein paar Einträge bzgl. der Smarty-Exceptions, aber ich bin nicht sicher, ob diese auf mein Problem zutreffen:

Ich habe ein Plugin, welches unter anderem das \frontend\listing\product-box\box-basic.tpl erweitert. Das Problem tritt auf Detail Seiten auf. Wird ein Produkt, das auf dieser Detailseite in einem der Cross-Selling-Slider erscheint, geändert (z.B. Preis erhöht) und die Seite anschließend neu geladen, fehlen Teile der Seite und es ergibt sich folgende Fehlermeldung im Log:

```
PHP Fatal error: Uncaught SmartyException: directory '/home/vagrant/www/shopware/engine/Shopware/Plugins/Local/Frontend/TestPlugin1/Views/frontend/listing/product-box/box-basic.tpl' not allowed by security setting in /home/vagrant/www/shopware/engine/Library/Smarty/sysplugins/smarty_security.php:381
Stack trace:
#0 /home/vagrant/www/shopware/engine/Library/Smarty/sysplugins/smarty_internal_resource_file.php(33): Smarty_Security->isTrustedResourceDir('/home/vagrant/w...')
#1 /home/vagrant/www/shopware/engine/Library/Smarty/sysplugins/smarty_resource.php(532): Smarty_Internal_Resource_File->populate(Object(Smarty_Template_Source), NULL)
#2 /home/vagrant/www/shopware/engine/Library/Smarty/sysplugins/smarty_internal_resource_extends.php(41): Smarty_Resource::source(NULL, Object(Enlight_Template_Manager), '/home/vagrant/w...')
#3 /home/vagrant/www/shopware/engine/Library/Enlight/Components/Snippet/Resource.php(76): Smarty_Internal_Resource_Extends->populate(Object(Smarty_Template_Source), NULL)

```

Der Fehler tritt nur auf, wenn der HTTP-Cache aktiviert ist. Nach Leerung des Caches tritt der Fehler nicht auf, bis oben beschriebene Änderungen durchgeführt wurden. Der Fehler trat erst nach einem Wechsel auf 5.3.2/5.3.3 auf.

Ich habe es mit einem simplen Testplugin nachgestellt (Auszug, mehr steht aber nicht wirklich drin):

```
public function install() {
    $this->subscribeEvent( 'Enlight_Controller_Action_PostDispatchSecure_Frontend', 'onFrontendPostDispatch' );
    return true;
}

public function onFrontendPostDispatch( Enlight_Event_EventArgs $args ) {
    $controller = $args->get('subject');
    $view = $controller->View();
    $view->addTemplateDir( __DIR__. '/Views' );
}

```

Einzige Template-Datei ist die oben erwähnte “box-basic.tpl”. Diese ist bis auf die Zeile

```
{extends file="parent:frontend/listing/product-box/box-basic.tpl"}

```

leer. Es liegt also keine Nutzung eines nicht mehr unterstützten Smarty/PHP-Befehls vor. Bei deaktivierter Template-Security

```
'template_security' => array (
    // @deprecated with 5.3, config switch will be removed with 5.4
    'enabled' => false,
),

```

tritt der Fehler nicht auf. Dies ist wegen @deprecated natürlich keine Option.

Daraufhin habe ich mir in der “smarty\_security.php -\> isTrustedResourceDir()” das “$this-\>\_resource\_dir”-Array in eine Log-Datei schreiben lassen (vor dem letzten while(true), ~363). Bei erstem Aufruf einer Seite ist das Plugin-Template-Dir darin vorhanden. Im zweiten Schritt jedoch nicht mehr. Daraufhin schmeißt die Methode natürlich eine Exception.

Ich weiß nicht mehr weiter. Möglicherweise entspricht das der Problematik in [Shopware Issuetracker](https://issues.shopware.com/issues/PT-8405), ich weiß es aber ehrlich gesagt nicht. Oder ich seh den Wald vor lauter Bäumen nicht ☹

Beste Grüße und Dank,  
devnullroot

---

<div class="post-metadata">

**Author:** ![devnullroot](https://avatars.discourse-cdn.com/v4/letter/d/3bc359/32.png) [@devnullroot](https://forum.shopware.com/u/devnullroot)\
**Post date:** [21. November 2017 um 00:43 UTC](https://forum.shopware.com/t/plugin-uncaught-smartyexception-directory-not-allowed-by-security-setting/48703/2 "2017-11-21T00:43:26Z")

</div>

Ich antworte mir hier mal selber, vlt. hilft es ja jemandem. Die Lösung wurde mir in diesem Thread von „sonic“ gegeben:  
Thread: [https://forum.shopware.com/discussion/48765/5-3-2-unser-freund-der-unknown-tag-s/](https://forum.shopware.com/discussion/48765/5-3-2-unser-freund-der-unknown-tag-s/)  
"sonic"s Hinweis: [https://forum.shopware.com/discussion/comment/207508/#Comment\_207508](https://forum.shopware.com/discussion/comment/207508/#Comment_207508)

Vielen Dank an dieser Stellen noch mal an „sonic“!

Was ich in meinem Plugin gemacht habe:

Ich habe ein „dummy“ subscribe auf  
$this-\>subscribeEvent( ‚Enlight\_Controller\_Action\_PostDispatch‘, ‚addTemplates‘ );  
gemacht. Dies ist wohl früh genug, damit die security nicht „einschreitet“

In der „addTemplates“ habe ich lediglich das/die Template Dirs „bekannt“ gemacht:

```
$controller = $args->get('subject');
$view = $controller->View();
$view->addTemplateDir( __DIR__. '/Views' );

```

Danke nochmal an „sonic“, der mich auf den Weg gebracht hat!

devnullroot

---

<div class="post-metadata">

**Author:** ![Moritz\_Naczenski](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/moritz_naczenski/32/7792_2.png) [@Moritz\_Naczenski](https://forum.shopware.com/u/Moritz_Naczenski)\
**Post date:** [21. November 2017 um 06:16 UTC](https://forum.shopware.com/t/plugin-uncaught-smartyexception-directory-not-allowed-by-security-setting/48703/3 "2017-11-21T06:16:56Z")

</div>

Das Hauptproblem war wohl, dass dir noch ein AddTemplateDir für den Widgets Call fehlte, da die Produkt-Boxen auch per Widget nachgeladen werden.

---

<div class="post-metadata">

**Author:** ![devnullroot](https://avatars.discourse-cdn.com/v4/letter/d/3bc359/32.png) [@devnullroot](https://forum.shopware.com/u/devnullroot)\
**Post date:** [21. November 2017 um 17:06 UTC](https://forum.shopware.com/t/plugin-uncaught-smartyexception-directory-not-allowed-by-security-setting/48703/4 "2017-11-21T17:06:03Z")

</div>

Mmmh, das kann aber irgendwie nicht sein (oder ich hab grade einen Knick in der Logik). Denn warum funktioniert es ohne Cache wie es soll? Also es reicht “Enlight\_Controller\_Action\_PostDispatchSecure\_Frontend” zu subscriben um z.B. in der “box-basic.tpl” TEST ausgeben zu lassen. Wird überall (Listings,Cross-Selling auf der Detailseite, Topseller) brav ausgegegen.

**Nur eben bei eingeschaltetem HTTP-Cache nicht** , da setzt es den Error. Erst bei zusätzlichem “Enlight\_Controller\_Action\_PostDispatch” geht es dann. Ich dachte eigentlich es handele sich um dieses Problem: [Shopware Issuetracker](https://issues.shopware.com/issues/SW-20183) (Timing) und letzterer Event kommt “früh” genug? Wobei ich den Cache-On/Off Unterschied eben grundsätzlich interessant finde. Ist bei deaktiviertem Cache die Smarty-Security evtl. gar nicht aktiv?

Nebenbei bemerkt: Ist es korrket, dass die Preise im Cross-Selling-Bereich bei eingeschaltetem Cache **nicht aktualisiert** werden (ohne Plugin und mit frischer Installation, getestet)?

&nbsp;

greets,  
devnullroot

---

<div class="post-metadata">

**Author:** ![sonic](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/sonic/32/25728_2.png) [@sonic](https://forum.shopware.com/u/sonic)\
**Post date:** [21. November 2017 um 19:34 UTC](https://forum.shopware.com/t/plugin-uncaught-smartyexception-directory-not-allowed-by-security-setting/48703/5 "2017-11-21T19:34:44Z")

</div>

Da ich ja erwähnt wurde…&nbsp; ![Wink](https://europe1.discourse-cdn.com/flex013/uploads/shopware/original/1X/b3785da0cbf2c8566cb535dcf55b2730b5224899.png "Wink")  
Ich habe selber ein erhebliches Problem daran zu glauben, dass es daran liegt “wann” ein Template registriert wird. Es gibt ja auch Plugins, die ganz ohne Template auskommen. Wenn also zu spät oder gar nicht ein Template registriert wird, warum soll dann auf das Template zugegriffen werden? Hier hab ich beim “s”-Problem noch ein großes Verständnisproblem. Insbesondere dann, wenn es - wie im “großen” Thread - fast immer mit dem Cache zusammen hängt.  
Ich tippe auch eher auf einen Bug im Zusammenspiel mit HTTP-Cache + Template-Cache. Aus meiner eigenen Erfahrung tippe ich auf einen falschen Zugriff auf den Smarty-Cache. Smarty will das Plugin rendern, bekommt aber keinen Pfad, weil Event nicht gefeuert wird, und&nbsp;“sucht” selber.

Kram in der Mottenkiste:  
[https://forum.shopware.com/discussion/47521/evtl-problem-mit-freitext-seit-ca-5-2-26](https://forum.shopware.com/discussion/47521/evtl-problem-mit-freitext-seit-ca-5-2-26)  
Noch vor “security” und auf PostDispatch\_Detail (nicht secure)  
Es werden weitere TABS in den Details erzeugt.

1. Template wird NUR registriert, wenn ein Freitext eine Bedingung erfüllt
2. HTTP-Cache ist an  
Irgendwann “verschwinden” die TABS … Cache leeren … TABS wieder da  
Untersuchung: Der Event wird nicht gefeuert.  
Lösung 1: HTTP Cache aus … TABS immer da  
Lösung 2: Template immer registrieren, auch wenn es gar nicht benötigt wird … TABS auch mit HTTP-Cache immer da  
Dringender Tatverdacht:  
Ein Artikel “Ohne” TABS verbiegt so den Cache, dass beim Aufruf eines Artikels “mit TAB” der Event nicht gefeuert wird.  
Anders ist das gar nicht zu erklären

Wie eingangs geschrieben: Wenn “Plugin” ‘zu spät’ das Template registriert, was bewegt dann Smarty bei HTTP-Cache dazu, dort “zu suchen”? Für mich ein fehlerhaftes Caching, somal es bei mir ja erst grob nach 5.2.26 angefangen hat.

Auch wegen viel zu kurzer Timeouts vom HTTP-Proxy-Client&nbsp;(shared-server) und daraus resultierender UPS habe ich gar keinen Cache mehr an … UPS ? gibts nicht mehr !

---

<div class="post-metadata">

**Author:** ![Patrick\_Stahl](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/patrick_stahl/32/7679_2.png) [@Patrick\_Stahl](https://forum.shopware.com/u/Patrick_Stahl)\
**Post date:** [22. November 2017 um 09:07 UTC](https://forum.shopware.com/t/plugin-uncaught-smartyexception-directory-not-allowed-by-security-setting/48703/6 "2017-11-22T09:07:16Z")

</div>

Moin zusammen!  
Moin @devnullroot‍

Ich versuche hier mal ein bisschen Licht ins Dunkel zu bringen.  
**Vorsicht: Textwand.**

Das Verhalten tritt nur dann auf, wenn der Cache aktiviert ist und das&nbsp;Plugin-eigene Template Directory erst&nbsp;nach **bestimmten Bedingungen** &nbsp;ausgeführt wird.  
Dazu mal zwei Beispiele:

**Beispiel 1 - falsche If-Condition:**

```
public static function getSubscribedEvents()
{
    return [
        'Enlight_Controller_Action_PostDispatchSecure' => 'onPostDispatch'
    ];
}

public function onPostDispatch(\Enlight_Controller_ActionEventArgs $eventArgs)
{
    $userData = $this->container->get('modules')->Admin()->sGetUserData();
    if ($userData['name'] === 'Max Mustermann') {
        return;
    }

    $eventArgs->getSubject()->View()->addTemplateDir('Views/');
}

```

Warum ist dies nun ein Problem, und was hat das mit dem Cache zu tun?

Dies ist ein PostDispatch-Event, d.h. der Code wird für jeden Kunden in jedem Controller ausgeführt.  
Nun gehen wir das Beispiel einmal durch.  
Der Cache ist aktiv, wurde jedoch frisch geleert.  
Der Kunde John Doe surft die Home-Seite an, das Event wird getriggered und er läuft in den Code rein.  
John&nbsp;Doe heißt offensichtlich nicht “Max Mustermann”, sodass er auch nicht in den Early-Exit reinläuft und die Zeile “addTemplateDir” wird ausgeführt.  
In dem Views-Ordner des Plugins wird die Home-Seite minimal angepasst, diese angepasste Version der Home-Seite landet nun **im Cache**.  
Irgendwo im Cache findet man jetzt einen Verweis auf diese Anpassung der Home-Seite, das kann so aussehen:  
&nbsp;

```
'123456789090353523wvgsdfbvdg43g3' => 
    array (
      0 => '/meinSystem/meineShopInstallation/custom/plugins/SwagTestPlugin/Resources/views/frontend/home/index.tpl',
      1 => 1511339915,
      2 => 'snippet',
    ),

```

Jetzt betritt Max Mustermann den Shop und surft direkt die Home-Seite an.  
Was passiert nun?  
Der zuvor genannte PHP-Code verhindert im Falle von Max Mustermann, dass zuvor das Plugin-eigene Template Directory offiziell hinzugefügt wird.  
Da der Cache aktiviert ist, wird die o.g. Zeile aus dem Cache ausgeführt - er versucht die Datei&nbsp;_/meinSystem/meineShopInstallation/custom/plugins/SwagTestPlugin/Resources/views/frontend/home/index.tpl_&nbsp;zu laden.  
Und hier kommt die Smarty-Security ins Spiel.  
Das Verzeichnis&nbsp;_/meinSystem/meineShopInstallation/custom/plugins/SwagTestPlugin/Resources/views/_&nbsp;wurde Smarty nie bekannt gemacht und gilt somit als “nicht vertrauenswürdig” =\> Es knallt.

Die Meldung “Unknown service tag ‘s’” ist durchaus ein Bug, der immer dann auftritt, wenn eine Fehlermeldung ausgegeben werden soll, so wie in diesem Fall.

War dieses Beispiel soweit verständlich?  
Dies ist immer dann ein Problem, wenn das addTemplateDir nach einer Bedingung genutzt wird, die bspw. für einen Kunden zutrifft, für den anderen Kunden jedoch nicht.  
Wenn man das o.g. Beispiel von der Reihenfolge ändert, also erst kommt Max Mustermann, dann John Doe, würde es übrigens nicht knallen - da direkt die Template-Version gecached werden würde, die die Plugin-eigene Anpassung nicht beinhaltet.  
Dadurch tritt auch ein gewissen “Randomness”-Gefühl auf.

Dieses Beispiel erklärt aber noch nicht, warum das Verhalten dann auch beim Threadersteller auftritt.  
Aber auch dazu habe ich soeben ein kleines Beispiel vorbereitet.

**Beispiel 2 - addTemplateDir nur bei bestimmten Events:**

&nbsp;

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

public function onPostDispatchFrontend(\Enlight_Controller_ActionEventArgs $eventArgs)
{
    $eventArgs->getSubject()->View()->addTemplateDir('Views/');
}

```

In diesem Beispiel gibt es eigentliche keine Bedingung, warum knallt es jetzt beim Threadersteller?

Dazu folgendes Szenario, das dem Szenario des Threaderstellers zu 99% gleicht:  
Das Plugin passt in seinem eigenen Views-Ordner eine Produkt-Box an.

Erneut ist der Cache aktiviert und frisch geleert.  
Der Kunde Max Mustermann surft durch den Shop und landet in einem Kategorie-Listing.  
Beim Surfen durch das Produktlisting knallt es plötzlich, die Meldung “Unknown tag ‘s’” taucht wieder auf.

Warum knallt es jetzt, es war doch kein zweiter Kunde beteiligt, der eine Cache-Datei generiert hat.  
Der Kunde ruft das Listing auf, welches Produktboxen beinhaltet.  
Der Verweis auf die Template-Anpassung durch das Plugin landet im Cache.  
Beim Surfen durch das Kategorie-Listing&nbsp;scrollt Max Mustermann etwas herunter und löst Infinite Scrolling aus - und hier kommt der Kniff.  
Die Template-Anpassung an den Produktboxen ist durch das initiale Aufrufen des Listings bereits gecached, zusammen mit dem Verweis auf die Anpassung.  
Infinite Scrolling benötigt jene Produkt-Boxen natürlich ebenfalls, jedoch funktioniert Infinite Scrolling über einen **Widget** -Controller.  
Das Event, das das Plugin nutzt, ist jedoch lediglich für&nbsp; **Frontend** -Controller, entsprechend wird beim Infinite Scrolling nie das Template Directory des Plugins hinzugefügt.

Auch hier wird also eine Anpassung aus einem Ordner zu laden versucht, der Smarty im aktuellen Request nie bekannt gemacht wurde.

Nun hat unser Threadersteller sein Event geändert, auf “Enlight\_Controller\_Action\_PostDispatch”.  
Dieses Event wird für alle Arten von Controllers aufgerufen, **unabhängig** davon ob es ein **Frontend** - oder ein **Widget** -Controller ist.  
Ergo: Es funktioniert mit diesem Event auch mit aktiviertem Cache.

War auch dieses Beispiel verständlich?

Diese&nbsp;Probleme konnten natürlich erst mit Einschalten der Smarty Security auftreten und waren daher in vorherigen Shopware-Versionen nie ein Problem.  
Daher der allgemeine Tipp:  
Registriert eure Plugin eigene Views Ordner so früh wie möglich, also nicht erst nach bestimmten Bedingungen, und nutzt keine Events, die ja auch irgendwo direkt eine Bedingung beinhaltet, wie eben bspw. die Unterscheidung des Moduls.

Solltet ihr zwingend eine Bedingung benötigen, bevor eine Template-Anpassung greift, so registriert den Views Ordner trotzdem vor einer Bedingung und packt die Bedingung selbst dann in das jeweilige Template.  
Dadurch wird die Template-Datei&nbsp; **immer** &nbsp;geladen, die eigentliche Anpassung wird jedoch durch die Bedingung&nbsp; **innerhalb der Template-Datei** &nbsp;verhindert.

War das alles soweit verständlich?  
Bei Fragen gerne zurückschreiben, dann verlinkt mich bitte kurz, sodass ich eine Benachrichtigung bekomme.

Gruß,  
Patrick&nbsp; ![Shopware](https://europe1.discourse-cdn.com/flex013/uploads/shopware/original/1X/86c57fbace799dd4eb1f1b8a2d3bdc1733f0aea1.png "Shopware")

---

<div class="post-metadata">

**Author:** ![arnebecker](https://avatars.discourse-cdn.com/v4/letter/a/3bc359/32.png) [@arnebecker](https://forum.shopware.com/u/arnebecker)\
**Post date:** [22. November 2017 um 11:07 UTC](https://forum.shopware.com/t/plugin-uncaught-smartyexception-directory-not-allowed-by-security-setting/48703/7 "2017-11-22T11:07:14Z")

</div>

Danke [@Patrick Stahl]([http://forum.shopware.com/profile/1869/Patrick](http://forum.shopware.com/profile/1869/Patrick) Stahl „Patrick Stahl“)‍, das fand ich sehr erleuchtend! In den Fehler wäre ich bestimmt früher oder später auch mal gerannt. Wieso wird der Views Ordner im neuen Plugin System eigtl nicht automatisch registiert? Das wird schon soviel automatisch registiert. Views und Models wären auch noch nice. Was würde dagegen sprechen?&nbsp;Bei Bedarf würde ich dafür auch nen Pull Request ausarbeiten.

---

<div class="post-metadata">

**Author:** ![EikeBrandtWarneke](https://avatars.discourse-cdn.com/v4/letter/e/cdc98d/32.png) [@EikeBrandtWarneke](https://forum.shopware.com/u/EikeBrandtWarneke)\
**Post date:** [22. November 2017 um 11:30 UTC](https://forum.shopware.com/t/plugin-uncaught-smartyexception-directory-not-allowed-by-security-setting/48703/8 "2017-11-22T11:30:19Z")

</div>

\>\>&nbsp;Wieso wird der Views Ordner im neuen Plugin System eigtl nicht automatisch registiert?

Ich habe zb Plugins, die ich nur in manchen Subshops (per Plugin Konfiguration) aktiveren möchte. Da spare ich mir ganz gerne den overhead und lade die Template Ordner dort nicht. Zudem gibt es weiterhin definitiv Konstellationen, bei denen du separiert das Template Verzeichnis laden möchtest oder eben nicht. Ich finde, dass es weiterhin in der Hand des Entwicklers liegen sollte, wann und ob ein Template erweitert wird - man muss dabei halt nur ein wenig aufpassen und sich an die Richtlinien halten.

Viele Grüße

---

<div class="post-metadata">

**Author:** ![sschreier](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/sschreier/32/23296_2.png) [@sschreier](https://forum.shopware.com/u/sschreier)\
**Post date:** [22. November 2017 um 11:51 UTC](https://forum.shopware.com/t/plugin-uncaught-smartyexception-directory-not-allowed-by-security-setting/48703/9 "2017-11-22T11:51:28Z")

</div>

Hallo,

es gibt glaub genug Anwendungsfälle, wo man entweder einen View-Ordner oder einen anderen laden muss, ein automatisches registrieren wäre also fatal und würde gar keinen Sinn machen und wird Shopware hoffentlich auch nie implementieren, da es eher ein Rückschritt wäre. Solange man sich an die Regeln hält, klappt doch auch alles.

Beste Grüße

Sebastian

---

<div class="post-metadata">

**Author:** ![sonic](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/sonic/32/25728_2.png) [@sonic](https://forum.shopware.com/u/sonic)\
**Post date:** [22. November 2017 um 11:57 UTC](https://forum.shopware.com/t/plugin-uncaught-smartyexception-directory-not-allowed-by-security-setting/48703/10 "2017-11-22T11:57:05Z")

</div>

Jo, wie “leicht” es mit an den “Regeln halten” ist, haben wir ja im&nbsp;S-Thread gesehen. Wenn ich mich nicht täusche, waren da einige Plugins mit dem Kürzel “SWAG” ganz vorne mit dabei.&nbsp; ![Wink](https://europe1.discourse-cdn.com/flex013/uploads/shopware/original/1X/b3785da0cbf2c8566cb535dcf55b2730b5224899.png "Wink")&nbsp;Lustig wird es dann, wenn solche Hinweise aus der unwartbaren Spaghetti-Code-Ecke kommen.&nbsp; ![Sticking-out-tongue](https://europe1.discourse-cdn.com/flex013/uploads/shopware/original/1X/ac0c93e2160fb9e91c30767775d64444ad0f06c4.png "Sticking-out-tongue")  
Dank Patrick hat sich der Nebel schon erheblich gelichtet. Warum jetzt aber der Smarty-Cache erst zum Problem wird (bei mir) wenn der HTTP-Cache aktiviert ist, werde ich bestimmt nach mehrmaligem Lesen obiger Abhandlung verstehen. Oder einfach sagen: egal

Danke Patrick für die ausführliche Erklärung.

---

<div class="post-metadata">

**Author:** ![arnebecker](https://avatars.discourse-cdn.com/v4/letter/a/3bc359/32.png) [@arnebecker](https://forum.shopware.com/u/arnebecker)\
**Post date:** [22. November 2017 um 14:58 UTC](https://forum.shopware.com/t/plugin-uncaught-smartyexception-directory-not-allowed-by-security-setting/48703/11 "2017-11-22T14:58:54Z")

</div>

@sschreier‍: Okay. Macht bei den Views wohl Sinn. Wobei das gleiche ja für LESS und JS Erweiterungen auch gelten könnte. Die will man dann ja evtl. auch nicht haben, wenn man das Plugin für einen Subshop deaktiviert. Die werden auch, wenn sie in einem gewissen Verzeichnis liegen, automatisch registiert.&nbsp;Vielleicht wäre aber ein optionaler Schalter im InstallContext eine Möglichkeit. Somit könnte man sich ne Menge Boilerplate Code ersparen. Eine Autoregistierung für Models würde ich jedoch sehr sinnvoll finden. Könnte man ja optional im InstallContext deaktivieren oder hier auch wieder optional aktivieren. Wäre ja vermutlich ein Breaking Change.

---

<div class="post-metadata">

**Author:** ![devnullroot](https://avatars.discourse-cdn.com/v4/letter/d/3bc359/32.png) [@devnullroot](https://forum.shopware.com/u/devnullroot)\
**Post date:** [22. November 2017 um 16:30 UTC](https://forum.shopware.com/t/plugin-uncaught-smartyexception-directory-not-allowed-by-security-setting/48703/12 "2017-11-22T16:30:58Z")

</div>

Danke an [@Patrick Stahl]([http://forum.shopware.com/profile/1869/Patrick](http://forum.shopware.com/profile/1869/Patrick) Stahl „Patrick Stahl“)‍ für die ausführliche Erläuterug, das hat viel Licht ins Dunkle gebracht!

Ich frage mich jetzt allerdings was

> Registriert eure Plugin eigene Views Ordner so früh wie möglich, also nicht erst nach bestimmten Bedingungen, **und nutzt keine Events, die ja auch irgendwo direkt eine Bedingung beinhaltet, wie eben bspw. die Unterscheidung des Moduls**.

nun genau bedeutet. Für mich ist der fett gedruckte Teil leider nicht ganz eindeutig:

1. Templates nicht in einem Event für ein Modul hinzufügen
2. oder gar nicht in einem Event hinzufügen.

Ersterer Fall wäre ja eben z.B. „Enlight\_Controller\_Action\_PostDispatch“. Letzteren Fall wüßte ich momentan nicht umzusetzen, wie macht man denn die Views außerhalb von Events bekannt? Hier fehlt mir wohl das Wissen ☹

Anders ausgedrückt: Was ist denn grundsätzlich **die früheste und damit sicherste Möglichkeit** den Views-Ordner zu registrieren? Falls nicht „Enlight\_Controller\_Action\_PostDispatch“ wäre ein Code-Schnipsel natürlich toll… 😉

LG und Besten Dank,  
devnullroot

P.S.: Ich frage auch deshalb nochmal explizit nach, weil ich die Frage gerne als beantwortet markieren möchte

&nbsp;

---

<div class="post-metadata">

**Author:** ![Patrick\_Stahl](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/patrick_stahl/32/7679_2.png) [@Patrick\_Stahl](https://forum.shopware.com/u/Patrick_Stahl)\
**Post date:** [23. November 2017 um 07:05 UTC](https://forum.shopware.com/t/plugin-uncaught-smartyexception-directory-not-allowed-by-security-setting/48703/13 "2017-11-23T07:05:27Z")

</div>

Moin @devnullroot‍.

damit meinte ich in lediglich, dass keine Events zur Template Registrierung benutzt werden sollten, die eine Bedingung enthalten.  
**Enlight\_Controller\_Action\_PostDispatchSecure\_Frontend**

Hier ist bspw. das \_Frontend ja schon eine Bedingung, wie oben in meinem Beispiel erläutert.

Du könntest bspw. das folgende Event nutzen:  
**Theme\_Inheritance\_Template\_Directories\_Collected**  
sowie der dazugehörige Beispiel-Code:  
&nbsp;

```
public function onCollectTemplateDir(\Enlight_Event_EventArgs $args)
{
    $dirs = $args->getReturn();
    $dirs[] = $this->pluginDir . '/Views';

    $args->setReturn($dirs);
}

```

Gruß,  
Patrick&nbsp; ![Shopware](https://europe1.discourse-cdn.com/flex013/uploads/shopware/original/1X/86c57fbace799dd4eb1f1b8a2d3bdc1733f0aea1.png "Shopware")  
&nbsp;

---

<div class="post-metadata">

**Author:** ![mowlwurf](https://avatars.discourse-cdn.com/v4/letter/m/77aa72/32.png) [@mowlwurf](https://forum.shopware.com/u/mowlwurf)\
**Post date:** [23. November 2017 um 10:45 UTC](https://forum.shopware.com/t/plugin-uncaught-smartyexception-directory-not-allowed-by-security-setting/48703/14 "2017-11-23T10:45:44Z")

</div>

Moin Patrick,

ich habe ein ähnliches Problem wie devnullroot, mein Plugin passt die Artikelbox im Listing an, ist der Cache geleert, funktioniert alles super, bei aktualisieren der Seite wird das Template aber scheinbar nicht mehr geladen. Ist der HTTP-Cache deaktiviert funktioniert alles einwandfrei. Das Problem tritt bei mehreren Kunden mit Shopware 5.3.4 auf.

Ich habe nun wie von Dir&nbsp;[@Patrick Stahl]([http://forum.shopware.com/profile/1869/Patrick](http://forum.shopware.com/profile/1869/Patrick) Stahl „Patrick Stahl“)‍ vorgeschlagen zuerst versucht das Template Verzeichnis direkt im&nbsp; **Enlight\_Controller\_Action\_PostDispatch&nbsp;** Event (ohne jegliche Bedingungen) zu registrieren und es anschließend auch mit dem&nbsp;Event&nbsp; **Theme\_Inheritance\_Template\_Directories\_Collected&nbsp;** versucht. Aber das Problem bleibt das gleiche.

Ich habe natürlich nach dem Hinzufügen der genannten Events jeweils das Plugin neuinstalliert und den Cache komplett geleert. Aber immer das gleiche Verhalten der erste Seitenaufruf nach Cache leeren passt, der zweite und alle folgenden nicht mehr.

Wo könnte das Problem noch liegen?

Gruß

Daniel

---

<div class="post-metadata">

**Author:** ![Patrick\_Stahl](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/patrick_stahl/32/7679_2.png) [@Patrick\_Stahl](https://forum.shopware.com/u/Patrick_Stahl)\
**Post date:** [23. November 2017 um 10:56 UTC](https://forum.shopware.com/t/plugin-uncaught-smartyexception-directory-not-allowed-by-security-setting/48703/15 "2017-11-23T10:56:00Z")

</div>

Moin Daniel / @mowlwurf‍,

da kann ich mir spontan auch keinen Reim draus bilden.  
Das müsste ich mir dann schon im Detail anschauen.

Ist dies zu 100% mit deinem Plugin nachstellbar?  
Dann lass mir doch einfach ein .zip per PM zukommen, dann schaue ich mal, ob ich da etwas finde.  
Bitte natürlich auch alle benötigten Informationen hinzufügen, also bspw. sowas wie “benötigte Plugin Konfigurationen” oder sowas, um das Verhalten nachzustellen.

Gruß,  
Patrick&nbsp; ![Shopware](https://europe1.discourse-cdn.com/flex013/uploads/shopware/original/1X/86c57fbace799dd4eb1f1b8a2d3bdc1733f0aea1.png "Shopware")

---

<div class="post-metadata">

**Author:** ![devnullroot](https://avatars.discourse-cdn.com/v4/letter/d/3bc359/32.png) [@devnullroot](https://forum.shopware.com/u/devnullroot)\
**Post date:** [30. November 2017 um 10:39 UTC](https://forum.shopware.com/t/plugin-uncaught-smartyexception-directory-not-allowed-by-security-setting/48703/16 "2017-11-30T10:39:33Z")

</div>

Moin @mowlwurf‍,

hat sich bei dem Problem was ergeben? Ist es die gleiche/ähnliche Problematik, eine „erweiterete“ Version, oder etwas völlig anderes?

&nbsp;

Cheers,  
devnullroot

---

<div class="post-metadata">

**Author:** ![Patrick\_Stahl](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/patrick_stahl/32/7679_2.png) [@Patrick\_Stahl](https://forum.shopware.com/u/Patrick_Stahl)\
**Post date:** [30. November 2017 um 12:26 UTC](https://forum.shopware.com/t/plugin-uncaught-smartyexception-directory-not-allowed-by-security-setting/48703/17 "2017-11-30T12:26:53Z")

</div>

Moin @devnullroot‍,

komme momentan zeitlich leider nicht dazu mir das Verhalten von @mowlwurf‍ anzuschauen.  
Habe mir dafür jedoch einen Reminder angelegt, sodass ich mir dies definitiv nochmal anschauen werde.

Gruß,  
Patrick&nbsp; ![Shopware](https://forum.shopware.com/plugins/CKEditor/plugins/smiley/images/shopware.png "Shopware")

---

<div class="post-metadata">

**Author:** ![puhas](https://avatars.discourse-cdn.com/v4/letter/p/b38774/32.png) [@puhas](https://forum.shopware.com/u/puhas)\
**Post date:** [1. Dezember 2017 um 09:14 UTC](https://forum.shopware.com/t/plugin-uncaught-smartyexception-directory-not-allowed-by-security-setting/48703/18 "2017-12-01T09:14:20Z")

</div>

> Du könntest bspw. das folgende Event nutzen:
> 
> **Theme\_Inheritance\_Template\_Directories\_Collected**  
> sowie der dazugehörige Beispiel-Code:  
> &nbsp;
> 
> public function onCollectTemplateDir(\Enlight\_Event\_EventArgs $args)  
> {  
> $dirs = $args-\>getReturn();  
> $dirs = $this-\>pluginDir . ‚/Views‘;
> 
> $args-\>setReturn($dirs);  
> }

Hallo [@Patrick Stahl]([http://forum.shopware.com/profile/1869/Patrick](http://forum.shopware.com/profile/1869/Patrick) Stahl „Patrick Stahl“)‍,

kann man zu diesem Zeitpunkt auch schon ein Smarty-Plugin einbinden? Falls ja, wie müsste das aussehen?

---

<div class="post-metadata">

**Author:** ![debianer](https://avatars.discourse-cdn.com/v4/letter/d/f1d935/32.png) [@debianer](https://forum.shopware.com/u/debianer)\
**Post date:** [4. Dezember 2017 um 12:56 UTC](https://forum.shopware.com/t/plugin-uncaught-smartyexception-directory-not-allowed-by-security-setting/48703/19 "2017-12-04T12:56:08Z")

</div>

Moin,

ich hatte das Problem bei Infinite Scrolling im Listing bei erweiterung der \frontend\listing\product-box\box-basic.tpl. Alle Lösungen die hier vorgeschlagen wurden haben in meinen Fall nicht funktioniert. Der Hinweis das es sich um **Widget** -Controller handelt brachte mich aber zur Lösung. Es funktioniert aber nur als&nbsp;PreDispatch! **‚Enlight\_Controller\_Action\_PreDispatch\_Widgets\_Listing‘.**

```
public static function getSubscribedEvents()
{
    return [
        'Enlight_Controller_Dispatcher_ControllerPath_Widgets_XXXXXXX' => 'registerController',
        'Enlight_Controller_Action_PostDispatchSecure_Frontend_Listing' => 'onPostDispatchFrontendListing',
        'Enlight_Controller_Action_PreDispatch_Widgets_Listing' => 'onDispatchWidgetListing',
    ];
}

public function registerController(\Enlight_Event_EventArgs $args)
{
    $this->container->get('template')->addTemplateDir($this->getPath() . '/Resources/Views/');
    return $this->getPath() . '/Controllers/Widgets/XXXXXXX.php';
}

public function onPreDispatchWidgetListing($args)
{
    $subject = $args->get('subject');
    $view = $subject->View();
    $view->addTemplateDir($this->getPath() . '/Resources/Views/');
}

public function onPostDispatchFrontendListing($args)
{
    $subject = $args->get('subject');
    $view = $subject->View();
    $view->addTemplateDir($this->getPath() . '/Resources/Views/');
}

```

Gruß,  
Debianer

---

<div class="post-metadata">

**Author:** ![Patrick\_Stahl](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/patrick_stahl/32/7679_2.png) [@Patrick\_Stahl](https://forum.shopware.com/u/Patrick_Stahl)\
**Post date:** [4. Dezember 2017 um 13:15 UTC](https://forum.shopware.com/t/plugin-uncaught-smartyexception-directory-not-allowed-by-security-setting/48703/20 "2017-12-04T13:15:40Z")

</div>

Moin @debianer‍,

das liegt daran, dass in der Action in dem Widgets-Controller das [Template direkt geladen wird](https://github.com/shopware/shopware/blob/5.3/engine/Shopware/Controllers/Widgets/Listing.php#L540).

Entsprechend hast du im PostDispatch, also&nbsp; **nach** &nbsp;Ausführung der originalen Action, keine Möglichkeit mehr in das Template einzugreifen.  
Hat aber nichts mit dem eigentlichen Fehler dieses Threads zu tun. ![Smile](https://europe1.discourse-cdn.com/flex013/uploads/shopware/original/1X/bac5f5766b6a20565a8fb995345b4e41d24daac0.png "Smile")

Gruß,  
Patrick&nbsp; ![Shopware](https://europe1.discourse-cdn.com/flex013/uploads/shopware/original/1X/86c57fbace799dd4eb1f1b8a2d3bdc1733f0aea1.png "Shopware")

[Nächste Seite](https://forum.shopware.com/t/plugin-uncaught-smartyexception-directory-not-allowed-by-security-setting/48703.md?page=2)
