What is Smarty?
Why use it?
Use Cases and Work Flow
Syntax Comparison
Template Inheritance
Best Practices
Crash Course
You may use the Smarty logo according to the trademark notice.
For sponsorship, advertising, news or other inquiries, contact us at:
Шаблоны можно получать из самых разных источников. Когда вы отображаете или вызываете шаблон, либо когда вы подключаете один шаблон к другому, вы указываете тип ресурса, вместе с соответствующим путём и названием шаблона. Если тип ресурса явно не задан, используется значения свойства $default_resource_type.
Шаблоны, которые находятся в папке $template_dir, не требуют при вызове указания типа ресурса, хотя вы можете использовать префикс file: для сохранения стиля. Для вызова просто укажите относительный от $template_dir путь к шаблону.
Example 15.6. Вызов шаблона из папки $template_dir
<?php $smarty->display('index.tpl'); $smarty->display('admin/menu.tpl'); $smarty->display('file:admin/menu.tpl'); // тоже самое, что и строкой выше ?> {* код в шаблоне Smarty *} {include file="index.tpl"} {include file="file:index.tpl"} {* тоже самое, что и строкой выше *}
Для вызова шаблонов из папки вне $template_dir необходимо использовать префикс file: с последующим указанием асболютного пути и имени шаблона.
Example 15.7. Вызов шаблона из произвольной папки
<?php $smarty->display('file:/export/templates/index.tpl'); $smarty->display('file:/path/to/my/templates/menu.tpl'); ?>
А изнутри шаблона Smarty:
{include file="file:/usr/local/share/templates/navigation.tpl"}
Если вы работаете под Windows, то пути к файлам, как правило, начинаются с буквы логического диска (например, C:). Не забудьте указать префикс "file:" в начале пути, чтобы избежать конфликтов имён и достичь необходимого результата.
Example 15.8. использование шаблонов с файловіми путями Windows
<?php // PHP скрипт $smarty->display('file:C:/export/templates/index.tpl'); $smarty->display('file:F:/path/to/my/templates/menu.tpl'); ?>
А изнутри шаблона Smarty:
{include file="file:D:/usr/local/share/templates/navigation.tpl"}
Вы можете вызывать шаблоны, используя любые доступные через PHP источники: базы данных, сокеты, LDAP и так далее. Для этого нужно написать соответствующий плагин ресурса и зарегистрировать его в Smarty.
Смотрите раздел плагины ресурсов для более подробной информации о тех функциях, которые вы должны предоставить.
Обратите внимание на то, что вы не можете переопределить встроенный ресурс
file
, но в ваших силах написать и зарегистрировать ресурс с
другим именем, который будет использовать другой способ вызова шаблонов из
файловой системы.
Example 15.9. Использование собственных ресурсов
// код в вашем скрипте function db_get_template ($tpl_name, &$tpl_source, &$smarty_obj) { // обращаемся к базе, запрашиваем код шаблона, // перегружаем его в $tpl_source $sql = new SQL; $sql->query("select tpl_source from my_table where tpl_name='$tpl_name'"); if ($sql->num_rows) { $tpl_source = $sql->record['tpl_source']; return true; } else { return false; } } function db_get_timestamp($tpl_name, &$tpl_timestamp, &$smarty_obj) { // обращаемся к базе, запрашиваем поле $tpl_timestamp. $sql = new SQL; $sql->query("select tpl_timestamp from my_table where tpl_name='$tpl_name'"); if ($sql->num_rows) { $tpl_timestamp = $sql->record['tpl_timestamp']; return true; } else { return false; } } function db_get_secure($tpl_name, &$smarty_obj) { // предполагаем, что наши шаблоны совершенно безопасны return true; } function db_get_trusted($tpl_name, &$smarty_obj) { // не используется для шаблонов } // регистрируем ресурс под именем "db" $smarty->register_resource("db", array("db_get_template", "db_get_timestamp", "db_get_secure", "db_get_trusted")); // используем ресурс из PHP скрипта $smarty->display("db:index.tpl"); ?>
А изнутри шаблона Smarty:
{include file="db:/extras/navigation.tpl"}
Вы можете определить функцию, которая будет использована, если шаблон не может быть вызван из соответствующего ресурса. Это можно использовать, к примеру, для построения недостающего шаблона на лету.
Example 15.10. использование функции для обработки шаблона по умолчанию
<?php // код в вашем скрипте function make_template ($resource_type, $resource_name, &$template_source, &$template_timestamp, &$smarty_obj) { if( $resource_type == 'file' ) { if ( ! is_readable ( $resource_name )) { // создаём и записываем файл шаблона. $template_source = "Это новый шаблон."; $template_timestamp = time(); $smarty_obj->_write_file($resource_name,$template_source); return true; } } else { // не файл return false; } } // определение обработчика $smarty->default_template_handler_func = 'make_template'; ?>