Files
smarty/docs/ru/programmers/advanced-features/template-resources.xml
2006-08-21 09:45:04 +00:00

255 lines
7.0 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?xml version="1.0" encoding="windows-1251"?>
<!-- $Revision$ -->
<!-- EN-Revision: 1.4 Maintainer: freespace Status: ready -->
<sect1 id="template.resources">
<title>Ресурсы</title>
<para>
Шаблоны можно получать из самых разных источников. Когда вы
<link linkend="api.display">отображаете</link> или
<link linkend="api.fetch">вызываете</link> шаблон,
либо когда вы подключаете один шаблон к другому, вы указываете тип ресурса,
вместе с соответствующим путём и названием шаблона.
Если тип ресурса явно не задан, используется значения свойства
<link linkend="variable.default.resource.type">$default_resource_type</link>.
</para>
<sect2 id="templates.from.template.dir">
<title>Шаблоны из папки $template_dir</title>
<para>
Шаблоны, которые находятся в папке
<link linkend="variable.template.dir">$template_dir</link>,
не требуют при вызове указания
типа ресурса, хотя вы можете использовать префикс file: для сохранения
стиля. Для вызова просто укажите относительный от
<link linkend="variable.template.dir">$template_dir</link>
путь к шаблону.
</para>
<example>
<title>Вызов шаблона из папки $template_dir</title>
<programlisting role="php">
<![CDATA[
<?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"} {* тоже самое, что и строкой выше *}
]]>
</programlisting>
</example>
</sect2>
<sect2 id="templates.from.any.dir">
<title>Шаблоны из произвольной папки</title>
<para>
Для вызова шаблонов из папки вне
<link linkend="variable.template.dir">$template_dir</link>
необходимо использовать префикс file: с последующим указанием асболютного
пути и имени шаблона.
</para>
<example>
<title>Вызов шаблона из произвольной папки</title>
<programlisting role="php">
<![CDATA[
<?php
$smarty->display('file:/export/templates/index.tpl');
$smarty->display('file:/path/to/my/templates/menu.tpl');
?>
]]>
</programlisting>
<para>
А изнутри шаблона Smarty:
</para>
<programlisting>
<![CDATA[
{include file="file:/usr/local/share/templates/navigation.tpl"}
]]>
</programlisting>
</example>
<sect3 id="templates.windows.filepath">
<title>Файловые пути в Windows</title>
<para>
Если вы работаете под Windows, то пути к файлам, как правило,
начинаются с буквы логического диска (например, C:). Не забудьте
указать префикс "file:" в начале пути, чтобы избежать конфликтов
имён и достичь необходимого результата.
</para>
<example>
<title>использование шаблонов с файловіми путями Windows</title>
<programlisting role="php">
<![CDATA[
<?php
// PHP скрипт
$smarty->display('file:C:/export/templates/index.tpl');
$smarty->display('file:F:/path/to/my/templates/menu.tpl');
?>
]]>
</programlisting>
<para>
А изнутри шаблона Smarty:
</para>
<programlisting>
<![CDATA[
{include file="file:D:/usr/local/share/templates/navigation.tpl"}
]]>
</programlisting>
</example>
</sect3>
</sect2>
<sect2 id="templates.from.elsewhere">
<title>Шаблоны из прочих источников</title>
<para>
Вы можете вызывать шаблоны, используя любые доступные через PHP источники:
базы данных, сокеты, LDAP и так далее.
Для этого нужно написать соответствующий плагин ресурса и зарегистрировать
его в Smarty.
</para>
<para>
Смотрите раздел <link linkend="plugins.resources">плагины ресурсов</link>
для более подробной информации о тех функциях, которые вы должны
предоставить.
</para>
<note>
<para>
Обратите внимание на то, что вы не можете переопределить встроенный ресурс
<literal>file</literal>, но в ваших силах написать и зарегистрировать ресурс с
другим именем, который будет использовать другой способ вызова шаблонов из
файловой системы.
</para>
</note>
<example>
<title>Использование собственных ресурсов</title>
<programlisting role="php">
<![CDATA[
// код в вашем скрипте
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");
?>
]]>
</programlisting>
<para>
А изнутри шаблона Smarty:
</para>
<programlisting>
<![CDATA[
{include file="db:/extras/navigation.tpl"}
]]>
</programlisting>
</example>
</sect2>
<sect2 id="default.template.handler.function">
<title>Функция для обработки шаблона по умолчанию</title>
<para>
Вы можете определить функцию, которая будет использована,
если шаблон не может быть вызван из соответствующего ресурса.
Это можно использовать, к примеру, для построения недостающего
шаблона на лету.
</para>
<example>
<title>использование функции для обработки шаблона по умолчанию</title>
<programlisting role="php">
<![CDATA[
<?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';
?>
]]>
</programlisting>
</example>
</sect2>
</sect1>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"../../../../manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->