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, ich weiß es aber ehrlich gesagt nicht. Oder ich seh den Wald vor lauter Bäumen nicht
Beste Grüße und Dank,
devnullroot