Прикручиваем 3 Smarty к LS. Продолжение.
Оригинальная статья, которая подтолкнула меня к этому топику: Прикручиваем 3 Smarty к LS
Так как не только у меня возникли проблемы даже после проделывания всех инструкций, я решил исследовать проблему. И похоже у меня получилось решить ее. Так как комментарий получился бы большой, то я решил вынести это в отдельный топик.
И так начнем сначала:
1 шаг (из статьи)
Вся загвоздка заключается в том, что в версии 3 эту функцию переименовали, поэтому нам надо изменить код следующим образом:
Строки
вставляем как и описано в статье, в них проблем нет.
2 шаг (из статьи)
По большому счету проблем особых не вызывает за исключением множества Notice-ов по всему сайту и прочих ошибок.
Но в итоге я оставил как есть ниже объясню почему (возможно вы уже сейчас догадаетесь:))
3 шаг (из статьи)
Автор прав в 3 версии смарти появились новые более жесткие требования к шаблонам. И ошибок много, поэтому я исправил полностью стандартный шаблон new и впринципе убрал все возникающие и возможные ошибки (ну может пропустил пару-тройку :)). Поэтому пункт 2 стал неактуальным.
Итак, а теперь ошибки...
Первая из них, на которой я сразу запнулся:
Проблема у меня решилась пунктом 1, то есть исправлением функции TemplateExists($sTemplate) «вьювера».
Кстати, пока исправлял шаблон наткнулся на еще один вызод метода smarty — templateExists в файле /engine/modules/viewer/plugs/insert.block.php строчку:
нужно будет заменить на:
ну и в том же файле в будущем надо будет изменить устаревшую функцию trigger_error (но сейчас это не важно, хотя будет важно, если будут ошибки через нее выводиться, потому что ничего хорошего не выйдет)
Далее...
После исправлений появляется другая ошибка:
В комментарии к топику почти нашли причину…
Так почему же он (автолоад) не срабатывает? Нет, на самом деле он срабатывает, но только один раз, а дальше… работу перехватывает движок! В движке для этой цели написана реализация «магической» функции __autoload в файле /engine/classes/Engine.class.php в самом конце файла. Так как движок не знает откуда загружать библиотеки Smarty, он и не может.
Мой вариант решения:
1) Для версии 0.4.2
после последнего оператора:
добавить строку:
1) Для транковой версии (так как, она стоит у меня на локалхосте, то решения я нашел под ней)
перед закомментированной строкой:
добавить строку: smartyAutoload($sClassName);
чтобы конец функции получился следующий:
Теперь все должно работать, остается только исправить общий шаблон и шаблоны плагинов.
Мой вариант исправленного шаблона new: Скачать
UPD: Надеюсь, что перенес правильно: в нужный блог
Так как не только у меня возникли проблемы даже после проделывания всех инструкций, я решил исследовать проблему. И похоже у меня получилось решить ее. Так как комментарий получился бы большой, то я решил вынести это в отдельный топик.
И так начнем сначала:
1 шаг (из статьи)
Не заработал метод Viewer -> TemplateExists()Идем в файл /engine/modules/viewer/Viewer.class.php и находим там следующий код:
public function TemplateExists($sTemplate) {
return $this->oSmarty->template_exists($sTemplate);
}
Вся загвоздка заключается в том, что в версии 3 эту функцию переименовали, поэтому нам надо изменить код следующим образом:
public function TemplateExists($sTemplate) {
return $this->oSmarty->templateExists($sTemplate);
}
Строки
$this->oSmarty->loadPlugin('smarty_modifier_escape');
if('rss'== Router::GetAction()){
$this->oSmarty->loadPlugin('smarty_modifier_replace');
}
вставляем как и описано в статье, в них проблем нет.
2 шаг (из статьи)
По большому счету проблем особых не вызывает за исключением множества Notice-ов по всему сайту и прочих ошибок.
Но в итоге я оставил как есть ниже объясню почему (возможно вы уже сейчас догадаетесь:))
3 шаг (из статьи)
Автор прав в 3 версии смарти появились новые более жесткие требования к шаблонам. И ошибок много, поэтому я исправил полностью стандартный шаблон new и впринципе убрал все возникающие и возможные ошибки (ну может пропустил пару-тройку :)). Поэтому пункт 2 стал неактуальным.
Итак, а теперь ошибки...
Первая из них, на которой я сразу запнулся:
Fatal error: Class 'Smarty_Internal_Wrapper' not found in Smarty.class.php on line 763
Проблема у меня решилась пунктом 1, то есть исправлением функции TemplateExists($sTemplate) «вьювера».
Кстати, пока исправлял шаблон наткнулся на еще один вызод метода smarty — templateExists в файле /engine/modules/viewer/plugs/insert.block.php строчку:
if (!isset($aParams['block']) or !$oSmarty->template_exists($sBlockTemplate)) {
нужно будет заменить на:
if (!isset($aParams['block']) or !$oSmarty->templateExists($sBlockTemplate)) {
ну и в том же файле в будущем надо будет изменить устаревшую функцию trigger_error (но сейчас это не важно, хотя будет важно, если будут ошибки через нее выводиться, потому что ничего хорошего не выйдет)
Далее...
После исправлений появляется другая ошибка:
Fatal error: Class 'Smarty_Internal_Template' not found in /engine/lib/external/Smarty-3.0.7/libs/Smarty.class.php on line 480
В комментарии к топику почти нашли причину…
Так почему же он (автолоад) не срабатывает? Нет, на самом деле он срабатывает, но только один раз, а дальше… работу перехватывает движок! В движке для этой цели написана реализация «магической» функции __autoload в файле /engine/classes/Engine.class.php в самом конце файла. Так как движок не знает откуда загружать библиотеки Smarty, он и не может.
Мой вариант решения:
1) Для версии 0.4.2
после последнего оператора:
/**
* Загрузка класса экшена плагина
*/
if (preg_match("/^Plugin(\w+)\_Action(\w+)$/i",$sClassName,$aMatch)) {
$sFileClass=Config::get('path.root.server').'/plugins/'.strtolower($aMatch[1]).'/classes/actions/Action'.$aMatch[2].'.class.php';
if (file_exists($sFileClass)) {
require_once($sFileClass);
}
}
добавить строку:
if (!isset($sFileClass)) smartyAutoload($sClassName);
1) Для транковой версии (так как, она стоит у меня на локалхосте, то решения я нашел под ней)
перед закомментированной строкой:
//throw new Exception("(autoload '$sClassName') Can not load CLASS-file");
добавить строку: smartyAutoload($sClassName);
чтобы конец функции получился следующий:
}elseif(!class_exists($sClassName)){
dump("(autoload $sClassName) Can not load CLASS-file");
dump($aInfo);
smartyAutoload($sClassName);
//throw new Exception("(autoload '$sClassName') Can not load CLASS-file");
}
Теперь все должно работать, остается только исправить общий шаблон и шаблоны плагинов.
Мой вариант исправленного шаблона new: Скачать
UPD: Надеюсь, что перенес правильно: в нужный блог
5 комментариев
За продолжение спасибо.
Можно скачать по той же ссылке.
Адаптация шаблона — trac.lsdev.ru/livestreet/changeset/1128
Изменение автозагрузки в ядре — trac.lsdev.ru/livestreet/changeset/1126