Smarty конспект

Категория: / DEV Блог / PHP (LAMP)
В 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
{debug}


Объекты (классы) в 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}.