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 ответов

  • 1
    Eugen Nichikov 13 ноября 2014 07:21 #
    Если таким образом вызывать экшн, нужно явно указывать полный путь к шаблону.
    Вот так, например
    https://github.com/ZloyTip/smartfilters/blob/master/lib/actions/shopSmartfiltersPluginShow.action.php
    • 0
      Alexandr Belik Alexandr Belik 13 ноября 2014 07:34 #
      указал таким образом:
      $action = new siteArtikulPluginFrontendAction();
      $action->setTemplate('localhost/wa/wa-apps/site/plugins/artikul/templates/actions/frontend/Frontend.html');

      ошибка не ушла
      • +1
        Eugen Nichikov Eugen Nichikov 13 ноября 2014 09:11 #
        1. Путь неправильный.
        2. Зачем его задавать "извне"?

        Посмотрите внимательнее пример. Там генерируется абсолютный путь к файлу шаблона.
        $template_dir = dirname(__FILE__).'/../../templates/actions/show/';
        У Вас должно быть тоже самое с поправкой на путь относительно директории, где лежит экшн.
        • 0
          Alexandr Belik Alexandr Belik 14 ноября 2014 02:58 #
          Задал путь к шаблону внутри экшена, не помогло(
          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
    Alexandr Belik 14 ноября 2014 03:12 #
    Получилось!
    Надо было взять путь к экшену другим методом, а именно:
    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')
    ;
    }
    }
  • 1
    Alexandr Belik 14 ноября 2014 03:17 #
    Eugen Nichikov, спасибо за помощь!)
  • 1
    Genasyst 22 марта 2017 16:17 #

    для этого достаточно переписать метод в самом экшене

        public function getPluginRoot()
        {
            return realpath(dirname(__FILE__).'/../../').DIRECTORY_SEPARATOR;
        }
    

    или создать свою прослойку в папке classes от которой наследовать все экшены:

    abstract class shopFeedbackPluginFrontendAction extends waViewAction
    {
        public function getPluginRoot()
        {
            return realpath(dirname(__FILE__).'/../../').DIRECTORY_SEPARATOR;
        }
    }

Добавить ответ

Чтобы добавить комментарий, зарегистрируйтесь или войдите