Files
smarty/docs/ru/appendixes/tips.xml

458 lines
17 KiB
XML
Raw Normal View History

2008-01-22 21:04:44 +00:00
<?xml version="1.0" encoding="UTF-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 2598 Maintainer: freespace Status: ready -->
<chapter id="tips">
2008-01-22 21:04:44 +00:00
<title>Советы</title>
2005-08-28 16:51:15 +00:00
<para></para>
<sect1 id="tips.blank.var.handling">
2008-01-22 21:04:44 +00:00
<title>Обработка пустых переменных</title>
2004-04-14 15:29:09 +00:00
<para>
2008-01-22 21:04:44 +00:00
Иногда, например, для того чтобы фон таблицы работал корректно,
необходимо вывести вместо пустого значения переменной, значение
по умолчанию, например <literal>&amp;nbsp;</literal>.
Многие бы использовали конструкцию
<link linkend="language.function.if"><varname>{if}</varname></link>
в данной ситуации,
но в Smatry есть более короткий путь - используя модификатор переменной
2005-08-28 16:51:15 +00:00
<link
linkend="language.modifier.default"><emphasis>default</emphasis></link>.
2008-01-22 21:04:44 +00:00
<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>
2004-04-14 15:29:09 +00:00
</para>
2008-01-22 21:04:44 +00:00
2005-08-28 16:51:15 +00:00
<example>
2008-01-22 21:04:44 +00:00
<title>Вывод &amp;nbsp;, если переменная пуста</title>
2005-08-28 16:51:15 +00:00
<programlisting>
2004-04-14 15:29:09 +00:00
<![CDATA[
2008-01-22 21:04:44 +00:00
{* длинный путь *}
2006-03-24 14:45:37 +00:00
{if $title eq ''}
2004-04-14 15:29:09 +00:00
&nbsp;
{else}
{$title}
{/if}
2008-01-22 21:04:44 +00:00
{* короткий путь *}
2006-03-24 14:45:37 +00:00
{$title|default:'&nbsp;'}
2004-04-14 15:29:09 +00:00
]]>
2005-08-28 16:51:15 +00:00
</programlisting>
</example>
<para>
2008-01-22 21:04:44 +00:00
См. также <link linkend="language.modifier.default">default</link> и
<link linkend="tips.default.var.handling">Обработка переменных по умолчанию</link>.
2005-08-28 16:51:15 +00:00
</para>
</sect1>
<sect1 id="tips.default.var.handling">
2008-01-22 21:04:44 +00:00
<title>Обработка переменных по умолчанию</title>
2005-08-28 16:51:15 +00:00
<para>
2008-01-22 21:04:44 +00:00
Если переменная встречается часто, то использование модификатора
<link linkend="language.modifier.default"><varname>default</varname></link>
каждый раз можно избежать, используя функцию
<link linkend="language.function.assign"><varname>{assign}</varname></link>.
2005-08-28 16:51:15 +00:00
</para>
<example>
2008-01-22 21:04:44 +00:00
<title>Назначение переменной шаблона значения по умолчанию</title>
2005-08-28 16:51:15 +00:00
<programlisting>
2004-04-14 15:29:09 +00:00
<![CDATA[
2008-01-22 21:04:44 +00:00
{* где-то в начале шаблона *}
2006-03-24 14:45:37 +00:00
{assign var='title' value=$title|default:'no title'}
2008-01-22 21:04:44 +00:00
{* если переменная $title была пустой, то сейчас она содержит "no title" *}
2004-04-14 15:29:09 +00:00
{$title}
]]>
2005-08-28 16:51:15 +00:00
</programlisting>
</example>
<para>
2008-01-22 21:04:44 +00:00
См. также
<link linkend="language.modifier.default"><varname>default</varname></link> и
<link linkend="tips.blank.var.handling">Обработка пустых переменных</link>.
2005-08-28 16:51:15 +00:00
</para>
</sect1>
<sect1 id="tips.passing.vars">
2008-01-22 21:04:44 +00:00
<title>Присвоение переменной заголовка (title) шаблону-шапке</title>
2004-04-14 15:29:09 +00:00
<para>
2008-01-22 21:04:44 +00:00
Если большинство ваших шаблонов имеют похожие верхние и нижние
части, то имеет смысл вынести их в отдельные файлы и
<link linkend="language.function.include">подключать</link> их.
Но как быть, если шапка должна иметь различные заголовки на различных
страницах? Вы можете передавать текст заголовка шапке в качестве <link
linkend="language.syntax.attributes">атрибута</link> в момент её включения.
2004-04-14 15:29:09 +00:00
</para>
2005-08-28 16:51:15 +00:00
<example>
2008-01-22 21:04:44 +00:00
<title>Присвоение переменной заголовка (title) шаблону-шапке</title>
2005-08-28 16:51:15 +00:00
<para>
2008-01-22 21:04:44 +00:00
<filename>mainpage.tpl</filename> - когда отображается главная страница,
заголовок <quote>Main Page</quote> передается в
<filename>header.tpl</filename>,
и будет в дальнейшем использован в качестве заголовка.
2005-08-28 16:51:15 +00:00
</para>
<programlisting>
2004-04-14 15:29:09 +00:00
<![CDATA[
2006-03-24 14:45:37 +00:00
{include file='header.tpl' title='Main Page'}
2008-01-22 21:04:44 +00:00
{* тут находится тело шаблона *}
2006-03-24 14:45:37 +00:00
{include file='footer.tpl'}
2005-08-28 16:51:15 +00:00
]]>
</programlisting>
2005-08-28 16:51:15 +00:00
<para>
2008-01-22 21:04:44 +00:00
<filename>archives.tpl</filename> - когда отображается страница архива,
заголовок будет <quote>Archives</quote>.
Обратите внимание, что в этом примере мы
используем переменную из <filename>archives_page.conf</filename>, вместо
того, чтобы жестко прописать её в шаблоне.
2005-08-28 16:51:15 +00:00
</para>
<programlisting>
<![CDATA[
2006-03-24 14:45:37 +00:00
{config_load file='archive_page.conf'}
2008-01-22 21:04:44 +00:00
2006-03-24 14:45:37 +00:00
{include file='header.tpl' title=#archivePageTitle#}
2008-01-22 21:04:44 +00:00
{* тут находится тело шаблона *}
2006-03-24 14:45:37 +00:00
{include file='footer.tpl'}
2005-08-28 16:51:15 +00:00
]]>
</programlisting>
2005-08-28 16:51:15 +00:00
<para>
2008-01-22 21:04:44 +00:00
<filename>header.tpl</filename> - Обратите внимание, что
<quote>Smarty News</quote> отображается тогда, когда $title не задан,
благодаря модификатору
<link linkend="language.modifier.default"><varname>default</varname></link>.
2005-08-28 16:51:15 +00:00
</para>
<programlisting>
<![CDATA[
<html>
<head>
2006-04-21 10:01:03 +00:00
<title>{$title|default:'Smarty News'}</title>
2005-08-28 16:51:15 +00:00
</head>
<body>
]]>
</programlisting>
2005-08-28 16:51:15 +00:00
<para>
<filename>footer.tpl</filename>
</para>
<programlisting>
<![CDATA[
</body>
</html>
2004-04-14 15:29:09 +00:00
]]>
2005-08-28 16:51:15 +00:00
</programlisting>
</example>
</sect1>
<sect1 id="tips.dates">
2008-01-22 21:04:44 +00:00
<title>Даты</title>
2005-08-28 16:51:15 +00:00
<para>
2008-01-22 21:04:44 +00:00
Обычно даты в Smarty всегда передаются как
<ulink url="&url.php-manual;time">временные метки</ulink> (англ. timestamp),
что позволяет проектировщикам шаблонов использовать <link
linkend="language.modifier.date.format"><varname>date_format</varname></link>
для полного контроля над форматированием даты и также делает легким
сравнение дат там, где это необходимо.
2005-08-28 16:51:15 +00:00
</para>
<note>
<para>
2008-01-22 21:04:44 +00:00
Начиная с версии Smarty 1.4.0, вы можете передавать даты в Smarty в виде
меток времени Unix (unix timestamps), mysql, или в любом другом виде,
который понимает функция
2005-08-28 16:51:15 +00:00
<ulink url="&url.php-manual;strtotime">strtotime()</ulink>.
</para>
</note>
<example>
2008-01-22 21:04:44 +00:00
<title>Использование date_format</title>
2005-08-28 16:51:15 +00:00
<programlisting>
2004-03-30 09:16:44 +00:00
<![CDATA[
{$startDate|date_format}
]]>
2005-08-28 16:51:15 +00:00
</programlisting>
<para>
2008-01-22 21:04:44 +00:00
Результат работы:
2005-08-28 16:51:15 +00:00
</para>
<screen>
<![CDATA[
2008-01-22 21:04:44 +00:00
Jan 4, 2009
]]>
2005-08-28 16:51:15 +00:00
</screen>
<programlisting>
<![CDATA[
{$startDate|date_format:"%Y/%m/%d"}
]]>
2005-08-28 16:51:15 +00:00
</programlisting>
<para>
2008-01-22 21:04:44 +00:00
Результат работы:
2005-08-28 16:51:15 +00:00
</para>
<screen>
<![CDATA[
2008-01-22 21:04:44 +00:00
2009/01/04
]]>
2005-08-28 16:51:15 +00:00
</screen>
2008-01-22 21:04:44 +00:00
<para>
Даты можно ставнивать в шаблонах путем сравнения
меток времени следующим образом:
</para>
2005-08-28 16:51:15 +00:00
<programlisting>
<![CDATA[
{if $date1 < $date2}
2008-01-22 21:04:44 +00:00
... делаем что-то полезное ...
2004-03-30 09:16:44 +00:00
{/if}
]]>
2005-08-28 16:51:15 +00:00
</programlisting>
</example>
<para>
2008-01-22 21:04:44 +00:00
Когда <link linkend="language.function.html.select.date">
<varname>{html_select_date}</varname></link>
используется в шаблоне, программист наверняка захочет преобразовать
данные из формы назад в формат временной метки. Вот функция, которая
поможет вам сделать это.
2005-08-28 16:51:15 +00:00
</para>
<example>
2008-01-22 21:04:44 +00:00
<title>Преобразование элементов формы ввода даты назад к временной метке</title>
2005-08-28 16:51:15 +00:00
<programlisting role="php">
2004-04-14 15:29:09 +00:00
<![CDATA[
<?php
2008-01-22 21:04:44 +00:00
// Предполагается, что ваши элементы формы названы
// startDate_Day, startDate_Month, startDate_Year
$startDate = makeTimeStamp($startDate_Year, $startDate_Month, $startDate_Day);
2005-08-28 16:51:15 +00:00
function makeTimeStamp($year='', $month='', $day='')
{
if(empty($year)) {
2008-01-22 21:04:44 +00:00
$year = strftime('%Y');
}
if(empty($month)) {
2008-01-22 21:04:44 +00:00
$month = strftime('%m');
}
if(empty($day)) {
2008-01-22 21:04:44 +00:00
$day = strftime('%d');
}
return mktime(0, 0, 0, $month, $day, $year);
}
?>
2004-04-14 15:29:09 +00:00
]]>
2005-08-28 16:51:15 +00:00
</programlisting>
</example>
<para>
2008-01-22 21:04:44 +00:00
См. также
<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>
2005-08-28 16:51:15 +00:00
</para>
</sect1>
<sect1 id="tips.wap">
<title>WAP/WML</title>
<para>
2008-01-22 21:04:44 +00:00
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> не кэшируются!
Убедитесь, что перед шаблоном в браузер ничего не выводится,
иначе отправить заголовок не получится.
2005-08-28 16:51:15 +00:00
</para>
<example>
2008-01-22 21:04:44 +00:00
<title>Использование {insert} для отправки заголовка Content-Type для WML</title>
2005-08-28 16:51:15 +00:00
<programlisting role="php">
2004-04-14 15:29:09 +00:00
<![CDATA[
<?php
2008-01-22 21:04:44 +00:00
// убедитесь, что apache настроен на обработку расширений .wml!
// добавьте эту функцию в своё приложение или в Smarty.addons.php
2004-11-25 23:07:24 +00:00
function insert_header($params)
{
2008-01-22 21:04:44 +00:00
// эта функция ожидает аргумент $content
if (empty($params['content'])) {
return;
}
header($params['content']);
return;
}
?>
]]>
2005-08-28 16:51:15 +00:00
</programlisting>
<para>
2008-01-22 21:04:44 +00:00
ваш шаблон Smarty <emphasis>должен</emphasis> начинаться с тэга insert:
2005-08-28 16:51:15 +00:00
</para>
<programlisting>
<![CDATA[
{insert name=header content="Content-Type: text/vnd.wap.wml"}
2004-11-25 23:07:24 +00:00
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
2004-04-14 15:29:09 +00:00
2004-11-25 23:07:24 +00:00
<!-- 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>
2004-04-14 15:29:09 +00:00
</wml>
]]>
2005-08-28 16:51:15 +00:00
</programlisting>
</example>
</sect1>
<sect1 id="tips.componentized.templates">
2008-01-22 21:04:44 +00:00
<title>Составные шаблоны</title>
2005-08-28 16:51:15 +00:00
<para>
2008-01-22 21:04:44 +00:00
По традиции, программирование шаблонов в вашем приложении идёт следующим
путём: Сначала вы формируете переменные внутри вашего приложения PHP
(возможно, используя запросы к базе данных). Затем вы создаёте экземпляр
объекта Smarty,
<link linkend="api.assign">назначаете</link> переменные и
<link linkend="api.display">отображаете</link> шаблон.
Давайте представим себе такую ситуацию: К примеру, у нас есть котировщик
ценных бумаг в нашем шаблоне. Мы собираем данные о котировках ценных бумаг
в нашем приложении, затем передаём эти переменные в шаблон и отображаем
его. Правда, было бы здорово, если бы этот котировщик можно было перенести
в другое приложение, просто подключив к нему шаблон, не беспокоясь об
источнике данных.
2005-08-28 16:51:15 +00:00
</para>
<para>
2008-01-22 21:04:44 +00:00
Вы можете сделать это, написав собственное расширение для получения
данных и присваивания их переменной шаблона.
2005-08-28 16:51:15 +00:00
</para>
<example>
2008-01-22 21:04:44 +00:00
<title>составной шаблон</title>
<para>
2005-08-28 16:51:15 +00:00
<filename>function.load_ticker.php</filename> -
2008-01-22 21:04:44 +00:00
поместите файл в
<link linkend="variable.plugins.dir">
<parameter>директорию $plugins</parameter></link>
</para>
2005-08-28 16:51:15 +00:00
<programlisting role="php">
2004-03-30 09:35:30 +00:00
<![CDATA[
<?php
2008-01-22 21:04:44 +00:00
// настраиваем нашу функцию для получения информации о ценных бумагах
2004-11-25 23:07:24 +00:00
function fetch_ticker($symbol)
{
2008-01-22 21:04:44 +00:00
// здесь находится логика формирования $ticker_info
// из какого-то источника
return $ticker_info;
}
2004-11-25 23:07:24 +00:00
function smarty_function_load_ticker($params, &$smarty)
{
2008-01-22 21:04:44 +00:00
// вызываем функцию
$ticker_info = fetch_ticker($params['symbol']);
2004-11-25 23:07:24 +00:00
2008-01-22 21:04:44 +00:00
// присваиваем переменную шаблона
$smarty->assign($params['assign'], $ticker_info);
}
?>
]]>
2005-08-28 16:51:15 +00:00
</programlisting>
<para>
<filename>index.tpl</filename>
</para>
<programlisting>
2004-03-30 09:35:30 +00:00
<![CDATA[
2006-04-21 10:01:03 +00:00
{load_ticker symbol='SMARTY' assign='ticker'}
2005-08-28 16:51:15 +00:00
Stock Name: {$ticker.name} Stock Price: {$ticker.price}
]]>
2005-08-28 16:51:15 +00:00
</programlisting>
</example>
<para>
2008-01-22 21:04:44 +00:00
См. также
<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>.
2005-08-28 16:51:15 +00:00
</para>
</sect1>
<sect1 id="tips.obfuscating.email">
2008-01-22 21:04:44 +00:00
<title>Сокрытие E-mail адреса</title>
2005-08-28 16:51:15 +00:00
<para>
2008-01-22 21:04:44 +00:00
Вы когда-нибудь удивлялись, как ваш e-mail адрес попадает в такое
количество спамерских рассылок? Один из способов сбора e-mail адресов
заключается в просмотре веб-страниц. Чтобы помочь предотвратить эту
проблему, вы можете сделать так, чотбы ваш e-mail адрес отображался
в скрытом за javascript'ом виде в HTML-исходниках, в то же время
выглядя и работая корректно в браузере. Это можно совершить при помощи
расширения <link linkend="language.function.mailto">
<varname>{mailto}</varname></link>.
2005-08-28 16:51:15 +00:00
</para>
<example>
2008-01-22 21:04:44 +00:00
<title>Пример сокрытия e-mail адреса в шаблоне</title>
2005-08-28 16:51:15 +00:00
<programlisting>
2004-04-14 15:29:09 +00:00
<![CDATA[
2008-01-22 21:04:44 +00:00
Вопросы направляйте по адресу
{mailto address=$EmailAddress encode="javascript" subject="Hello"}
2004-04-14 15:29:09 +00:00
]]>
2005-08-28 16:51:15 +00:00
</programlisting>
</example>
<note>
2008-01-22 21:04:44 +00:00
<title>Техническое Замечание</title>
2005-08-28 16:51:15 +00:00
<para>
2008-01-22 21:04:44 +00:00
Этот метод не может гарантировать 100% защиты.
Существует вероятность, что спамер запрограммирует свой
сборщик e-mail адресов на раскодирование этих значений,
но это маловероятно...
будем надеяться... пока что...
куда я там дел свой квантовый компьютер :-?.
2005-08-28 16:51:15 +00:00
</para>
</note>
<para>
2008-01-22 21:04:44 +00:00
См. также модификатор
<link linkend="language.modifier.escape"><varname>escape</varname></link> и
<link linkend="language.function.mailto"><varname>{mailto}</varname></link>.
2005-08-28 16:51:15 +00:00
</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
-->