Smarty конспект
Категория: / DEV Блог
/ PHP (LAMP)
В smarty предусмотрено комментирование кода?
Как экранировать код в котором встречаются {}
Как посчитать количество элементов в массиве
Как создать внутреннюю переменную smarty
Значение переменной по-умолчанию
Как сделать чтобы смарти вычислил значение переменной при присвоении
Полезные строковые модификаторы
Экранирование
Текущая дата
Как организовать цикл for
Как в цикле foreach определить первый и последний элемент
Использование условий if
Передача параметров вызываемому шаблону
Включение шаблона можно перенаправить в переменную
Управление кэшированием вложеных шаблонов.
Не кэшировать шаблон
Кэшировать на 500 секунд
Принудительное кэширование
Использование захватов (capture)
Смарти умеет вычислять!
Обратите внимание, результат можно отформатировать с помощью printf-like шаблонов.
Также для форматирования в smarty есть отдельный модификатор
Вообще с помощью math можно юзать основные нативные вычисляющие функции php.
Случайное число (random)
Дополнительные вспомогательные операции
Переменные смарти
То есть из smarty мы можем обратиться к массиву $_SERVER и $_GET.
Например, определим, находимся ли мы сейчас на главной странице
Отладка в smarty
Значение переменной
Консоль отладки, показывает все переданные данные скриптом в smarty
Объекты (классы) в smarty
Полный мануал по смарти -
http://www.smarty.net/manual/ru/
Smarty 3
В третей версии появилось несколько новых плюшек
Ассоциативные массивы
Новый синтаксис 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}, теперь можно прервать цикл! в этот момент предыдущий смарти заикал.
Создание объекта-шаблона и выполнение отдельных операций с ним
Объект данных (контекст для смарти)
Возможность указать поток в назначении шаблона
Обработка шаблона из строки
Наследование в шаблонах
{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}
Пример:
Автоматическое экранирование {} в <script>
срабатывает, если скобки `{}` окружены пробелами/переносом строки
Новый фильтр переменных
В примере весь вывод переменных будет обработан htmlspecialchars.
Можно выборочно отключить директивой {$foo nofilter}.
{* комментарий *}
Как экранировать код в котором встречаются {}
{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}.
например как ниже если datasale2 больше текущей...
проблема в том, что как правильно указать текущую дату!!!
{:if $p['datasale2'] >$smarty.now:}
111
{:else:}
222
{:/if:}