Smarty не открывает шаблон
Пишу плагин для приложения Site.
В нём вызываю экшн, для которого создан соответствующий шаблон. В результате ошибка:
exception 'SmartyException' with message 'Unable to load template file 'plugins/artikul/templates/actions/frontend/Frontend.html'' in /var/www/html/wa/wa-system/vendors/smarty3/sysplugins/smarty_internal_templatebase.php:127
Stack trace:
#0 /var/www/html/wa/wa-system/view/waSmarty3View.class.php(116): Smarty_Internal_TemplateBase->fetch('plugins/artikul...', NULL)
#1 /var/www/html/wa/wa-system/controller/waViewAction.class.php(160): waSmarty3View->fetch('plugins/artikul...', NULL)
#2 /var/www/html/wa/wa-apps/site/plugins/artikul/lib/siteArtikul.plugin.php(9): waViewAction->display(false)
#3 /var/www/html/wa/wa-cache/apps/site/templates/compiled/site_ru_RU/3f/6d/a4/3f6da40ae2a27962b0b0e24d709b85d4b7014cab.file.my.profile.html.php(224): siteArtikulPlugin::frontendMy()
#4 /var/www/html/wa/wa-system/vendors/smarty3/sysplugins/smarty_internal_templatebase.php(180): content_5461ca4aac4291_91821569(Object(Smarty_Internal_Template))
#5 /var/www/html/wa/wa-system/view/waSmarty3View.class.php(116): Smarty_Internal_TemplateBase->fetch('file:my.profile...', NULL)
#6 /var/www/html/wa/wa-system/controller/waViewAction.class.php(160): waSmarty3View->fetch('file:my.profile...', NULL)
#7 /var/www/html/wa/wa-system/controller/waViewController.class.php(86): waViewAction->display()
#8 /var/www/html/wa/wa-system/controller/waDefaultViewController.class.php(44): waViewController->executeAction(Object(siteFrontendMyAction))
#9 /var/www/html/wa/wa-system/controller/waController.class.php(21): waDefaultViewController->execute()
#10 /var/www/html/wa/wa-system/controller/waViewController.class.php(46): waController->run(NULL)
#11 /var/www/html/wa/wa-system/controller/waFrontController.class.php(142): waViewController->run()
#12 /var/www/html/wa/wa-system/controller/waFrontController.class.php(61): waFrontController->execute('', 'frontend', 'my')
#13 /var/www/html/wa/wa-system/waSystem.class.php(518): waFrontController->dispatch()
#14 /var/www/html/wa/index.php(7): waSystem->dispatch()
#15 {main}
Вызываемая функция плагина:
public static function frontendMy() {
$view = wa()->getView();
$action = new siteArtikulPluginFrontendAction();
$html = $action->display(false);
return $html;
}
Экшена:
class siteArtikulPluginFrontendAction extends waViewAction
{
public function execute()
{
wa()->getResponse()
->addJs('wa-apps/site/plugins/artikul/js/jquery-1.11.1.min.js');
}
}
Файл plugins/artikul/templates/actions/frontend/Frontend.html существует, доступ разрешен. При вызове в экшене $this->getTemplate() виден.
Плагин в приложении включен, 'frontend' => true тоже есть.
Уже отчаялся, что может быть не так, кто сталкивался, может?
7 ответов
Вот так, например
https://github.com/ZloyTip/smartfilters/blob/master/lib/actions/shopSmartfiltersPluginShow.action.php
$action = new siteArtikulPluginFrontendAction();
$action->setTemplate('localhost/wa/wa-apps/site/plugins/artikul/templates/actions/frontend/Frontend.html');
ошибка не ушла
2. Зачем его задавать "извне"?
Посмотрите внимательнее пример. Там генерируется абсолютный путь к файлу шаблона.
$template_dir = dirname(__FILE__).'/../../templates/actions/show/';
У Вас должно быть тоже самое с поправкой на путь относительно директории, где лежит экшн.
class siteArtikulPluginFrontendAction extends waViewAction
{
public function execute()
{
$this->setTemplate($this->getPluginRoot().'templates/actions/frontend/Frontend.html');
wa()->getResponse()
->addJs('wa-apps/site/plugins/artikul/js/jquery-1.11.1.min.js');
}
}
Надо было взять путь к экшену другим методом, а именно:
1) взять конфиг нужного приложения
2) из конфига взять папку нужного плагина
. Работающий код:
class siteArtikulPluginFrontendAction extends waViewAction
{
public function execute()
{
$app_config = wa()->getConfig()->getAppConfig('site');
$pluginPath = $app_config->getPluginPath('artikul');
$this->setTemplate($pluginPath.'/templates/actions/frontend/Frontend.html');
wa()->getResponse()
->addJs('wa-apps/site/plugins/artikul/js/jquery-1.11.1.min.js')
;
}
}
для этого достаточно переписать метод в самом экшене
или создать свою прослойку в папке classes от которой наследовать все экшены: