Die Smarty! Шаблонизатор Twig

Die Smarty! Шаблонизатор TwigМое рвение оптимизировать все и вся не оставляет меня в покое. Я очень долго тестировал производительность VDS против производительности облака, я очень долго подбирал софт и выбирал ОС для серверной части. Все это пытался настроить так, чтобы производительность была на высоте, и, на этой стороне я, кажется, достиг цели. Далее у меня шел сам LiveStreet. Я хотел не только ускорить его работу, но и расширить функционал. И первым делом решил взяться за шаблонизатор, т.к. Smarty не устраивал меня своей скоростью.
Читать дальше →

Frames в шаблоне.

Всю голову себе сломал, не понимаю как нормально вставить в шаблон. Фреймы.
Нужно вставить в шаблон верхний фрейм, неизменный, для того чтобы туда можно было, например, плеер поставить или флэш ролик.
Но т.к. со смарти я столкнулся впервые, то не понимаю как это сделать с tpl файлами.
Причём, фрейм этот должен появляться, только при активации определённого плагина.
Т.е. я, думаю что нужно сделать что-то вроде этого, в header.tpl:

    <html>
       <head>
       ...
       </head>
        <body>
        {hook run='body_begin'}
        <frameset rows="150,*" cols="*">
        {hook run='topframe_begin'} (в плагине например: <frame id="myFrame" name="topFrame" src="player.html">)
        <frame name="mainFrame" src="тут новый шаблон с остатками от header.tpl">
        ...
        footer.tpl — </frameset>


Дак вот, что нужно писать в src="..." какой-то файл php, который подключает в себя tpl. Да и вообще будет ли это убожество работать в смарти?

Спасибо.

Разделение ошибок Message_AddError в шаблоне Smarty

Сейчас сообщения об ошибки выводятся все вместе в одном массиве, как сделать что бы можно было их разделит, что бы идентификатором выступило поле msg, то есть если msq=='223311' то в нужном мести в шаблоне Smarty выводим титле равный этому ID 223311

/**
	 * Добавляет новое сообщение об ошибке
	 *
	 * @param string $sMsg
	 * @param string $sTitle
	 * @param bool   $bUseSession
	 */
	public function AddError($sMsg,$sTitle=null,$bUseSession=false) {
		if(!$bUseSession) {			
			$this->aMsgError[]=array('msg'=>$sMsg,'title'=>$sTitle);
		} else {
			$this->aMsgErrorSession[]=array('msg'=>$sMsg,'title'=>$sTitle);
		}
	}

Smarty truncate и кодировка

Решил как-то видеоизменить вид последних комментариев, надо было вывести небольшой кусок текста комментария, и воспользовался функцией truncate у Smarty. Столкнулся с проблемой кодировки:



В чем может быть дело?

Обновление шаблонизатора Smarty до версии 3.0.7

В SVN версии LS произошло обновление шаблонизатора Smarty, теперь используется последняя 3.0.7 версия, написанная на PHP 5.2.
Обновление в ядре прошло гладко, единственное пришлось внести изменения в стандартный класс Smarty — trac.lsdev.ru/livestreet/changeset/1129, это позволит делигировать шаблоны плагинами.

Теперь самое важное — для работы текущих шаблонов на новой версии шаблонизатора необходимо внести в них некоторые изменения. А именно:
  • везде, где используется
    {include file='file_name.tpl'}
    имя файла нужно брать в кавычках, по сути это относится к любым параметрам
  • не использовать апострофы `, т.е. было
    {include file='paging.tpl' aPaging=`$aPaging`}
    стало
    {include file='paging.tpl' aPaging=$aPaging}
    для математических выражений
    {section name=closelist1  loop=`$nesting-$cmtlevel+1`}
    меняем их на скобки
    {section name=closelist1  loop=($nesting-$cmtlevel+1)}
  • после открывающей фигурной скобки { и перед закрывающей } не должно быть пробельных символов, иначе они не считаются за конструкции Smarty
  • в условиях логические операторы необходимо отделять пробелами, было
    {if $aParams[0]=='favourites'and$aParams[1]!='comments'}
    стало
    {if $aParams[0]=='favourites' and $aParams[1]!='comments'}
Эти правила должны помочь достаточно легко адаптировать ваши шаблоны под текущую(а в последствии и новую версию) SVN версию LS.
Пример адаптации шаблона «new» — trac.lsdev.ru/livestreet/changeset/1128

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

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

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

Читать дальше →

История про нагрузку и как я с ней боролся.

Случилось так, что на одном из проектов full time стал переваливать за 1,5 сек и при этом сжирался весь проц. При этом все остальные показали были в норме: база — 0,002 сек, кеш — 0,01 сек.

Пришлось прикручивать профайлер и смотреть, в чем дело.

Виноват оказался Smarty, который из 1,5 секунд работал 1,2 (шаблон, на проекте, используется стандартный с легкими изменениями).

Копаясь дальше нашел самый сложный шаблон comments_tree.tpl, который выполняет в цикле инклюд шаблона comment.tpl.

Проблема решилась отказом от инклюда и переносом содержимого из comment.tpl в comments_tree.tpl.

full time на топиках с 400+ комментариев не превышает 0,4 сек.

Надеюсь кому-то поможет.

Как вывести номера всех страниц в paginator’е?

Сколько ни искал, ответа найти не смог.

Мне нужно вывести ссылки на все страницы блогов, то есть: /blog/page1/, /blog/page2/ и пр.

После изучения файла paginator.tpl, обнаружилось следующее:
  • $aPaging.aPagesLeft — массив с номерами страниц, предшествующими текущей
  • $aPaging.aPagesRight — страницы после текущей
  • $aPaging.iCountPage — номер последней страницы
Номер последней страницы мне бы подошёл (я бы мог в цикле перечислить все от 1 до последней), но проблема в том, что в LS-овской версии Smarty нет ни оператора for, ни while, поэтому я не понимаю, как вывести ссылки на все страницы.

UPD
Решение от x3r0x:
{section name=page_number loop=$aPaging.iCountPage}
        {$smarty.section.page_number.index+1}
{/section}