Библиотека plusby.com Учебник РНР 4.2 Иллюстрированный самоучитель по Maple

Ресурсы

Шаблоны можно получать из самых разных источников. Когда вы отображаете, вызываете или подключаете один шаблон из другого, вы указываете тип ресурса, вместе с соответствующим путём и названием шаблона.

Шаблоны из папки $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");

{* код в шаблоне *}
{include file="file:/usr/local/share/templates/navigation.tpl"}

Пути в Windows

Если вы работаете под Windows, то пути к файлам, как правило, начинаются с буквы логического диска (например, C:). Не забудьте указать префикс "file:" в начале пути, чтобы избежать проблем с именами и достичь необходимого результата.

Пример 15-8. Вызов шаблона под windows

// PHP скрипт
$smarty->display("file:C:/export/templates/index.tpl");
$smarty->display("file:F:/path/to/my/templates/menu.tpl");

{* код в шаблоне *}
{include file="file:D:/usr/local/share/templates/navigation.tpl"}

Шаблоны из прочих источников

Вы можете вызывать шаблоны, используя любые доступные через PHP источники: базы данных, сокеты, LDAP и так далее. Для этого нужно написать соответствующий плагин ресурса и зарегистрировать его для Smarty.

Смотрите раздел плагины ресурсов для более подробной информации о соответствующих функциях.

Замечание: Обратите внимание на то, что вы не можете переопределить встроенный ресурс file, но в ваших силах написать и зарегистрировать ресурс с другим именем, который будет использовать другой способ вызова шаблонов из файловой системы.

Пример 15-9. Использование своих ресурсов

// PHP скрипт

// код в вашем скрипте 
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");

{* используем ресурс из шаблона *}
{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';
?>