Smartyを導入するメリット

Pocket

システム部の松田です。

サイトのお問い合わせや応募の入力フォームの実装・テストを担当することが多いのですが、その際によく利用するPHPのテンプレートエンジン「Smarty」について、まだまだ断片的な知識の整理を兼ねて、今回紹介したいと思います。

投稿は、前後編と2度に分ける予定で、

  • 前篇:PHP実装の問題点、それを補うSmartyのメリットなど概要
  • 後編:Smartyの使い方、ハマりやすいポイントなどの具体的な内容

のような構成でお伝えしたいと思います。

PHP実装の問題点

標準的なPHPプログラミングでは、HTMLのコードの中にというPHPスクリプトを記述する「HTML埋め込みモデル」です。

しかし、コードのボリュームが増えたり、ロジックが複雑になるに伴い、埋め込みモデルで実現しようとすると、

  • 記述が冗長になる、コードの可読性が低下する。
  • デザイナとプログラマとの分業が難しくなる。

といった問題が発生します。

例えば以下のサンプルコードで考えてみます。

mix_code.php

<br />
&lt;?php<br />
$arrImg = array(<br />
	&#8216;path&#8217; =&gt; &#8216;img/sample.gif&#8217;,<br />
	&#8216;wd&#8217; =&gt; 258,<br />
	&#8216;ht&#8217; =&gt; 70,<br />
	&#8216;title&#8217; =&gt; &#8216;sample&#8217;,<br />
	);<br />
?&gt;</p>
<p>&lt;html&gt;<br />
&lt;head&gt;<br />
&lt;title&gt;sample&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;img<br />
	src=&quot;&lt;?php echo $arrImg[&#8216;path&#8217;]; ?&gt;&quot;<br />
	width=&quot;&lt;?php echo $arrImg[&#8216;wd&#8217;]; ?&gt;&quot;<br />
	height=&quot;&lt;?php echo $arrImg[&#8216;ht&#8217;]; ?&gt;&quot;<br />
	alt=&quot;&lt;?php echo $arrImg[&#8216;title&#8217;]; ?&gt;&quot; /&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;<br />

PHPでは文字列を出力するために、都度「<?php echo ….. ?>」の記述が必要になり、冗長になってしまいます。

この冗長を避けるために、サンプルコードの画像出力部分を、以下のようにHTMLとPHPの文字列連結で記述することもできますが、、、

<br />
&lt;?php<br />
echo (&quot;&lt;img src=\&quot;&quot; . $arrImg[&#8216;path&#8217;] . &quot;\&quot; width=\&quot;&quot; . $arrImg[&#8216;wd&#8217;] . &quot;\&quot; height=\&quot;&quot; . $arrImg[&#8216;ht&#8217;] . &quot;\&quot; alt=\&quot;&quot; . $arrImg[&#8216;title&#8217;] . &quot;\&quot; /&gt;&quot;);<br />
?&gt;<br />

ダブルクォートとシングルクォート、エスケープ文字やピリオドが混在していて、可読性が高いとはいえません。。。

また上記のサンプルコードはシンプルな内容ですが、HTMLを記述するデザイナがPHPを理解する必要があることや、デザイン部分とロジック部分が混在しているため、デザイナとプログラマが同時並行で作業できなくなるといった問題もあります。

Smartyとは? 導入のメリット

そこで「よりシンプルなコード」にするために、「デザインとロジックを分離」するために、Smartyのようなテンプレートエンジン(※)が有効となります。

※ テンプレートエンジン:ロジックで取得した値とデザインを結び付け、動的にページを生成するための実行エンジン。

どのように変わるのか、具体的に、Smartyのルールに則って上記のサンプルコードを分割・変更してみます。

ロジック部分:logic.php

<br />
&lt;?php<br />
require_once(&quot;Smarty/libs/Smarty.class.php&quot;);<br />
$o_smarty = new Smarty();<br />
$o_smarty-&gt;template_dir=&quot;templates&quot;;<br />
$o_smarty-&gt;compile_dir=&quot;templates_c&quot;;</p>
<p>$o_smarty-&gt;assign(&quot;path&quot;, &quot;img/sample.gif&quot;);<br />
$o_smarty-&gt;assign(&quot;wd&quot;, 258);<br />
$o_smarty-&gt;assign(&quot;ht&quot;, 70);<br />
$o_smarty-&gt;assign(&quot;title&quot;, &quot;sample&quot;);</p>
<p>$o_smarty-&gt;display(&quot;template.tpl&quot;)<br />
?&gt;<br />

デザイン部分:template.tpl

<br />
&lt;html&gt;<br />
&lt;head&gt;<br />
&lt;title&gt;sample&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;img<br />
	src=&quot;{$path}&quot;<br />
	width=&quot;{$wd}&quot;<br />
	height=&quot;{$ht}&quot;<br />
	alt=&quot;{$title}&quot; /&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;<br />

このように、

  • シンプルに記述できる、コードの可読性が上がる。
  • デザイナが必ずしもPHPを理解している必要がない。
  • ロジックとデザインが分割されることで、デザイナとプログラマが同時並行で作業できる。

といったことがSmartyの導入で実現できます。



そのほか、

  • Smarty独自のメリット
  • 逆に導入することで苦労すること

など、またの機会にお伝えできればと思います。