Files
smarty/docs/ja/appendixes/tips.xml
2008-05-26 08:47:23 +00:00

454 lines
15 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 2598 Maintainer: takagi Status: ready -->
<!-- CREDITS: mat-sh,daichi,joe -->
<chapter id="tips">
<title>ヒント &amp; 裏ワザ</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>
{if}ステートメントを使用すると思いますが、Smartyによる変数の修飾子
<link linkend="language.modifier.default"><varname>default</varname>
</link> を使った簡略な方法があります。
<note>
<para><quote>Undefined variable</quote> というエラーが表示されるのは、
PHP の <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">
<varname>default</varname></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>
<para>
テンプレートの大半が同じヘッダ及びフッタを使用する場合は、それらを単体のテンプレートに分割して
<link linkend="language.function.include">
<varname>{include}</varname></link> するのが普通です。
しかしどのページから呼び出されたかによって、
そのヘッダに異なるタイトルを持たせる必要があるとすればどうなるでしょうか?
インクルードされる際に、タイトルを
<link linkend="language.syntax.attributes">属性</link>
としてヘッダに渡す事ができます。
</para>
<example>
<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> - <literal>$title</literal> 変数が設定されていない場合に、
<quote>Smarty News</quote> と表示します。これは
<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>
にしておくことをお勧めします。これにより、テンプレートデザイナーは
<link linkend="language.modifier.date.format"><varname>date_format</varname>
</link> 修飾子で日付の書式を自由にコントロールできるようになります。
また、必要なら日付の比較も簡単に行えます。
</para>
<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 $order_date < $invoice_date}
...何かを行います
{/if}
]]>
</programlisting>
</example>
<para>
テンプレートで <link linkend="language.function.html.select.date">
<varname>{html_select_date}</varname></link> を使用する場合、
おそらくプログラマはフォームからの出力をタイムスタンプ型に変換したいでしょう。
それを行うのに役立つ関数を次に示します。
</para>
<example>
<title>フォームの日付要素をUNIXタイムスタンプ型に変換する</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 テンプレートはテンプレートコンテンツに加え、php
によって <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>WML Content-Type ヘッダを出力するために {insert} を使用する</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 テンプレートは、次のように 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">
<!-- 新しい wml のデッキ -->
<wml>
<!-- 最初のカード -->
<card>
<do type="accept">
<go href="#two"/>
</do>
<p>
Smarty 版の WAP へようこそ!
OK を押すと次に進みます……
</p>
</card>
<!-- 二枚目のカード -->
<card id="two">
<p>
どう?簡単でしょ?
</p>
</card>
</wml>
]]>
</programlisting>
</example>
</sect1>
<sect1 id="tips.componentized.templates">
<title>コンポーネント化したテンプレート</title>
<para>
習慣的に、アプリケーションにテンプレートをプログラミングする手順は次のように進みます。
はじめに php アプリケーションにおいて変数を蓄積します
(おそらくデータベースのクエリーによって)。それから Smarty
オブジェクトのインスタンスを作成して変数を割り当て
(<link linkend="api.assign"><varname>assign()</varname></link>)、
テンプレートを表示 (<link linkend="api.display"><varname>display()</varname></link>)
します。仮に株式相場表示を行うテンプレートがあったとしましょう。
これは php アプリケーションにより株式情報のデータを収集し、
テンプレートにこれらの変数を割り当てて表示します。
もし、前もってデータを取得する事を気にせずに、
テンプレートを単にインクルードする事で株式相場表示をアプリケーションに追加できれば良いと思いませんか?
</para>
<para>
これは、内容をフェッチし、テンプレート変数に割り当てるための
カスタムプラグインを書くことで実現できます
</para>
<example>
<title>コンポーネント化したテンプレート</title>
<para>
<filename>function.load_ticker.php</filename> -
このファイルを
<link linkend="variable.plugins.dir">
<parameter>プラグインのディレクトリ</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'}
銘柄: {$ticker.name} 株価: {$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 アドレスが多数のスパムメーリングリストにどのように載るのか
不思議に思った事はありませんか?その一つの方法として、スパム発信者は web ページ上の
E-mail アドレスを収集しています。この問題に対抗するために、E-mail アドレスが HTML
ソース内では混乱した JavaScript に見えるがブラウザでは正しく表示されるという方法が使えます。
これは <link linkend="language.function.mailto"><varname>{mailto}</varname></link>
プラグインによって行われます。
</para>
<example>
<title>E-mail アドレスを混乱させる例</title>
<programlisting>
<![CDATA[
<div id="contact">
{mailto address=$EmailAddress encode='javascript' subject='Hello'} に問い合わせを送る
</div>
]]>
</programlisting>
</example>
<note>
<title>テクニカルノート</title>
<para>
この方法は 100% 確実という訳ではありません。
もしかしたらスパム発信者はこれらの値を解読するためのコードを書くかもしれません。
ですがそれはまず有り得ないでしょう……
おそらく……
今のところは……
量子コンピュータってどうなったんでしょう :-?
</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
-->