Прикручиваем 3 Smarty к LS. Продолжение.

Оригинальная статья, которая подтолкнула меня к этому топику: Прикручиваем 3 Smarty к LS

Так как не только у меня возникли проблемы даже после проделывания всех инструкций, я решил исследовать проблему. И похоже у меня получилось решить ее. Так как комментарий получился бы большой, то я решил вынести это в отдельный топик.

И так начнем сначала:
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 комментариев

avatar
пора это в транк!
avatar
У меня почему-то не заработало после переименования. Потому придумывал костыль.
За продолжение спасибо.
  • Lurk
  • 0
avatar
Спасибо!
avatar
Обновил шаблон, убрал несколько найденных ошибок и удалил папки .svn
Можно скачать по той же ссылке.
avatar
Обновление смарти — trac.lsdev.ru/livestreet/changeset/1127
Адаптация шаблона — trac.lsdev.ru/livestreet/changeset/1128
Изменение автозагрузки в ядре — trac.lsdev.ru/livestreet/changeset/1126
  • ort
  • 0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.