Шаблон Smarty представляет собой обычный HTML-документ с добавленными в него специальными smarty-тегами. По умолчанию эти теги заключаются в фигурные скобки ? {тег}. При выводе шаблона эти теги обрабатываются компилятором и в зависимости от их назначения ? переменная или функция, отображается желаемый результат. В примере 1 приведен шаблон, в котором одновременно встречаются теги HTML и smarty-теги. Пример 1. Файл с шаблоном {include file="header.tpl" title="HTML и CSS"} <div id="col1"> <p id="tagtitle">Теги HTML</p> <div class="panel"> <div><a href="/html/">Все теги</a></div> {foreach from="$tag" item="entry"} <div><a href="/html/{$entry.html_tag|lower}.html">{$entry.html_tag}</a></div> {/foreach} </div> <p id="csstitle">Свойства CSS</p> <div class="panel"> <div><a href="/css/">Все свойства</a></div> {foreach from="$css" item="entry"} <div><a href="/css/{$entry.css_name|lower}.html">{$entry.css_name}</a></div> {/foreach} </div> {include file="footer.tpl"} В данном примере совместно применяются HTML-теги, переменные и функции Smarty. Теги HTML Любые элементы HTML вставляются в шаблон в своем исходном виде, за исключением фигурных скобок, которые понимаются Smarty как внутренние команды. Подобные скобки могут встречаться в тексте или в скриптах для обозначения функций. В этом случае следует использовать команду {literal}...{/literal} чтобы показать Smarty, что скобки следует отображать ?как есть?. Также допустимо переназначить фигурные скобки для обозначения команд на нечто иное. Поскольку на сайтах часто определенные элементы повторяются на каждой странице, имеет смысл разделить один шаблон на несколько файлов. Для этого применяется функция {include} как показано в примере 1. В качестве значения параметра file берется имя подключаемого шаблона. Переменные пользователя Все переменные Smarty, заданные через PHP указываются в фигурных скобках и со знаком доллара, например ? {$text}. Само определение переменной в PHP-файле происходит с помощью метода assign, как показано в примере 2. Пример 2. Создание и использование пользовательских переменных Файл index.php $smarty = new Smarty; $smarty->assign("titlePage", "Фотографии пользователей"); $smarty->assign("numPhoto", 1260); $smarty->display("photo.tpl"); Файл photo.tpl {include file="header.tpl" title=$titlePage} <h1>{$titlePage}</h1> <p>На сайте фотографий пользователей: {$numPhoto} штук.</p> Вначале в PHP-файле определяются все необходимые переменные, которые передаются в шаблон через метод assign. В самом шаблоне переменные встраиваются в код HTML со знаком $ впереди и в фигурных скобках. Smarty не ограничивается простыми переменными, допустимо вставлять в шаблон любые значения числовых и ассоциативных массивов. В примере 3 показана работа с такими массивами. Пример 3. Вывод значений массивов Файл index.php <?php require ('inc/path.php'); require (SMARTY_DIR . 'setup.php'); $smarty = new Smarty; $cmyk = array("c" => "cyan", "m" => "magenta", "y" => "yellow", "k" => "black"); $fibo = array(1=>1, 1, 2, 3, 5, 8, 13, 21, 34); $smarty->assign("cmyk", $cmyk); $smarty->assign("fibo", $fibo); $smarty->display('index.tpl'); ?> Файл index.tpl <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=windows-1251"> <title>Массивы</title> </head> <body> <p>{$fibo[6]}</p> <p>{$cmyk.c}</p> </body> </html> В данном примере в первой строке будет показано число 8, а во второй строке выведется текст ?cyan?. Переменные $smarty Для обращения к зарезервированным в PHP массивам GET, POST, COOKIES, SERVER, ENV и SESSION применяется специальная переменная $smarty. Вначале пишется $smarty, затем после точки имя массива PHP, дальше чего через точку указывается имя переменной пользователя. В табл. 1 приведены некоторые переменные запроса. Табл. 1. Получение переменных запроса через Smarty $smarty.get.id Значение id, полученное через метод GET $smarty.post.name Значение name, полученное через метод POST $smarty.cookies.user Значение user, хранящееся в кукисах $smarty.session.time Значение time, хранящееся в сессии $smarty.server.SCRIPT_NAME Вывод переменной сервера SCRIPT_NAME Подобные переменные удобны при получении данных форм, что и продемонстрировано в примере 4. Пример 4. Вывод значений формы <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=windows-1251"> <title>Формы</title> </head> <body> {if $smarty.post.user} <p>Вы ввели имя: {$smarty.post.user}</p> {/if} <form action="" method="post"> <p>Введите ваше имя</p> <p><input type="text" size="30" name="user"></p> <p><input type="submit" value="Отправить" name="send_form"></p> </form> </body> </html> В текущем примере используется функция {if}, которая проверяет, получены ли данные по методу POST и выводит значение user при ее наличии. Переменные файлов конфигурации Конфигурационные файлы нужны для хранения каких-либо типовых значений и могут включать в себя текст, числа, цвета и др. Обращение к переменным таких файлов состоит из некоторых шагов. Вначале следует создать файл (он обычно имеет расширение conf) и сохранить его в папке smartyconfigs. Содержимое этого файла состоит из имени переменной и значения в кавычках (пример 5). Пример 5. Содержимое конфигурационного файла bgcolor = "#f0f0f0" command = "Извлечь" num = "5" Как видно из данного примера, каждая переменная занимает одну строку в тексте. Для обращения к переменным в шаблоне вначале следует загрузить конфигурационный файл через функцию {config_load file="имя файла"}, после чего вписать имя переменной в виде {#переменная#}, как показано в примере 6. Пример 6. Использование конфигурационных переменных {config_load file="main.conf"} <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=windows-1251"> <title>{#title#}</title> </head> <body> <table width="{#widthTable#}" border="0" cellspacing="0" cellpadding="4"> <tr> <td width="20%" align="{#align#}"><a href="#">Lorem</a></td> <td width="20%" align="{#align#}"><a href="#">Ipsum</a></td> <td width="150"><a href="#"><img src="" name="Logo" width="150" height="70" border="0" style="background-color: {#bgCell#}"></a></td> <td width="20%" align="{#align#}"><a href="#">Dolar</a></td> <td width="20%" align="{#align#}"><a href="#">Sic</a></td> </tr> </table> </body> </html> В данном примере переменные title, align, widthTable, bgCell задаются в файле main.conf. Функции Функции Smarty очень похожи по синтаксису на переменные, но пишутся без знака $ в начале, например {if}, упоминаемая ранее. Большинство функций содержат аргументы, которые расширяют возможности по настройке этих функций. Все аргументы указываются через пробел, значения заключаются в одинарные, двойные кавычки или пишутся вообще без них. Исключением является текст, который всегда должен писаться в кавычках. Также внутри функций можно задавать переменные, как показано в примере 7. Пример 7. Использование функций {assign var="cssfile" value="fp.css"} {include file="header.tpl"} <div id="container"> <h1>Последние добавленные фотографии</h1> {foreach from="$lastphoto" item="entry"} <div class="thumb"><a href="/photo/?id={$entry.photo_id}"><img src="/thumb/{$entry.photo_thumb}" width="120" height="120" alt="{$entry.photo_title}"></a></div> {/foreach} <h1>Популярные фотографии</h1> <table width="100%" border="0" cellspacing="0" cellpadding="4" class="thumbdescr"> {foreach from="$popular" item="entry"} <tr> <td width="130"><a href="/photo/?id={$entry.photo_id}"><img src="/thumb/{$entry.photo_thumb}" alt="{$entry.photo_title}"></a></td> <td> <p>Название: {$entry.photo_title}</p> <p>Категория: <a href="/photo/?pid={$entry.theme_id}">{$entry.theme_title}</a></p> {if $entry.photo_year && $entry.photo_year != "0000"}<p>Год: {$entry.photo_year}</p>{/if} <p>Размер: {$entry.width} x {$entry.height}</p> <p>Объем: {$entry.size} Кб</p> <p>{$entry.count_total}</p> </td> </tr> {/foreach} </table> </div> {include file="footer.tpl"} В данном примере встречается несколько функций ? {assign}, {include}, {foreach}, {if}.