テンプレートエンジンsmarty動作原理と使用例

5614 ワード

テンプレートエンジンは、テンプレートファイルとデータコンテンツを統合するためのプログラムです。ウェブサイトの開発に便利です。
テンプレートファイルは普通HTML xml jsなどのタイプのファイルです。テンプレートエンジンを使わずにページにデータを表示するには、phpでHTMLを出力する必要があります。テンプレートを使うと、データをテンプレートエンジンプログラムに渡すだけでいいです。どのテンプレートファイルを使うかを教えます。自然とデータとページを結合してから出力します。テンプレートには少なくとも以下の機能があります。データをテンプレートエンジンに供給する機能です。2.テンプレートの機能を指定します。3.結果を出力する機能。一般的には、プログラマーがテンプレートエンジンを使用するのを便利にするために、開発者は機能をある程度パッケージ化し、クラスにパッケージ化し、実用化された後に対象となるオブジェクト、すなわちテンプレートエンジンオブジェクト、オブジェクトは属性と方法があり、smartyオブジェクトの帰属と方法はsmartyマニュアルで検索し、まずその方法を説明します。assignはデータをテンプレートに提出する方法です。テンプレートファイルを個別に指定する方法はなく、出力方法には二つのdisplayが直接出力されます。  fetchは統合されたHTMLコードを返します。出力には主にassignが使われています。私たちが表示しているデータは多様性が多いので、量が多いかもしれません。配列量も多次元配列かもしれません。場合によってはどのようにsmartyに正確に提出するべきかは問題です。提出後どのように対応して表示するかも問題です。smartyエンジンが使用する解釈方法は、まずHTMLファイルをphpファイルに変換し、それぞれの量を賦課し、このphpファイルを実行し、異なるデータフォーマットに対応して、固定的な書き方をしています。このような書き方でテンプレートファイルに対応するマーカーを作成する必要があります。smartyデフォルトで使用するテンプレートマーカーはペアです。例えば「$a」というマークはecho$aと同じです。phpでは対応する赋価プロセスが必要です。smarty->assign(「a」「値」)私達が複数の量を持っている場合、一つ一つこのように書くのは面倒くさいです。smartyはこの点を考慮してくれました。例えばデータベースから文章を読みました。ページの内容にタイトルのある内容を表示するには、作者の時間があります。データ構造は大体このようです。

array([id]=>1,['title']=>" ",…);
私たちのテンプレートにはいくつかの対応するタグが必要です。例えば、

<h1>{$title}</h1>
<div>{$content}</div>
一つの割当値が面倒くさいので、assignメソッドは配列の直接割当をサポートします。
$smarty->assign($rows);smartyはデータインデックスを取って自動的に1つずつ値を付けますが、この時は変数の衝突を避けるために、直接的に配列形式で値を付けたいです。たとえば、

$rows = ,
$smarty->assign("rows",$rows);
もしこの時、テンプレートのタグが「$rows」であれば、出力時にはarrayがphpの直接的なecho配列のように、php出力の具体的な量はecho$rows[title];smartyで規定されている記号はポイント番号です。

echo $rows['title']
各テンプレートには対応する書き方のルールがあります。次に表示するのは文章のリストです。もしmysqlが10本のデータを返してくれたら、10本のデータが表示されます。そしてインデックスは完全に同じです。プログラミングの考え方によって結果が分かります。もし次のように表示されます。

<ul>
<li>1111</li>
<li>222</li>
<li>333</li>
<li>4444</li>
</ul>
もしこれが私たちが出力したい姿だったら。
まずこれは複数の量です。もちろん行列を使います。

$list=array();
While($rows= ){
$list[]=$rows;
}
$smarty->assign("list",$list);
まずデータを一つの配列に入れて、もう一度smartyに渡します。そうすると、list変数の中に二次元配列があります。このような二次元配列を得るなら、中のすべての値を表示します。一番いい方法は循環出力です。同様にsmartyは循環用のマーク、sectionとforeachを提供してくれます。
セレクションマーク形式

{section name= loop= }
...
{/section}


{section name=i loop=$list}
<li>{$list[i].title}</li>
{/section}

上のコードはforループのように見えますが、ここのiはforループの中の$iではなく、このサイクルの名前だけです。これは配列から毎回量を得ることができます。先ほど述べたように、$listは二次元配列です。
もう一つの書き方はforeachという文法です。

{foreach key= item= from= }

{$key}:{$item}<br />

{/foreach}

{foreach  item=v from=$list}

<li>{$v.title}</li>

{/foreach}

循環リスト変数の各量はvに割り当てられ、変数vから表示するインデックスを指定します。循環マーク以外に、よく使われる文法マークも提供しています。例えばファイル、条件判断を含めて、HTMLはファイルを含んではいけないことを知っています。ウェブページのヘッダなど、smartyはincludeのマークを提供しています。ファイルをphpのように含めることができます。例えば、「include file=「ファイルパス」というマークフォーマットは固定されています。そして、このパスはテンプレートエンジンで指定されたパスでなければなりません。条件判定の文法はphpと同じif条件判定です。文法は以下の通りです。

{if == }

{else}

{/if}
また、elseを書かなくても良いです。本当の時に表示される内容だけです。例えば、よくある場合は、ウェブページにログイン先が表示されているのはフォーム登録後に表示されているのはユーザ情報です。仮に一つの量がテンプレートに割り当てられていたとしても、例えばUSernameユーザが登録していないという量が空です。このように書いてもいいです。

{if $username !=""}
{$username}
{else}

{/if}
私達はphpでこの変数を準備し、smartyに値を与えさえすれば、これらの表記以外にも自分でマニュアルを参考するマークがあります。
次に変数の調整器です。多くの場合、データベースから得られたデータは小さく処理してから出力されます。例えば日付書式は、年月日だけを表示して出力できるような内容の改行を
ページに対応する様子を表示するために必要です。この時はスマートグリッドの変数調整器を使って、フォーマットは以下の通りです。

{ | : }
内容の部分が表示されている場合は、すべての改行を
次のように表示します。

{$content|nl2br}
日付の書式は、ダテ(u)が使えます。フォーマットはたとえばハンド・バックの上で

index.php:

$smarty = new Smarty;
$smarty->assign('yesterday', strtotime('-1 day'));
$smarty->display('index.tpl');

index.tpl:

{$smarty.now|date_format}
{$smarty.now|date_format:"%A, %B %e, %Y"}
{$smarty.now|date_format:"%H:%M:%S"}
{$yesterday|date_format}
{$yesterday|date_format:"%A, %B %e, %Y"}
{$yesterday|date_format:"%H:%M:%S"}

OUTPUT:

Feb 6, 2001
Tuesday, February 6, 2001
14:33:00
Feb 5, 2001
Monday, February 5, 2001
14:33:00

本当にだめです。私たちはphpで処理してから賦課します。
設定を書きます

<?php
define("ROOT",str_replace('\\','/',dirname(__FILE__)).'/');//
// smarty
require ROOT.'lib/smarty.class.php';
$samrty = new smarty();// smarty
//
$smarty ->setTemplateDir(ROOT.'templates/')
        ->setCompileDir(ROOT.'templates_c')
        ->setPluginsDir(ROOT.'plugins/')
        ->setCacheDir(ROOT.'cache/')
        ->setConfigDir(ROOT.'configs/');
$smarty->caching = false;//
$smarty->left_delimiter = '<{';// js css
$smarty->right_delimiter = '}>';
?>