Не находятся шаблоны при делегировании action-а плугином
2
Девелоперская версия 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
для определения пути к шаблонам используется self::$sActionClass который не изменяется при делегировании и соответственно движок ищет шаблоны в папке оринигального action-а, а не плугина.
Вот это грязный хак решает проблему
Пытался написать плугин — задействовал механизм делегирования. Делегировал 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;
- +1
- 17 февраля 2010, 16:51
- mutabor
Зачем же так грубо? Избавляемся от «грязных хаков» и делаем все по-человечески:
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');
}
Я предполагаю, что движок сам должен понимать откуда брать шаблоны, а вы предлагаете в каждом плугине индивидуально пути прописывать. Мой способ заставляет работать делегирование плугинов именно как и заявлено т.е. если экшн делегирован плугину то и шаблоны искать именно в папках плугина. По моему вполне логично.
Нет, наши предположения в другом месте расходятся. Я тоже предполагаю, что движок должен делать все максимально оптимальным и эффективным способом, требующим от сторонних разработчиков минимальных телодвижений.
Но так происходит не всегда. И если мои предположения расходятся с реальностью, то я стараюсь решить проблему с минимальным вмешательством в ядро движка — то, что выше было названо (и вполне справедливо) «грязным хаком». На мой взгляд, это порочная практика, и может вызвать проблемы при последующих апдейтах движка.
Да, предложенное мной решение требует чуть бОльшего нажатия на клавиши, но зато проблем не вызовет никаких проблем при апдейтах. Да и сама суть плагинов как раз и заключается в том, чтобы максимально «отвязать» их от ядра. А ваше решение «привязывает» плагин к конкретной модификации ядра.
ЗЫ Хотя ход Ваших мыслей мне понятен и я бы посоветовал разработчикам прислушаться к ним.
Но так происходит не всегда. И если мои предположения расходятся с реальностью, то я стараюсь решить проблему с минимальным вмешательством в ядро движка — то, что выше было названо (и вполне справедливо) «грязным хаком». На мой взгляд, это порочная практика, и может вызвать проблемы при последующих апдейтах движка.
Да, предложенное мной решение требует чуть бОльшего нажатия на клавиши, но зато проблем не вызовет никаких проблем при апдейтах. Да и сама суть плагинов как раз и заключается в том, чтобы максимально «отвязать» их от ядра. А ваше решение «привязывает» плагин к конкретной модификации ядра.
ЗЫ Хотя ход Ваших мыслей мне понятен и я бы посоветовал разработчикам прислушаться к ним.
Полностью согласен.
Почему я посчитал более правильным именно внести это в движок так только потому, что это девелоперская ветка и вполне возможно, что это просто недоработка. Тем более, что везде кроме этого куска кода используется именно self::$sActionClass.
Если разработчики до релиза не посчитают нужным это пофиксить — ну значит так тому и быть — будем все это переносить в плугины :)
Почему я посчитал более правильным именно внести это в движок так только потому, что это девелоперская ветка и вполне возможно, что это просто недоработка. Тем более, что везде кроме этого куска кода используется именно self::$sActionClass.
Если разработчики до релиза не посчитают нужным это пофиксить — ну значит так тому и быть — будем все это переносить в плугины :)
Комментарии (4)
RSS свернуть / развернуть