Первые tips & tricks для Smarty 3

13.12.2009 12:19 / Артём Волк / 633 просмотра

Новая версия 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'}