mirror of
https://github.com/smarty-php/smarty.git
synced 2025-11-11 17:43:50 +01:00
458 lines
17 KiB
XML
458 lines
17 KiB
XML
<?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>&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>Вывод &nbsp;, если переменная пуста</title>
|
||
<programlisting>
|
||
<![CDATA[
|
||
{* длинный путь *}
|
||
{if $title eq ''}
|
||
|
||
{else}
|
||
{$title}
|
||
{/if}
|
||
|
||
|
||
{* короткий путь *}
|
||
{$title|default:' '}
|
||
]]>
|
||
</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
|
||
-->
|