Files
smarty/docs/ru/appendixes/tips.xml
2006-04-21 10:01:03 +00:00

426 lines
12 KiB
XML

<?xml version="1.0" encoding="windows-1251"?>
<!-- $Revision$ -->
<!-- EN-Revision: 1.11 Maintainer: freespace Status: ready -->
<chapter id="tips">
<title>Ñîâåòû</title>
<para></para>
<sect1 id="tips.blank.var.handling">
<title>Îáðàáîòêà ïóñòûõ ïåðåìåííûõ</title>
<para>
Èíîãäà, íàïðèìåð, äëÿ òîãî ÷òîáû ôîí òàáëèöû ðàáîòàë êîððåêòíî,
íåîáõîäèìî âûâåñòè âìåñòî ïóñòîãî çíà÷åíèÿ ïåðåìåííîé, çíà÷åíèå
ïî óìîë÷àíèþ "&amp;nbsp;". Ìíîãèå áû èñïîëüçîâàëè êîíñòðóêöèþ
<link linkend="language.function.if">{if}</link>,
íî â Smatry åñòü áîëåå êîðîòêèé ïóòü - èñïîëüçóÿ ìîäèôèêàòîð ïåðåìåííîé
<link
linkend="language.modifier.default"><emphasis>default</emphasis></link>.
</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>
Åñëè ïåðåìåííàÿ âñòðå÷àåòñÿ ÷àñòî, òî èñïîëüçîâàíèå ìîäèôèêàòîðà
default êàæäûé ðàç ìîæíî èçáåæàòü, èñïîëüçóÿ ôóíêöèþ
<link linkend="language.function.assign">{assign}</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">default</link> è
<link linkend="tips.blank.var.handling">Îáðàáîòêà ïóñòûõ ïåðåìåííûõ</link>.
</para>
</sect1>
<sect1 id="tips.passing.vars">
<title>Ïðèñâîåíèå ïåðåìåííîé çàãîëîâêà (title) øàáëîíó-øàïêå</title>
<para>
Åñëè áîëüøèíñòâî âàøèõ øàáëîíîâ èìåþò ïîõîæèå âåðõíèå è íèæíèå
÷àñòè, òî èìååò ñìûñë âûíåñòè èõ â îòäåëüíûå ôàéëû. Íî êàê áûòü, åñëè
øàïêà äîëæíà èìåòü ðàçëè÷íûå çàãîëîâêè íà ðàçëè÷íûõ ñòðàíèöàõ?
Âû ìîæåòå ïåðåäàâàòü òåêñò çàãîëîâêà øàïêå â êà÷åñòâå <link
linkend="language.syntax.attributes">àòðèáóòà</link> â ìîìåíò å¸ âêëþ÷åíèÿ.
</para>
<example>
<title>Ïðèñâîåíèå ïåðåìåííîé çàãîëîâêà (title) øàáëîíó-øàïêå</title>
<para>
<filename>mainpage.tpl</filename> - êîãäà îòîáðàæàåòñÿ ãëàâíàÿ ñòðàíèöà,
çàãîëîâîê "Main Page" ïåðåäàåòñÿ â <filename>header.tpl</filename>,
è áóäåò â ïîñëåäñòâèè èñïîëüçîâàí â êà÷åñòâå çàãîëîâêà.
</para>
<programlisting>
<![CDATA[
{include file='header.tpl' title='Main Page'}
{* òóò íàõîäèòñÿ òåëî øàáëîíà *}
{include file='footer.tpl'}
]]>
</programlisting>
<para>
<filename>archives.tpl</filename> - êîãäà îòîáðàæàåòñÿ ñòðàíèöà àðõèâà,
çàãîëîâîê áóäåò "Archives". Îáðàòèòå âíèìàíèå, ÷òî â ýòîì ïðèìåðå ìû
èñïîëüçóåì ïåðåìåííóþ èç <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> - Îáðàòèòå âíèìàíèå, ÷òî "Smarty News"
îòîáðàæàåòñÿ òîãäà, êîãäà $title íå çàäàí, áëàãîäàðÿ ìîäèôèêàòîðó
<link linkend="language.modifier.default">default</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>, ÷òî
ïîçâîëÿåò ïðîåêòèðîâùèêàì øàáëîíîâ èñïîëüçîâàòü <link
linkend="language.modifier.date.format">date_format</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>using date_format</title>
<programlisting>
<![CDATA[
{$startDate|date_format}
]]>
</programlisting>
<para>
Ðåçóëüòàò ðàáîòû:
</para>
<screen>
<![CDATA[
Jan 4, 2001
]]>
</screen>
<programlisting>
<![CDATA[
{$startDate|date_format:"%Y/%m/%d"}
]]>
</programlisting>
<para>
Ðåçóëüòàò ðàáîòû:
</para>
<screen>
<![CDATA[
2001/01/04
]]>
</screen>
<programlisting>
<![CDATA[
{if $date1 < $date2}
...
{/if}
]]>
</programlisting>
</example>
<para>
Êîãäà <link
linkend="language.function.html.select.date">{html_select_date}</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">{html_select_date}</link>,
<link linkend="language.function.html.select.time">{html_select_time}</link>,
<link linkend="language.modifier.date.format">date_format</link> è
<link linkend="language.variables.smarty.now">$smarty.now</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">{insert}</link>;
íå çàáûâàéòå, ÷òî òýãè {insert} íå êýøèðóþòñÿ!
Óáåäèòåñü, ÷òî ïåðåä øàáëîíîì â áðàóçåð íè÷åãî íå âûâîäèòñÿ,
èíà÷å îòïðàâèòü çàãîëîâîê íå ïîëó÷èòñÿ.
</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, íàçíà÷àåòå ïåðåìåííûå è îòîáðàæàåòå øàáëîí.
Äàâàéòå ïðåäñòàâèì ñåáå òàêóþ ñèòóàöèþ: Ê ïðèìåðó, ó íàñ åñòü êîòèðîâùèê
öåííûõ áóìàã â íàøåì øàáëîíå. Ìû ñîáèðàåì äàííûå î êîòèðîâêàõ öåííûõ áóìàã
â íàøåì ïðèëîæåíèè, çàòåì ïåðåäà¸ì ýòè ïåðåìåííûå â øàáëîí è îòîáðàæàåì
åãî. Ïðàâäà, áûëî áû çäîðîâî, åñëè áû ýòîò êîòèðîâùèê ìîæíî áûëî ïåðåíåñòè
â äðóãîå ïðèëîæåíèå, ïðîñòî ïîäêëþ÷èâ ê íåìó øàáëîí, íå áåñïîêîÿñü îá
èñòî÷íèêå äàííûõ.
</para>
<para>
Âû ìîæåòå ñäåëàòü ýòî, íàïèñàâ ñîáñòâåííîå ðàñøèðåíèå äëÿ ïîëó÷åíèÿ
äàííûõ è ïðèñâàèâàíèÿ èõ ïåðåìåííîé øàáëîíà.
</para>
<example>
<title>ñîñòàâíîé øàáëîí</title>
<para>
<filename>function.load_ticker.php</filename> -
ïîìåñòèòå ôàéë â
<link linkend="variable.plugins.dir">äèðåêòîðèþ $plugins</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">{include_php}</link>,
<link linkend="language.function.include">{include}</link> è
<link linkend="language.function.php">{php}</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">{mailto}</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">escape</link> è
<link linkend="language.function.mailto">{mailto}</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
-->