Не находятся шаблоны при делегировании action-а плугином

Девелоперская версия 0.4
Пытался написать плугин — задействовал механизм делегирования. Делегировал action.
При вызове action-а движок не может найти шаблоны.

Fatal error: Uncaught exception 'Exception' with message 'Can not find the template: ' in E:\Projects\livestreet\engine\modules\viewer\Viewer.class.php:292

Проблема найдена в классе Router.class.php


/**
 * Определяем наличие делегата экшена
 */
$sActionClass=$this->Plugin_GetDelegate('action',$sActionClass);


для определения пути к шаблонам используется self::$sActionClass который не изменяется при делегировании и соответственно движок ищет шаблоны в папке оринигального action-а, а не плугина.
Вот это грязный хак решает проблему


/**
 * Определяем наличие делегата экшена
 */
$sActionClass=$this->Plugin_GetDelegate('action',$sActionClass);
self::$sActionClass = $sActionClass; 

4 комментария

avatar
Зачем же так грубо? Избавляемся от «грязных хаков» и делаем все по-человечески:

class PluginMyplugin_ActionMyaction extends Action {

    // Получение полного пути шаблона
    protected function GetTemplateActionPath($sTemplate) {
        return Plugin::GetTemplatePath('myplugin/actions/ActionMyaction/'.$sTemplate.'.tpl';
    }
    
    // Назначаем шаблон текущему экшену
    protected function SetTemplateAction($sTemplate) {
        $this->SetTemplate($this->GetTemplateActionPath($sTemplate));
    }

    // Отрабатываем ивент
    protected function EventIndex() {
        // бла-бла-бла тут отрабатывается ивент
        ...
        // И назначаем этму ивенту шаблон
        $this->SetTemplateAction('index');
    }
avatar
Я предполагаю, что движок сам должен понимать откуда брать шаблоны, а вы предлагаете в каждом плугине индивидуально пути прописывать. Мой способ заставляет работать делегирование плугинов именно как и заявлено т.е. если экшн делегирован плугину то и шаблоны искать именно в папках плугина. По моему вполне логично.
avatar
Нет, наши предположения в другом месте расходятся. Я тоже предполагаю, что движок должен делать все максимально оптимальным и эффективным способом, требующим от сторонних разработчиков минимальных телодвижений.

Но так происходит не всегда. И если мои предположения расходятся с реальностью, то я стараюсь решить проблему с минимальным вмешательством в ядро движка — то, что выше было названо (и вполне справедливо) «грязным хаком». На мой взгляд, это порочная практика, и может вызвать проблемы при последующих апдейтах движка.

Да, предложенное мной решение требует чуть бОльшего нажатия на клавиши, но зато проблем не вызовет никаких проблем при апдейтах. Да и сама суть плагинов как раз и заключается в том, чтобы максимально «отвязать» их от ядра. А ваше решение «привязывает» плагин к конкретной модификации ядра.

ЗЫ Хотя ход Ваших мыслей мне понятен и я бы посоветовал разработчикам прислушаться к ним.
avatar
Полностью согласен.

Почему я посчитал более правильным именно внести это в движок так только потому, что это девелоперская ветка и вполне возможно, что это просто недоработка. Тем более, что везде кроме этого куска кода используется именно self::$sActionClass.

Если разработчики до релиза не посчитают нужным это пофиксить — ну значит так тому и быть — будем все это переносить в плугины :)
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.