Первые tips & tricks для Smarty 3
Новая версия Smarty 3, находящаяся сейчас в стадии бета-тестирования содержит много нововведений. Наиболее заметные из этих новинок — наследование шаблонов (template inheritance) и поддержка определения функций в шаблонах (template functions).
Дублирование блоков в parent-шаблоне
К примеру, есть общий шаблон:
{*
Шаблон parent.tpl
*}
<html>
<head>
<title>{block name='title'}{/block}</title>
</head>
<body>
{block name='content'}{/block}
</body>
</html>
И шаблон конкретной страницы:
{*
Шаблон child.tpl
*}
{extends file='parent.tpl'}
{block name='title'}
Название страницы
{/block}
{block name='content'}
Содержимое страницы
{/block}
В случае, если содержимое блока нужно использовать несколько раз в родительском шаблоне (например, продублировать название страницы в теге
<h1></h1> этого можно достичь просто продублировав {block}{/block}:
{*
Шаблон parent.tpl
*}
<html>
<head>
<title>{block name='title'}{/block}</title>
</head>
<body>
<h1>{block name='title'}{/block}</h1>
{block name='content'}{/block}
</body>
</html>
Автор решения, мой коллега Дяговченко Сергей.
Подключение функций шаблона из файла
Функции шаблона позволяют инкапсулировать некую функциональность, необходиму для отображения данных и повторно её использовать
в шаблоне. Однако, есть одна проблема — если функция определена в файле, подключаемом через {include} то, например, вот такой шаблон вызовет
ошибку компиляции с сообщением, что функция не определена:
{include file='my_function.tpl'}
{my_function variable1='example1' variable2='example2'}
По словам разработчиков Smarty причина этого в том, что компиляция шаблона выполняется без обработки {include}. Предложенное ими решение заключается в том, что можно немного «обмануть» компилятор шаблонов, объявив пустую функцию с тем же именем. Во время обработки
шаблона для отображения данных функция из загружаемого шаблона перекроет пустую реализацию:
{include file='my_function.tpl'}
{function name='my_function'}{/function}
{my_function variable1='example1' variable2='example2'}
Обновление от 02.01.2010: Доступен также альтернативный синтаксис. В этом случае пустую функцию можно не создавать, а подключаемую функцию вызывать вот так:
{call name=my_function variable1='example1' variable2='example2'}
