<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>Smartyをはじめよう！</title>
    <link rel="alternate" type="text/html" href="http://smarty.karakuriya.biz/" />
    <link rel="self" type="application/atom+xml" href="http://smarty.karakuriya.biz/atom.xml" />
   <id>tag:smarty.karakuriya.biz,2008://4</id>
    <link rel="service.post" type="application/atom+xml" href="http://www.karakuriya.biz/mt/mt-atom.cgi/weblog/blog_id=4" title="Smartyをはじめよう！" />
    <updated>2006-05-16T03:03:45Z</updated>
    <subtitle>SmartyはPHPのテンプレートエンジンです。</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type  3.2-ja-2</generator>
 
<entry>
    <title>プラグインはとても便利</title>
    <link rel="alternate" type="text/html" href="http://smarty.karakuriya.biz/cat36/000428.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.karakuriya.biz/mt/mt-atom.cgi/weblog/blog_id=4/entry_id=428" title="プラグインはとても便利" />
    <id>tag:smarty.karakuriya.biz,2006://4.428</id>
    
    <published>2006-05-16T02:49:25Z</published>
    <updated>2006-05-16T03:03:45Z</updated>
    
    <summary>カンマ編集のみならず、プラグインはとてもｌ便利です。 値はこうだけど、画面上はこ...</summary>
    <author>
        <name>H.Imai</name>
        
    </author>
            <category term="　４．変数の修正子" />
    
    <content type="html" xml:lang="ja" xml:base="http://smarty.karakuriya.biz/">
        <![CDATA[カンマ編集のみならず、プラグインはとてもｌ便利です。

値はこうだけど、画面上はこう出したい！

って時は、プラグインがおすすめです。

例えば、データとして、１は男、２は女だった場合、次のようなプラグインを作っておけばいいわけです。

<blockquote><pre>
function smarty_modifier_sex($sex)
{
	if ($sex == 1) return "男";
	if ($sex == 2) return "女";
	return "";
}
</pre>
</blockquote>]]>
        <![CDATA[また、エラーメッセージを表示する場合、赤く太字で出したいもの。となると、div なり span なりでエラーメッセージを囲みます。でも、エラーがない時は、エラーメッセージは出ないわけで、div も span も必要ありません。

エラーメッセージがある時だけ、その前後に div を付けたい！

これも作ってしまえばいいわけです。

modifier.strcat.php
<blockquote><pre>
function smarty_modifier_strcat($str,$before,$after)
{
	if ($str == null) return "";
	if ($str == "") return "";

	return $before.$str.$after;
}
</pre>
</blockquote>

これで、文字列が空でなかったら、前後に指定した文字列が付きます。プラグインには、複数の値（引数）を渡すことが出来ます。

で、テンプレートのほうは、

<blockquote>{$errormsg|escape|strcat<strong>:</strong>"&lt;div class=\"error\"&gt;"<strong>:</strong>"&lt;/div&gt;"|default:""}
</blockquote>

と書きます。関数の最初の引数は <strong>|</strong> で流れてきます。前後につける文字、つまり、２番目と３番目の引数になる文字は、<strong>：</strong>で区切って書きます。

と、いうことで、自作のプラグインで、まずます、PHPプログラムのほうも簡潔になります。]]>
    </content>
