Ресурсы
Шаблоны можно получать из самых разных источников. Когда вы отображаете,
вызываете или подключаете один шаблон из другого, вы указываете тип ресурса,
вместе с соответствующим пут╦м и названием шаблона.
Шаблоны из папки $template_dir
Шаблоны, лежащие в папке $template_dir, не требуют при вызове указания
типа ресурса, хотя вы можете использовать префикс file: для сохранения
стиля. Для вызова просто укажите относительный от $template_dir путь к
шаблону.
Пример 15-6. Вызов шаблона из папки $template_dir
<?php $smarty->display("index.tpl"); $smarty->display("admin/menu.tpl"); $smarty->display("file:admin/menu.tpl"); // тоже самое, что и строкой выше
{* код в шаблоне *} {include file="index.tpl"} {include file="file:index.tpl"} {* тоже самое, что и строкой выше *}
|
|
Шаблоны из произвольной папки
Для вызова шаблонов из папки вне $template_dir необходимо
использовать префикс file: с последующим указанием асболютного
пути и имени шаблона.
Пример 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
Если вы работаете под Windows, то пути к файлам, как правило,
начинаются с буквы логического диска (например, C:). Не забудьте
указать префикс "file:" в начале пути, чтобы избежать конфликтов
им╦н и достичь необходимого результата.
Пример 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, но в ваших силах написать и зарегистрировать ресурс с
другим именем, который будет использовать другой способ вызова шаблонов из
файловой системы.
Пример 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"} |
|
Функция для обработки шаблона по умолчанию
Вы можете определить функцию, которая будет использована,
если шаблон не может быть вызван из соответствующего ресурса.
Это можно использовать, к примеру, для построения недостающего
шаблона на лету.
Пример 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'; ?>
|
|