Files
smarty/docs/ru/appendixes/tips.xml
2008-05-25 15:06:11 +00:00

458 lines
17 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="UTF-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 2598 Maintainer: freespace Status: ready -->
<chapter id="tips">
<title>Советы</title>
<para></para>
<sect1 id="tips.blank.var.handling">
<title>Обработка пустых переменных</title>
<para>
Иногда, например, для того чтобы фон таблицы работал корректно,
необходимо вывести вместо пустого значения переменной, значение
по умолчанию, например <literal>&amp;nbsp;</literal>.
Многие бы использовали конструкцию
<link linkend="language.function.if"><varname>{if}</varname></link>
в данной ситуации,
но в Smatry есть более короткий путь - используя модификатор переменной
<link
linkend="language.modifier.default"><emphasis>default</emphasis></link>.
<note>
<para>
PHP выдаст ошибку <quote>Undefined variable</quote> в случае, если
<ulink url="&url.php-manual;error_reporting">
<varname>error_reporting()</varname></ulink> установлен в <constant>E_ALL</constant>
и переменная не была присвоена шаблону Smarty.
</para>
</note>
</para>
<example>
<title>Вывод &amp;nbsp;, если переменная пуста</title>
<programlisting>
<![CDATA[
{* длинный путь *}
{if $title eq ''}
&nbsp;
{else}
{$title}
{/if}
{* короткий путь *}
{$title|default:'&nbsp;'}
]]>
</programlisting>
</example>
<para>
См. также <link linkend="language.modifier.default">default</link> и
<link linkend="tips.default.var.handling">Обработка переменных по умолчанию</link>.
</para>
</sect1>
<sect1 id="tips.default.var.handling">
<title>Обработка переменных по умолчанию</title>
<para>
Если переменная встречается часто, то использование модификатора
<link linkend="language.modifier.default"><varname>default</varname></link>
каждый раз можно избежать, используя функцию
<link linkend="language.function.assign"><varname>{assign}</varname></link>.
</para>
<example>
<title>Назначение переменной шаблона значения по умолчанию</title>
<programlisting>
<![CDATA[
{* где-то в начале шаблона *}
{assign var='title' value=$title|default:'no title'}
{* если переменная $title была пустой, то сейчас она содержит "no title" *}
{$title}
]]>
</programlisting>
</example>
<para>
См. также
<link linkend="language.modifier.default"><varname>default</varname></link> и
<link linkend="tips.blank.var.handling">Обработка пустых переменных</link>.
</para>
</sect1>
<sect1 id="tips.passing.vars">
<title>Присвоение переменной заголовка (title) шаблону-шапке</title>
<para>
Если большинство ваших шаблонов имеют похожие верхние и нижние
части, то имеет смысл вынести их в отдельные файлы и
<link linkend="language.function.include">подключать</link> их.
Но как быть, если шапка должна иметь различные заголовки на различных
страницах? Вы можете передавать текст заголовка шапке в качестве <link
linkend="language.syntax.attributes">атрибута</link> в момент её включения.
</para>
<example>
<title>Присвоение переменной заголовка (title) шаблону-шапке</title>
<para>
<filename>mainpage.tpl</filename> - когда отображается главная страница,
заголовок <quote>Main Page</quote> передается в
<filename>header.tpl</filename>,
и будет в дальнейшем использован в качестве заголовка.
</para>
<programlisting>
<![CDATA[
{include file='header.tpl' title='Main Page'}
{* тут находится тело шаблона *}
{include file='footer.tpl'}
]]>
</programlisting>
<para>
<filename>archives.tpl</filename> - когда отображается страница архива,
заголовок будет <quote>Archives</quote>.
Обратите внимание, что в этом примере мы
используем переменную из <filename>archives_page.conf</filename>, вместо
того, чтобы жестко прописать её в шаблоне.
</para>
<programlisting>
<![CDATA[
{config_load file='archive_page.conf'}
{include file='header.tpl' title=#archivePageTitle#}
{* тут находится тело шаблона *}
{include file='footer.tpl'}
]]>
</programlisting>
<para>
<filename>header.tpl</filename> - Обратите внимание, что
<quote>Smarty News</quote> отображается тогда, когда $title не задан,
благодаря модификатору
<link linkend="language.modifier.default"><varname>default</varname></link>.
</para>
<programlisting>
<![CDATA[
<html>
<head>
<title>{$title|default:'Smarty News'}</title>
</head>
<body>
]]>
</programlisting>
<para>
<filename>footer.tpl</filename>
</para>
<programlisting>
<![CDATA[
</body>
</html>
]]>
</programlisting>
</example>
</sect1>
<sect1 id="tips.dates">
<title>Даты</title>
<para>
Обычно даты в Smarty всегда передаются как
<ulink url="&url.php-manual;time">временные метки</ulink> (англ. timestamp),
что позволяет проектировщикам шаблонов использовать <link
linkend="language.modifier.date.format"><varname>date_format</varname></link>
для полного контроля над форматированием даты и также делает легким
сравнение дат там, где это необходимо.
</para>
<note>
<para>
Начиная с версии Smarty 1.4.0, вы можете передавать даты в Smarty в виде
меток времени Unix (unix timestamps), mysql, или в любом другом виде,
который понимает функция
<ulink url="&url.php-manual;strtotime">strtotime()</ulink>.
</para>
</note>
<example>
<title>Использование date_format</title>
<programlisting>
<![CDATA[
{$startDate|date_format}
]]>
</programlisting>
<para>
Результат работы:
</para>
<screen>
<![CDATA[
Jan 4, 2009
]]>
</screen>
<programlisting>
<![CDATA[
{$startDate|date_format:"%Y/%m/%d"}
]]>
</programlisting>
<para>
Результат работы:
</para>
<screen>
<![CDATA[
2009/01/04
]]>
</screen>
<para>
Даты можно ставнивать в шаблонах путем сравнения
меток времени следующим образом:
</para>
<programlisting>
<![CDATA[
{if $date1 < $date2}
... делаем что-то полезное ...
{/if}
]]>
</programlisting>
</example>
<para>
Когда <link linkend="language.function.html.select.date">
<varname>{html_select_date}</varname></link>
используется в шаблоне, программист наверняка захочет преобразовать
данные из формы назад в формат временной метки. Вот функция, которая
поможет вам сделать это.
</para>
<example>
<title>Преобразование элементов формы ввода даты назад к временной метке</title>
<programlisting role="php">
<![CDATA[
<?php
// Предполагается, что ваши элементы формы названы
// startDate_Day, startDate_Month, startDate_Year
$startDate = makeTimeStamp($startDate_Year, $startDate_Month, $startDate_Day);
function makeTimeStamp($year='', $month='', $day='')
{
if(empty($year)) {
$year = strftime('%Y');
}
if(empty($month)) {
$month = strftime('%m');
}
if(empty($day)) {
$day = strftime('%d');
}
return mktime(0, 0, 0, $month, $day, $year);
}
?>
]]>
</programlisting>
</example>
<para>
См. также
<link linkend="language.function.html.select.date">
<varname>{html_select_date}</varname></link>,
<link linkend="language.function.html.select.time">
<varname>{html_select_time}</varname></link>,
<link linkend="language.modifier.date.format">
<varname>date_format</varname></link> и
<link linkend="language.variables.smarty.now">
<parameter>$smarty.now</parameter></link>
</para>
</sect1>
<sect1 id="tips.wap">
<title>WAP/WML</title>
<para>
WAP/WML шаблоны требуют, чтобы
<ulink url="&url.php-manual;header">заголовок Content-Type</ulink>
был передан вместе с шаблоном. Простейший путь - написать
пользовательскую функцию, которая будет выводить заголовки.
Если вы используете <link linkend="caching">кэширование</link>,
это не сработает, так что мы сделаем это с помощью тэга
<link linkend="language.function.insert"><varname>{insert}</varname></link>;
не забывайте, что тэги <varname>{insert}</varname> не кэшируются!
Убедитесь, что перед шаблоном в браузер ничего не выводится,
иначе отправить заголовок не получится.
</para>
<example>
<title>Использование {insert} для отправки заголовка Content-Type для WML</title>
<programlisting role="php">
<![CDATA[
<?php
// убедитесь, что apache настроен на обработку расширений .wml!
// добавьте эту функцию в своё приложение или в Smarty.addons.php
function insert_header($params)
{
// эта функция ожидает аргумент $content
if (empty($params['content'])) {
return;
}
header($params['content']);
return;
}
?>
]]>
</programlisting>
<para>
ваш шаблон Smarty <emphasis>должен</emphasis> начинаться с тэга insert:
</para>
<programlisting>
<![CDATA[
{insert name=header content="Content-Type: text/vnd.wap.wml"}
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<!-- begin new wml deck -->
<wml>
<!-- begin first card -->
<card>
<do type="accept">
<go href="#two"/>
</do>
<p>
Welcome to WAP with Smarty!
Press OK to continue...
</p>
</card>
<!-- begin second card -->
<card id="two">
<p>
Pretty easy isn't it?
</p>
</card>
</wml>
]]>
</programlisting>
</example>
</sect1>
<sect1 id="tips.componentized.templates">
<title>Составные шаблоны</title>
<para>
По традиции, программирование шаблонов в вашем приложении идёт следующим
путём: Сначала вы формируете переменные внутри вашего приложения PHP
(возможно, используя запросы к базе данных). Затем вы создаёте экземпляр
объекта Smarty,
<link linkend="api.assign">назначаете</link> переменные и
<link linkend="api.display">отображаете</link> шаблон.
Давайте представим себе такую ситуацию: К примеру, у нас есть котировщик
ценных бумаг в нашем шаблоне. Мы собираем данные о котировках ценных бумаг
в нашем приложении, затем передаём эти переменные в шаблон и отображаем
его. Правда, было бы здорово, если бы этот котировщик можно было перенести
в другое приложение, просто подключив к нему шаблон, не беспокоясь об
источнике данных.
</para>
<para>
Вы можете сделать это, написав собственное расширение для получения
данных и присваивания их переменной шаблона.
</para>
<example>
<title>составной шаблон</title>
<para>
<filename>function.load_ticker.php</filename> -
поместите файл в
<link linkend="variable.plugins.dir">
<parameter>директорию $plugins</parameter></link>
</para>
<programlisting role="php">
<![CDATA[
<?php
// настраиваем нашу функцию для получения информации о ценных бумагах
function fetch_ticker($symbol)
{
// здесь находится логика формирования $ticker_info
// из какого-то источника
return $ticker_info;
}
function smarty_function_load_ticker($params, &$smarty)
{
// вызываем функцию
$ticker_info = fetch_ticker($params['symbol']);
// присваиваем переменную шаблона
$smarty->assign($params['assign'], $ticker_info);
}
?>
]]>
</programlisting>
<para>
<filename>index.tpl</filename>
</para>
<programlisting>
<![CDATA[
{load_ticker symbol='SMARTY' assign='ticker'}
Stock Name: {$ticker.name} Stock Price: {$ticker.price}
]]>
</programlisting>
</example>
<para>
См. также
<link linkend="language.function.include.php">
<varname>{include_php}</varname></link>,
<link linkend="language.function.include">
<varname>{include}</varname></link> и
<link linkend="language.function.php"><varname>{php}</varname></link>.
</para>
</sect1>
<sect1 id="tips.obfuscating.email">
<title>Сокрытие E-mail адреса</title>
<para>
Вы когда-нибудь удивлялись, как ваш e-mail адрес попадает в такое
количество спамерских рассылок? Один из способов сбора e-mail адресов
заключается в просмотре веб-страниц. Чтобы помочь предотвратить эту
проблему, вы можете сделать так, чотбы ваш e-mail адрес отображался
в скрытом за javascript'ом виде в HTML-исходниках, в то же время
выглядя и работая корректно в браузере. Это можно совершить при помощи
расширения <link linkend="language.function.mailto">
<varname>{mailto}</varname></link>.
</para>
<example>
<title>Пример сокрытия e-mail адреса в шаблоне</title>
<programlisting>
<![CDATA[
Вопросы направляйте по адресу
{mailto address=$EmailAddress encode="javascript" subject="Hello"}
]]>
</programlisting>
</example>
<note>
<title>Техническое Замечание</title>
<para>
Этот метод не может гарантировать 100% защиты.
Существует вероятность, что спамер запрограммирует свой
сборщик e-mail адресов на раскодирование этих значений,
но это маловероятно...
будем надеяться... пока что...
куда я там дел свой квантовый компьютер :-?.
</para>
</note>
<para>
См. также модификатор
<link linkend="language.modifier.escape"><varname>escape</varname></link> и
<link linkend="language.function.mailto"><varname>{mailto}</varname></link>.
</para>
</sect1>
</chapter>
<!-- 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
-->