Все ленты — последние статьи

Smarty конспект

В smarty предусмотрено комментирование кода?

{* комментарий *}



Как экранировать код в котором встречаются {}

{ldelim} = {, {rdelim} = } либо
{literal}{/literal}



Как посчитать количество элементов в массиве

{$group.items|@count}



Как создать внутреннюю переменную smarty

{assign var=tmp_var value="string value"}



Значение переменной по-умолчанию

{$my_var|default:"Default value"}



Как сделать чтобы смарти вычислил значение переменной при присвоении

{include file="`$evaluable_variable`/shell_header.inc"}
{include file="$cpp/shell_header.inc"}
 
{include file="$template/index.tpl"}
так не сработает — {include file="$prefixindex.tpl"}
{$include file=$prefix|concat:"index.tpl"}



Полезные строковые модификаторы

{$cart_content[index].cost|replace:'&':'&'}
{$mystring|substr:5:10}
{$mystring|substr:5}



Экранирование

{$articleTitle|escape}
{$articleTitle|escape:'html'}    {* экранирует  & " ' < > *}
{$articleTitle|escape:'htmlall'} {* экранирует ВСЕ HTML-сущности *}
{$articleTitle|escape:'url'}
{$articleTitle|escape:'quotes'}



Текущая дата

{$smarty.now|date_format:"%d.%m.%Y %H:%M"}



Как организовать цикл for

for($i=1;$i<10;$i++)
 
{section name=foo loop=9}
    {$smarty.section.foo.iteration}
{/section}



Как в цикле foreach определить первый и последний элемент

{foreach name=foo from=$array}
{if $smarty.foreach.foo.first} этот первый {/if}
 
{$smarty.foreach.foo|@debug_print_var}
 
{if $smarty.foreach.foo.last}  этот последний {/if}
{/foreach}



Использование условий if

{if isset($name) && NOT empty($name)}

{elseif $name == $foo}

{/if}
 
{if is_array($foo) && count($foo) > 0)
    {* do a foreach loop *}
{/if}



Передача параметров вызываемому шаблону

{include file='navigator.tpl' params=$params}
В шаблоне navigator.tpl будет доступна переменная $params с переданным значением.



Включение шаблона можно перенаправить в переменную

{include file='partials/nav.tpl' params=$params assign=nav} {$nav}.



Управление кэшированием вложеных шаблонов.

Не кэшировать шаблон

{include 'sub_template.tpl' nocache}



Кэшировать на 500 секунд

{include 'sub_template.tpl' cache_lifetime=500}



Принудительное кэширование

{include 'sub_template.tpl' caching}
{include 'sub_template.tpl' caching cache_id="individualCacheID"}




Использование захватов (capture)

{capture name=capMe}
<span>I am html</span>
{/capture}
 
{if $some_expression_is_true}<div>{$smarty.capture.capMe}</div>{else}<p>{$smarty.capture.capMe}</p>{/if}



Смарти умеет вычислять!

{math equation="(( x + y ) / z )" x=2 y=10 z=2}
{math equation="x + y" x=4.4444 y=5.0000 format="%.2f"}
{math equation="height * width / division"
      height=$row_height
      width=$row_width
      division=$div}



Обратите внимание, результат можно отформатировать с помощью printf-like шаблонов.

Также для форматирования в smarty есть отдельный модификатор

{$number|string_format:"%.2f"}
{$number|string_format:"%d"}



Вообще с помощью math можно юзать основные нативные вычисляющие функции php.

 
+, -, /, *, abs, ceil, cos, exp, floor, log, log10, max, min, pi, pow, rand, round, sin, sqrt, srans и tan
 



Случайное число (random)

 
{math equation='rand(10,100)'}
 



Дополнительные вспомогательные операции

%   mod   $a mod $b   modulus   %
is [not] div by       $a is not div by 4  divisible by  $a % $b == 0
is [not] even       $a is not even  [not] an even number (unary)  $a % 2 == 0
is [not] even by      $a is not even by $b  grouping level [not] even   ($a / $b) % 2 == 0
is [not] odd      $a is not odd   [not] an odd number (unary)   $a % 2 != 0
is [not] odd by       $a is not odd by $b   [not] an odd grouping   ($a / $b) % 2 != 0
 
#модуль, определение четности, нечетности, кратности



Переменные смарти

{$smarty.server.SERVER_NAME}
{$smarty.template} текущий шаблон
{$smarty.server.SCRIPT_NAME} путь до скрипта (относительно server_root)
{$smarty.get.page} — REQUEST_URI



То есть из smarty мы можем обратиться к массиву $_SERVER и $_GET.
Например, определим, находимся ли мы сейчас на главной странице

{if $smarty.server.REQUEST_URI == "/"}кажется это главная{/if}



Отладка в smarty

Значение переменной

{$foo|@debug_print_var}



Консоль отладки, показывает все переданные данные скриптом в smarty



Объекты (классы) в smarty

 
// создаем объект класса MyObject
class MyObject {
    function dummy($params, &$smarty) {
        return 'method!';
    }
}
$myobj = new MyObject;
 
// регистрируем объект по ссылке
$smarty->register_object('foobar',$myobj);
// ограничиваем доступ к методам
$smarty->register_object('foobar',$myobj,array('meth1','meth2','prop1'));
// или так, если без ограничений
$smarty->register_object('foobar',$myobj,null,false);
// Используем by_ref для объектов
$smarty->assign_by_ref('myobj', $myobj);
$smarty->display('index.tpl');
?>
 



 
{* доступ к методу, передача параметра *}
{foobar->meth1 p1='foo' p2=$bar}
 
{* можем поймать вывод метода *}
{foobar->meth1 p1='foo' p2=$bar assign='output'}
Метод вернул {$output}
 
{* доступ к объекту, назначенному через assign *}
{$myobj->meth1('foo',$bar)}
 




Полный мануал по смарти -
http://www.smarty.net/manual/ru/

Smarty 3

В третей версии появилось несколько новых плюшек

Ассоциативные массивы

 
{$var = ['foo' => 'bar', 'sub' => [1, 2, 3]]}
{$var.foo = 'other'}
 



Новый синтаксис foreach

 
{foreach $res as $k => $v}
  {if $v@index eq 1}{$v.id} : {$v.name}{/if}
{foreachelse}
  .. no results ..
{/foreach}
 



Для каждого значения итерации доступны модификаторы:
$name@index :индекс массива, обыно 0+
$name@iteration :номер итерации, 1+
$name@key :значение ключа (работает с синтаксисом foreach $res as $v)
$name@last, $name@first :bool, если элемент первый или последний
$name@show :bool, выводилось ли ранее значение элемента текущей итерации
$name@total :количество итераций в данном foreach

Добавлен {continue}, {break}, теперь можно прервать цикл! в этот момент предыдущий смарти заикал.

Создание объекта-шаблона и выполнение отдельных операций с ним

 
$tpl = $smarty->createTemplate('my.tpl');
$tpl->assign('foo','bar');
$smarty->display($tpl); // or $tpl->display();
 



Объект данных (контекст для смарти)

 
$data = new Smarty_Data;
$data->assign('foo','bar');
$smarty->display('my.tpl',$data);
$tpl = $smarty->createTemplate('my.tpl',$data);
 



Возможность указать поток в назначении шаблона

 
// PHP
$smarty->display('foo:bar.tpl');
// Smarty
{include file="foo:bar.tpl"}
 



Обработка шаблона из строки

 
$template = "example {$foo}";
$smarty->assign('foo', 'bar');
$smarty->fetch('string:' . $template);
 



Наследование в шаблонах

{extends file="layout.tpl"}, {extends "layout.tpl"} указывает на родительский шаблон
Extends должен быть первой строкой в файле. Поддерживается вложенные лейауты.

Контент блоки

{block name="foo" [append|prepend|hide]}{/block}
{block "fooBar"}контект{/block}

Блоки, которые будут переопределять контент в родительском шаблоне.
Блоки поддерживают вложенность. Extend

append — добавит содержимое в конец наследуемого блока
hide — не будет показывать родительский блок, если дочерний не определен

В блоках можно также использовать контент из родительского блока {$smarty.block.parent}
, или дочернего {$smarty.block.child}.

{block "foo"}child title is {$smarty.block.child} here{/block}

Пример:

 
// parent .tpl
 
<html>
  <head>
        <title>{block name=title}default title{/block}<title>
  </head>
  <body>
        {block name=body}default body{/block}
  </body>
</html>
 
// child .tpl
 
{extends file="parent.tpl"}
{block name=title}My Child Title{/block}
{block name=body}My Child Body{/block}
 
// output of $smarty->display('child.tpl');
 
<html>
  <head>
        <title>My Child Title<title>
  </head>
  <body>
        My Child Body
  </body>
</html>
 
 



Автоматическое экранирование {} в <script>

срабатывает, если скобки `{}` окружены пробелами/переносом строки

 
<script>
   // такой вариант не вызовет попоболи у третего смарти
   function foobar {
        alert('foobar!');
   }
   // раньше нужно было явно экранировать
   {literal}
        function bazzy {alert('foobar!');}
   {/literal}
</script>
 



Новый фильтр переменных

 
$smarty->registerFilter('variable','htmlspecialchars');
 



В примере весь вывод переменных будет обработан htmlspecialchars.
Можно выборочно отключить директивой {$foo nofilter}.