</entry>
<entry>
    <title>カンマ編集プラグインの作り方</title>
    <link rel="alternate" type="text/html" href="http://smarty.karakuriya.biz/cat36/000427.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.karakuriya.biz/mt/mt-atom.cgi/weblog/blog_id=4/entry_id=427" title="カンマ編集プラグインの作り方" />
    <id>tag:smarty.karakuriya.biz,2006://4.427</id>
    
    <published>2006-05-16T02:39:42Z</published>
    <updated>2006-05-16T02:48:14Z</updated>
    
    <summary>では、実際に作ってみましょう。 テンプレートの中では {$price|kanma...</summary>
    <author>
        <name>H.Imai</name>
        
    </author>
            <category term="　４．変数の修正子" />
    
    <content type="html" xml:lang="ja" xml:base="http://smarty.karakuriya.biz/">
        <![CDATA[では、実際に作ってみましょう。

テンプレートの中では

<blockquote>
{$price|<strong>kanma</strong>}
</blockquote>

と使うことにしましょう。作る修正子の名前は「kannma」です。

まず、ファイル名ですが、

<blockquote>modifier.修正子の名前.php</blockquote>

になります。なので、今回の場合は、<strong>modifier.kanma.php</strong> です。

次に関数名ですが、

<blockquote>smarty_modifier_修正子名</blockquote>

になります。なので、今回は、<strong>smarty_modifier_kanma</strong> です。

この関数の中で、値をもらって、カンマ編集して返してあげればいいわけで

]]>
        <![CDATA[
modifier.kanma.php

<blockquote><pre>
function smarty_modifier_kanma($val)
{
    return number_format($val);
}
</pre></blockquote>

となります。これを plugins フォルダの中に作っておくだけです。

これで、テンプレートの中では

<blockquote>
{$price|<strong>kanma</strong>}
</blockquote>

として使えます。
]]>
    </content>
</entry>
<entry>
    <title>カンマ編集って面倒じゃない？（プラグインのススメ）</title>
    <link rel="alternate" type="text/html" href="http://smarty.karakuriya.biz/cat36/000426.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.karakuriya.biz/mt/mt-atom.cgi/weblog/blog_id=4/entry_id=426" title="カンマ編集って面倒じゃない？（プラグインのススメ）" />
    <id>tag:smarty.karakuriya.biz,2006://4.426</id>
    
    <published>2006-05-16T02:23:46Z</published>
    <updated>2006-05-16T02:39:07Z</updated>
    
    <summary>すっかり更新が止まってました。はよ書け！と、突っ込みまで頂きました（汗）。 金額...</summary>
    <author>
        <name>H.Imai</name>
        
    </author>
            <category term="　４．変数の修正子" />
    
    <content type="html" xml:lang="ja" xml:base="http://smarty.karakuriya.biz/">
        <![CDATA[すっかり更新が止まってました。はよ書け！と、突っ込みまで頂きました（汗）。

金額などはよく、カンマ編集して表示します。カンマ編集自体は、PHPの <strong>number_format</strong> 関数を使えばなんてことないんですが、カンマ編集した値は計算には使えないので、表示用に、カンマ編集した値も別途必要になります。

１つの値に２つの変数が要るわけで、変数名をどうするか？例えば、$price と $price_str にしようかとか。。。

これを考えるだけでも、メンドイ。プログラムの関数の中で、引数で２つ渡すべきか、それぞれの関数の中で編集するかとか。。。。あぁ～、メンドイ。

と、Smartyの修正子を見ても、あってもよさそうなカンマ編集がない。

こんなときは、]]>
        <![CDATA[自分で、修正子を作ってしまおう！！

作り方さえわかれば、簡単に作れます。Smartyで言うところの、<strong>プラグイン</strong>と言うものになります。

Smartyをインストールしたフォルダに <strong>plugins</strong> というフォルダがあります。ここに標準のプラグインが入っています。今まで修正子と呼んでたものは、プラグインという形で、最初からここに入っています。これもPHPの簡単な関数なので、それを参考に作っていきます。

まだ、私は修正子のプラグインしか作ったことがないのですが（汗）

modifier.nl2br.php というファイルがあります。これは、<a href="http://smarty.karakuriya.biz/cat36/000387.html">前述したnl2br</a>です。

中身を見てみましょう。たった４行の関数です。それも、return nl2br($string); してるだけ。これだけなんです。

ファイル名や関数名には決まりがあるので、その決まりを守っていけばOKです。
]]>
    </content>
</entry>
<entry>
    <title>修正子を連結して使う</title>
    <link rel="alternate" type="text/html" href="http://smarty.karakuriya.biz/cat36/000399.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.karakuriya.biz/mt/mt-atom.cgi/weblog/blog_id=4/entry_id=399" title="修正子を連結して使う" />
    <id>tag:smarty.karakuriya.biz,2006://4.399</id>
    
    <published>2006-03-23T03:46:06Z</published>
    <updated>2006-04-27T08:08:47Z</updated>
    
    <summary>修正子はそれ単体でも使えます（当然です）が、通常は複数の修正子を使います。 例え...</summary>
    <author>
        <name>H.Imai</name>
        
    </author>
            <category term="　４．変数の修正子" />
    
    <content type="html" xml:lang="ja" xml:base="http://smarty.karakuriya.biz/">
        <![CDATA[修正子はそれ単体でも使えます（当然です）が、通常は複数の修正子を使います。

例えば、input タグで入力された内容を、確認画面でそのまま表示する場合、エスケープしないといけない文字（&lt;、&gt; など）が入力されることもあります。
この場合、入力された文字をそのまま表示するには、<strong>escape</strong> が必要です。しかも、未入力の場合は「＊未入力」と表示したい場合には、<strong>default</strong> も使います。

このような場合は、次のように書きます。

<blockquote>
{$str|escape<strong>|</strong>default:"＊未入力"}
</blockquote>]]>
        <![CDATA[修正子を複数使う場合は <strong>|</strong> でつなげて書きます。

textarea で複数行入力の場合は、改行文字も変換してあげないといけないので、

<blockquote>
{$str|escape<strong>|</strong>nl2br<strong>|</strong>default:"＊未入力"}
</blockquote>

と書きます。

修正子は左から評価されます。なので、まず、文字をエスケープして、その結果改行文字を置き換えて、その結果空だったら「＊未入力」を出すといった具合です。
この順番は大切です。順番を間違えて

<blockquote>
{$str|<strong>nl2br</strong>|<strong>escape</strong>|default:"＊未入力"}
</blockquote>

と書いてしまうと、まず改行文字が &lt;br /&gt; に置き換えられて、それがエスケープされるので、実際には改行されずに &lt;br /&gt; と表示されてしまいます。]]>
    </content>
</entry>
<entry>
    <title><![CDATA[nl2br：改行文字を &lt;br /&gt;に変換]]></title>
    <link rel="alternate" type="text/html" href="http://smarty.karakuriya.biz/cat36/000387.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.karakuriya.biz/mt/mt-atom.cgi/weblog/blog_id=4/entry_id=387" title="nl2br：改行文字を &amp;lt;br /&amp;gt;に変換" />
    <id>tag:smarty.karakuriya.biz,2006://4.387</id>
    
    <published>2006-03-08T09:28:50Z</published>
    <updated>2006-04-27T08:08:46Z</updated>
    
    <summary>textareaで複数行入力すると、必ずと言っていいほど「改行」されます。これを...</summary>
    <author>
        <name>H.Imai</name>
        
    </author>
            <category term="　４．変数の修正子" />
    
    <content type="html" xml:lang="ja" xml:base="http://smarty.karakuriya.biz/">
        <![CDATA[textareaで複数行入力すると、必ずと言っていいほど「<strong>改行</strong>」されます。これをこのまま表示しても改行されません。HTMLの改行は <strong>&lt;br /&gt;</strong> なので、HTML上で改行させるには、これに変換しないといけません。

PHPには便利な関数があって、<strong>nl2br()</strong> を使って、改行文字を &lt;br /&gt; に変換できます。通常はこれを使って表示すればいいのですが、まったく同じ機能がSmartyにもあります。それが、 <strong>nl2br</strong> です。

<blockquote>
{$str|<strong>nl2br</strong>}
</blockquote>

で、勝手に改行してくれます。]]>
        <![CDATA[nl2br も、前述の default や escape とともに、非常によく使います。
言ってしまえば、この３つを組み合わせて使います。たいがい、３点セットで使えば、ほとんどは、思い通りの表示になります。

注意しないといけないのは、&lt;input&gt;　タグの value や、&lt;textarea&gt; で指定する場合です。これらの場合で nl2br を使ってしまうと、改行が &lt;br /&gt; に変換されてしまい、正しい値を表示できません。

これは（たぶん）間違い

<blockquote>&lt;textarea name="xxx"&gt;{$str|nl2br}&lt;/textarea&gt;
</blockquote>

この場合は、 nr2br は使わないようにしましょう。]]>
    </content>
</entry>
<entry>
    <title><![CDATA[escape：&lt;や&gt;をそのまま表示]]></title>
    <link rel="alternate" type="text/html" href="http://smarty.karakuriya.biz/cat36/000384.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.karakuriya.biz/mt/mt-atom.cgi/weblog/blog_id=4/entry_id=384" title="escape：&amp;lt;や&amp;gt;をそのまま表示" />
    <id>tag:smarty.karakuriya.biz,2006://4.384</id>
    
    <published>2006-03-03T00:47:46Z</published>
    <updated>2006-04-27T08:08:46Z</updated>
    
    <summary><![CDATA[ を表示しようとする時は、&lt; や &gt; とわざわざ変換してやらないといけないんですが、escapeを使うと、その変換をしてくれます。]]></summary>
    <author>
        <name>H.Imai</name>
        
    </author>
            <category term="　４．変数の修正子" />
    
    <content type="html" xml:lang="ja" xml:base="http://smarty.karakuriya.biz/">
        <![CDATA[&lt; や &gt; を表示しようとする時は、&amp;lt; や &amp;gt; とわざわざ変換してやらないといけないんですが、<strong>escape</strong>を使うと、その変換をしてくれます。

<blockquote>
<pre>
$str = "&lt;b&gt;太字&lt;/b&gt;";
$smarty = new Smarty;
$smarty->assign("str",$str);
$smarty->display('index.html')
</pre>
</blockquote>

とPHPでは、値をそのまま渡して、テンプレートのほうで

<blockquote>
{$str|<strong>escape</strong>}
</blockquote>

と書けば、出力結果は

<blockquote>&lt;b&gt;太字&lt;/b&gt;
</blockquote>

となります。この種の変換はいちいち面倒なので、かなり重宝します。

escapeしなければ、&lt;b&gt;　はそのままタグとして、<b>太字</b> と表示されます。]]>
        <![CDATA[escapeには、上記のような、HTMLエスケープだけではなく、もっと他の変換も出来ます。

よく使うであろうと思うのが、メールアドレスやURLの変換です。

ホームページにはメールアドレスの表示は不可欠（これがないと訪問者はお問合せが出来ない）なんですが、これらを収集する業者もいます。
知らないところから来るスパムメールもこの種の収集で集められたメールアドレスに一斉に送信してます。

これを<strong>収集されにくくする</strong>ために、<strong>HTMLエンティティ</strong>というものがあります。HTML上はエンティティされた文字なので、何が書いてあるかわかりませんが、ブラウザで表示する時は、ちゃんと表示されます。

HTMLエンティティ表記にする場合は、<strong>escape:hexentity</strong> と書きます。

<blockquote>&lt;a href="{$mail|escape:hexentity}"&gt;{$mail|escape:hexentity&lt;/a&gt;
</blockquote>

と書きます。
エンティティは16進で行われるので、古いブラウザだと対応していないかもしれません。

HTMLでメールアドレスを表示するだけの場合は、最初からエンティティ表記の文字をHTMLに書いちゃえばいいです。
変換はこっちで出来ます。
<a href="http://tools.karakuriya.biz/entities.php">HTMLエンティティ変換</a>

上のSmartyのテンプレートを使ってます。]]>
    </content>
</entry>
<entry>
    <title>default：空文字の場合の表示の指定</title>
    <link rel="alternate" type="text/html" href="http://smarty.karakuriya.biz/cat36/000372.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.karakuriya.biz/mt/mt-atom.cgi/weblog/blog_id=4/entry_id=372" title="default：空文字の場合の表示の指定" />
    <id>tag:smarty.karakuriya.biz,2006://4.372</id>
    
    <published>2006-02-22T02:10:09Z</published>
    <updated>2006-04-27T08:08:46Z</updated>
    
    <summary>表示する内容が空文字の場合、defaultを使います。</summary>
    <author>
        <name>H.Imai</name>
        
    </author>
            <category term="　４．変数の修正子" />
    
    <content type="html" xml:lang="ja" xml:base="http://smarty.karakuriya.biz/">
        <![CDATA[表示する内容が空文字の場合はよくあります。任意登録の項目は往々にして何も入力しない場合が多いです。
その場合、それをそのまま出すと、表示的によろしくない場合があります。
また、未登録の場合は「未登録」と明示的に表示したい場合もあります。

今までは、これらの処理はPHPでやってました。

<blockquote>
<pre>
if ($mail == "")
    $dispmail = "<メールアドレスは登録されていません>";
else
    $dispmail = $mail;
</pre>
</blockquote>

今までの話だと、Smartyで表示する場合も同じようなものです。

ここで使うのが <strong>default</strong> です。]]>
        <![CDATA[空文字の場合どうするかは、テンプレート側でやっちゃいます。

なので、PHPのほうは、そんなことは何も意識せずに

<blockquote>
<pre>
$smarty = new Smarty;
$smarty->assign("mail",$mail);
$smarty->display('index.html')
</pre>
</blockquote>

と $mail をそのままテンプレートに渡します。PHPコードがまたすっきり！

テンプレートでは

<blockquote>
<pre>
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;メールアドレス&lt;/td&gt;
&lt;td&gt;{$mail|<strong>default</strong>:"&lt;メールアドレスは登録されていません&gt;"}&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
</pre>
</blockquote>

と書きます。
表示する変数を修正子（default のこと）は、<strong>|</strong> （パイプ）でつなぎます。
defaultの後ろに、<strong>;</strong> （セミコロン）をつけ、{$mail}が空文字だった時の表示する文字を書きます。この中に、HTMLのタグを書くことも可能です。

PHPのほうは、値をテンプレートに渡すだけなので、表示のための編集作業も要らないし、編集した値を保持するための余計な変数も要りません。すっきりです（何度言ったことか…）
テンプレートのほうは、いちいちPHPを見なくても、空文字の場合はこう出るんだ！とすぐに確認できるし、変更も楽にできます。]]>
    </content>
</entry>
<entry>
    <title>表示に関する部分は出来るだけテンプレートで</title>
    <link rel="alternate" type="text/html" href="http://smarty.karakuriya.biz/cat36/000371.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.karakuriya.biz/mt/mt-atom.cgi/weblog/blog_id=4/entry_id=371" title="表示に関する部分は出来るだけテンプレートで" />
    <id>tag:smarty.karakuriya.biz,2006://4.371</id>
    
    <published>2006-02-21T00:54:32Z</published>
    <updated>2006-04-27T08:08:46Z</updated>
    
    <summary>表示に関する部分は、PHP側では表示のたけの編集は行わず、出来るだけテンプレートで行います。</summary>
    <author>
        <name>H.Imai</name>
        
    </author>
            <category term="　４．変数の修正子" />
    
    <content type="html" xml:lang="ja" xml:base="http://smarty.karakuriya.biz/">
        <![CDATA[テンプレートでPHPからの値を表示するには <strong>{$name}</strong> と書きます。また、連想配列で値を渡す場合は <strong>{$member.name}</strong> のように書きます。

テンプレートの便利なところは、この変数に、修正子と呼ばれる、修飾語みたいなものが書けます。つまり、この修正子を使えば、今まで、PHPプログラムのほうで、出力のための編集を、テンプレート側で行うことが出来ます。]]>
        <![CDATA[Smartyで最初から用意されている修正子は２０数種類あります。もともと、海外のモノなので、日本環境にはあまり適さないモノや、これはいつ使うんだろう？？と思うモノ（私が思ってるだけかも…）もあります。

私が頻繁に使うのは数種類です。

もっとこういうのがあればいい！

と思う時もあります。その場合は、自分で作っちゃいます。

そういった類の修正子をいくつか書きます。

あれ？内容が　<a href="http://smarty.karakuriya.biz/cat33/000364.html">表示の仕方もテンプレートで</a>　とカブったか…]]>
    </content>
</entry>
<entry>
    <title>表示の仕方もテンプレートで</title>
    <link rel="alternate" type="text/html" href="http://smarty.karakuriya.biz/cat33/000364.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.karakuriya.biz/mt/mt-atom.cgi/weblog/blog_id=4/entry_id=364" title="表示の仕方もテンプレートで" />
    <id>tag:smarty.karakuriya.biz,2006://4.364</id>
    
    <published>2006-02-13T03:04:54Z</published>
    <updated>2006-04-27T08:08:46Z</updated>
    
    <summary>表示の仕方はテンプレート側で行います。変数の修正子を用いれば、PHPで表示のための編集がなくなり、PHPコードがすっきりします。</summary>
    <author>
        <name>H.Imai</name>
        
    </author>
            <category term="　３．使い方" />
    
    <content type="html" xml:lang="ja" xml:base="http://smarty.karakuriya.biz/">
        <![CDATA[<a href="http://smarty.karakuriya.biz/cat33/000362.html">繰り返しの行を表示する</a>。<a href="http://smarty.karakuriya.biz/cat33/000352.html">表示項目が多くても意外と簡単に表示できる</a>。この２とおりが出来れば、検索して結果を一覧で表示して、タイトルなりをクリックすると詳細な画面を表示するといった、基本的なWebプログラムは出来上がります。

もう１つテンプレートの素晴らしい機能として、表示の仕方もいろいろ設定ができます。

どういうことかと言うと、例えば、改行の扱い。textareaで改行付きの文章を入力し、それを表示する場合など、今まではPHPプログラムのほうで、改行コードを <strong>&lt;br /&gt;</strong> に置き換えていました。しかし、この処理もテンプレートで出来ます。

また、<strong>&lt;</strong> や <strong>&gt;</strong> のような文字もエスケープする必要があります。これもテンプレートで可能です。

その他にもいろいろあります。
Smartyのマニュアルでいうところの<strong>変数の修正子</strong>と呼ばれる機能です。
（前回書いた制御構造は、Smartyのマニュアルだと<strong>組み込み関数</strong>と呼ばれています）

こうやって、表示に関係する部分を出来るだけテンプレートに書くことで、PHPプログラムのほうは、なおいっそう、すっきりとしたコードになります。]]>
        
    </content>
</entry>
<entry>
    <title>表（行）を表示するには？</title>
    <link rel="alternate" type="text/html" href="http://smarty.karakuriya.biz/cat33/000362.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.karakuriya.biz/mt/mt-atom.cgi/weblog/blog_id=4/entry_id=362" title="表（行）を表示するには？" />
    <id>tag:smarty.karakuriya.biz,2006://4.362</id>
    
    <published>2006-02-11T08:47:18Z</published>
    <updated>2006-04-27T08:08:45Z</updated>
    
    <summary>表の行を表示するには、連想配列でテンプレートに値を渡し、foreachで繰り返し表示します。</summary>
    <author>
        <name>H.Imai</name>
        
    </author>
            <category term="　３．使い方" />
    
    <content type="html" xml:lang="ja" xml:base="http://smarty.karakuriya.biz/">
        <![CDATA[しばらく、脱線ネタで日を稼いでましたが、続きです。

表示する項目が多い場合、連想配列を使うと便利です。というのは、<a href="http://smarty.karakuriya.biz/cat33/000352.html">前回の話</a>で、今回は、表の行のような、繰り返し表示する方法です。
このような場合は、出力が何行になるか？は分かりません。データベースを読んで初めてわかるものです。なので、最初からテンプレートに

<blockquote><pre>
{$member.name1}
{$member.name2}
{$member.name3}
</pre></blockquote>

とは書けません。

テンプレートには、PHPプログラムからの値を表示するだけでなく、いわゆる<strong>制御構造</strong>をいうモノを持っています。

なんですか？それ？]]>
        <![CDATA[プログラムの世界は、「順番に実行する」「繰り返す」「分岐する」といった基本的な処理の組み合わせです。この基本的な処理のことを<strong>制御構造</strong>と言います（厳密には違うのかな…）。

つまり、Smartyのテンプレートには、この制御構造、言ってしまえば、簡単なプログラムが書けます。
これが、ホントに便利なところでもあるし、使い方を間違ったら、ドンくさいことをしてしまいそうなモノです。

繰り返しで表示するには、次のようにします。

まず、簡単なデータファイル（data.txt）を次のように作ります。

<blockquote><pre>
1,矢口真里,女
2,田中太郎,男
3,木村花子,女
4,高橋涼介,男
</pre></blockquote>

もっと増やしても構いません。
やることは、このファイルを読み込んで表示するので、ここに書いた分だけ表示されることになります。

次にこれを読み込んでSmartyで表示するプログラム（list.php）を作ります。

<blockquote><pre>
&lt;?
require_once "libs/Smarty.class.php";
$i = 0;
$fp = fopen("data.txt", "r");
while ($data = fgetcsv($fp, 1000, ",")) {
	<strong>$list[$i]['id']</strong> = $data[0];
	<strong>$list[$i]['name']</strong> = $data[1];
	<strong>$list[$i]['sex']</strong> = $data[2];
	$i++;
}
fclose($fp);
$smarty = new Smarty;
$smarty-&gt;clear_cache('list.html');
$smarty-&gt;assign("list",$list);
$smarty-&gt;display('list.html');
?&gt;
</pre>
</blockquote>

前回は $member['id'] とかいう連想配列に値を入れてましたが、今回は <strong>$list[$i]['id']</strong> とかのように、もう１回配列にします。読み込んだデータ数だけ連想配列の配列に入れてやります。そうして、listという名前でテンプレートに渡しています（$smarty-&gt;assign("list",$list);）。

次にテンプレートのほうです。

<blockquote><pre>
&lt;html&gt;
&lt;head&gt
&lt;title&gt;smarty test　リスト&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;table&gt
&lt;tr&gt;
&lt;th&gt;会員番号&lt;/th&gt;
&lt;th&gt;名前&lt;/th&gt;
&lt;th&gt;性別&lt;/th&gt;
&lt;/tr&gt;
<strong>{foreach item=row from=$list}</strong>
&lt;tr&gt;
&lt;td&gt;{$row.id}&lt;/td&gt;
&lt;td&gt;{$row.name}&lt;/td&gt
&lt;td&gt;{$row.sex}&lt;/td&gt;
&lt;/tr&gt;
<strong>{/foreach}</strong>
&lt;/table&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
</blockquote>

ポイントは <strong>{foreach item=row from=$list}</strong> の部分です。この <strong>{foreach・・・}</strong> から <strong>{/foreach}</strong> までが繰り返されます。繰り返す回数は、$list に入っている数だけ。つまり、PHPプログラムで、データファイルから読み込んだデータ数です。

{foreach item=row from=$list}
 は、$listのデータの１行分を row という名前で扱います。なので、繰り返しの中では、$rowという名前を使います。後は連想配列を同じように、$row.id、$row.name、$row.sex という風に書きます。
これで、結果的にデータファイルの内容を表示できます。

row は、PHPの変数名 list と同じ名前でもいいようです。

<blockquote><pre>
{foreach item=<strong>list</strong> from=$list}
&lt;tr&gt;
&lt;td&gt;{$<strong>list</strong>.id}&lt;/td&gt;
&lt;td&gt;{$<strong>list</strong>.name}&lt;/td&gt;
&lt;td&gt;{$<strong>list</strong>.sex}&lt;/td&gt;
&lt;/tr&gt;
{/foreach}
</pre>
</blockquote>

こうして統一しておくと、わかりやすいと思います。

この、連想配列でのデータの渡し方と、テンプレートの繰り返しがあれば、結構、なんでも作れます。ほとんどのページに対応できます。

テンプレートには、もっともっと、機能がわんさかとあります。
このあたりを駆使すると、今までPHPプログラムでやっていたことをテンプレート側でできます。と、なると、PHPプログラムがもっともっとすっきりしてきます。
データファイル（とかデータベース）を読んで、表示するデータをSmartyに渡すだけ！といった処理に収まります。PHPプログラムのほうもすっきりします。

今まで、強引にすべてをPHPプログラムに書いていたので、もう、ぐしゃぐしゃ状態ですが、これにより、PHPプログラムはデータの処理だけ、テンプレートは表示だけといった、分離がきれいにできるのです。]]>
    </content>
</entry>
<entry>
    <title>Smarty日本語</title>
    <link rel="alternate" type="text/html" href="http://smarty.karakuriya.biz/cat35/000354.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.karakuriya.biz/mt/mt-atom.cgi/weblog/blog_id=4/entry_id=354" title="Smarty日本語" />
    <id>tag:smarty.karakuriya.biz,2006://4.354</id>
    
    <published>2006-02-10T00:42:40Z</published>
    <updated>2006-04-27T08:08:45Z</updated>
    
    <summary>Smartyの日本語のサイトです。マニュアルはここにあります。</summary>
    <author>
        <name>H.Imai</name>
        
    </author>
            <category term="関連サイト" />
    
    <content type="html" xml:lang="ja" xml:base="http://smarty.karakuriya.biz/">
        <![CDATA[日本語のサイトです。
日本語のマニュアルはここです。

<a href="http://sunset.freespace.jp/smarty/">http://sunset.freespace.jp/smarty/</a>

マニュアルはWebでも見れますし、Windows用のヘルプファイルの形式でダウンロードも出来ます。
]]>
        
    </content>
</entry>
<entry>
    <title>Smarty本家</title>
    <link rel="alternate" type="text/html" href="http://smarty.karakuriya.biz/cat35/000353.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.karakuriya.biz/mt/mt-atom.cgi/weblog/blog_id=4/entry_id=353" title="Smarty本家" />
    <id>tag:smarty.karakuriya.biz,2006://4.353</id>
    
    <published>2006-02-09T14:47:19Z</published>
    <updated>2006-04-27T08:08:45Z</updated>
    
    <summary>いわずと知れた Smartyの本家です。</summary>
    <author>
        <name>H.Imai</name>
        
    </author>
            <category term="関連サイト" />
    
    <content type="html" xml:lang="ja" xml:base="http://smarty.karakuriya.biz/">
        <![CDATA[いわずと知れた Smartyの本家です。

<a href="http://smarty.php.net/">http://smarty.php.net/</a>

]]>
        
    </content>
</entry>
<entry>
    <title>Smarty入門 PHP5＋テンプレート・エンジンでつくるMVCアプリケーション</title>
    <link rel="alternate" type="text/html" href="http://smarty.karakuriya.biz/cat34/000349.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.karakuriya.biz/mt/mt-atom.cgi/weblog/blog_id=4/entry_id=349" title="Smarty入門 PHP5＋テンプレート・エンジンでつくるMVCアプリケーション" />
    <id>tag:smarty.karakuriya.biz,2006://4.349</id>
    
    <published>2006-02-06T17:02:39Z</published>
    <updated>2006-04-27T08:08:45Z</updated>
    
    <summary>「Smarty入門 PHP5＋テンプレート・エンジンでつくるMVCアプリケーション」はSmartyの入門書には最適です。</summary>
    <author>
        <name>H.Imai</name>
        
    </author>
            <category term="書籍" />
    
    <content type="html" xml:lang="ja" xml:base="http://smarty.karakuriya.biz/">
        <![CDATA[smarty関連の書籍は知らなかったのですが、amazonで１冊だけありました。

<a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798108839/qid=1138940421/sr=1-1/ref=sr_1_2_1/503-6243085-7639919http://www.amazon.co.jp/exec/obidos/ASIN/4798108839/qid=1138940421/sr=1-1/ref=sr_1_2_1/503-6243085-7639919">Smarty入門 PHP5＋テンプレート・エンジンでつくるMVCアプリケーション</a>

実物は見たことないのですが、入門書には最適みたいです。
PHPはver.5みたいですね。]]>
        
    </content>
</entry>
<entry>
    <title>表示するアイテムが多い場合</title>
    <link rel="alternate" type="text/html" href="http://smarty.karakuriya.biz/cat33/000352.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.karakuriya.biz/mt/mt-atom.cgi/weblog/blog_id=4/entry_id=352" title="表示するアイテムが多い場合" />
    <id>tag:smarty.karakuriya.biz,2006://4.352</id>
    
    <published>2006-02-06T01:23:31Z</published>
    <updated>2006-04-27T08:08:45Z</updated>
    
    <summary>表示するアイテム（値）が多い場合は、連想配列を使ってテンプレートに値を渡します。</summary>
    <author>
        <name>H.Imai</name>
        
    </author>
            <category term="　３．使い方" />
    
    <content type="html" xml:lang="ja" xml:base="http://smarty.karakuriya.biz/">
        <![CDATA[なるほど、表示したい値（変数）に対して　<strong>$smarty-&gt;assign("…",$…);</strong> を繰り返せば表示できますが、普通、１つのページに山ほど表示する値はあります。

手前味噌で恐縮ですが、福井の不動産サイト（<a href="http://fukui.fudo-3.info/">http://fukui.fudo-3.info/</a>）の物件の詳細画面ともなると、所在地、沿線、賃料、敷金、礼金、うんぬんかんぬんと。

これ全部について、$smarty-&gt;assign("…",$…);　をしないといけないのかと思うと、プログラマーはゾッとします。正直、そんなたくさん書くのは面倒。。。でも、これを言っちゃうとダメなので、プログラムの管理上どーのこーのとか、共通化出来んのか？とか言い始めます。バグ対策もあるので、ひとえに否定も出来ませんが、その半分以上は

こんなに書くの面倒じゃ！！

が率直な意見だと思います。現に私はそうです。どうも、プログラマーという人種は、楽をしたがります。

そこで、]]>
        <![CDATA[<strong>連想配列</strong>をいう技（？）を使います。

配列を参照する場合は普通は、１番目、２番目で参照しますが、それを<strong>文字列で参照するのが連想配列</strong>です。

<blockquote>普通の配列は

$member[0] = 1;
$member[1] = '矢口真里';
$member[2] = '女';

って使いますが、連想配列を使うと

$member['id'] = 1;
$member['name'] = '矢口真里';
$member['sex'] = '女';

って書けます。
</blockquote>

PHPの特徴の１つは、この連想配列です。いとも簡単に連想配列が扱えます。また、smartyもPHPで作られているので、連想配列がそのまま使えます。

テンプレートに渡す変数を１つ決めて、複数の値はその連想配列で渡します。

このように渡します。

<blockquote>&lt;?

require_once "libs/Smarty.class.php";

<strong>$member['id'] = 1;
$member['name'] = '矢口真里';
$member['sex'] = '女';</strong>

$smarty = new Smarty;
$smarty-&gt;clear_cache('index.html');
<strong>$smarty-&gt;assign("member",$member);</strong>
$smarty-&gt;display('index.html');
?&gt;
</blockquote>

で、テンプレートのほうは

templates/index.html
<blockquote>&lt;html&gt;
&lt;head&gt;
&lt;title&gt;<strong>{$member.name}</strong>&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
会員番号：<strong>{$member.id}</strong>&lt;br&gt;
名前：<strong>{$member.name}</strong>&lt;br&gt;
性別：<strong>{$member.sex}</strong>&lt;br&gt;
&lt;/body&gt;
&lt;/html&gt;
</blockquote>

と、<strong>$smarty-&gt;assign で指定した変数{$member}に、ドット（.）をつけて、連想配列のキーの値で参照</strong>します。

前のエントリーでは、PHPの変数名とテンプレートの変数名を別にして説明しましたが、実際は同じにしたほうがわかりやすいと思います。

これで表示するアイテムが多い場合でも、少ないコードで済みます。また、表示する項目を、会員情報は$member、ページ情報は$pageのように分けておけば、テンプレートのほうでも、{$member.name}　とか {$page.now} と書くので、分かりやすいのではと思います。

あと、PHPのデータベースアクセス関数ではデータベースをselectした結果を連想配列で受け取る関数もあるので、その値をダイレクトにsmartyに渡してあげれば、とってもすっきりとしたコードが書けます。ただ、テンプレートのほうは、おのずとテーブルの列名を書くことになるので、セキュリティ的にはまずいかもしれません（笑）。]]>
    </content>
</entry>
<entry>
    <title>基本的な流れ</title>
    <link rel="alternate" type="text/html" href="http://smarty.karakuriya.biz/cat33/000351.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.karakuriya.biz/mt/mt-atom.cgi/weblog/blog_id=4/entry_id=351" title="基本的な流れ" />
    <id>tag:smarty.karakuriya.biz,2006://4.351</id>
    
    <published>2006-02-04T11:27:17Z</published>
    <updated>2006-04-27T08:08:45Z</updated>
    
    <summary>Smartyを使っての、プログラムからの値を表示の流れを簡単に説明します。</summary>
    <author>
        <name>H.Imai</name>
        
    </author>
            <category term="　３．使い方" />
    
    <content type="html" xml:lang="ja" xml:base="http://smarty.karakuriya.biz/">
        <![CDATA[プログラムからの値を表示出来たので、流れを簡単に説明します。

マニュアルを熟読すれば、もっと効率良い使い方があるかも知れませんが、私は普段使っている内容しか書けないので、その範囲内ということで。

まず、PHPプログラムのほうですが、

index.php
<blockquote>&lt;?

require_once "libs/Smarty.class.php";　<strong>（１）</strong>

$name = "矢口真里";　<strong>（２）</strong>

$smarty = new Smarty;　<strong>（３）</strong>
$smarty-&gt;clear_cache('index.html');　<strong>（４）</strong>
$smarty-&gt;assign("namae",$name);　<strong>（５）</strong>
$smarty-&gt;display('index.html');　<strong>（６）</strong>
?&gt;
</blockquote>]]>
        <![CDATA[<u><strong>（１）</strong>　require_once "libs/Smarty.class.php";</u>

smartyを使う上で必ず必要な宣言です。これがないとsmartyは使えません。

<u><strong>（２）</strong>　$name = "矢口真里";</u>

これは単に、$nameという変数に「矢口真里」という値を入れているだけです。もし、データベースを読むような処理があるならば、ここにその処理を書くことになります。

<u><strong>（３）</strong>　$smarty = new Smarty;</u>

smartyクラスを生成します。smartyは <strong>Smarty</strong> というクラスで提供されています。（１）のSmarty.class.phpでピンと来るものがありますが、中を見てみると、クラスの定義がしてあります。SmartyもPHPで提供されています。

<u><strong>（４）</strong>　$smarty-&gt;clear_cache('index.html');</u>

smartyのキャッシュをクリアします。

ハテ？？
実はsmartyは<strong>キャッシュ</strong>をいう機能をもっていて、表示のためのオーバーヘッドを軽減しています。ちょうど、ブラウザがキャッシュを持っているイメージと同じです。
キャッシュをクリアすることで、常に新しい内容で表示されます。

<u><strong>（５）</strong>　$smarty-&gt;assign("namae",$name);</u>

これがPHPのプログラムの値をテンプレートに渡すポイントです。$nameは（２）でセットした変数です。
「<strong>この変数の内容を namae に出す</strong>」
といった解釈になります。

<u><strong>（６）</strong>　$smarty-&gt;display('index.html');</u>

index.htmlというテンプレートを表示します。

で、そのindex.htmlというテンプレートですが、

templates/index.html
<blockquote>&lt;html&gt;
&lt;head&gt;
&lt;title&gt;smarty test&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
smarty テスト!!&lt;br&gt;
&lt;br&gt;
name[<strong>{$namae}</strong>]
&lt;/body&gt;
&lt;/html&gt;
</blockquote>

$namae というところに（５）で指定したPHPの$nameという値が表示されます。
テンプレートには$をつけて、<strong>{$namae}</strong>と書きます。

つまり、表示したいPHPの変数 $abc があるとしたら、

<strong>$smarty-&gt;assign("hogehoge",$abc);</strong>

として、テンプレートのほうに

<strong>{$hogehoge}</strong>

と書きます。

これを繰り返していけば、たくさんの値をテンプレートを通して表示することが出来ます。
]]>
    </content>
</entry>

</feed> 

