テンプレート エンジンに触れ始めたばかりの PHP デザイナーは、Smarty と聞くと難しく感じるでしょう。実際、著者も例外ではなく、あえて触れません。しかしその後、XOOPS のプログラム アーキテクチャを分析したところ、Smarty は実際には難しくないことがわかり始めました。 Smarty の基本的なスキルをマスターしていれば、一般的なアプリケーションには十分です。もちろん、基礎をしっかりと築くことができれば、その後の高度な応用について心配する必要はありません。
この記事の主な目的は、公式の使用説明書に完全に記載されている Smarty の使用法を掘り下げることではありません。著者は、Smarty を理解したいのに理解できない友人がそこからインスピレーションを得られるように、自身の使用体験の一部だけを書き留めています。この記事の内容はそれほど深いものではないため、Smarty の使い方を知っている友人にとっては、少し簡単だと感じるかもしれません。
この記事は 3 回目の改訂であり、さらに情報を追加したいと思っていますが、時間の都合上、著者は Smarty の高度なスキルの多くを十分に研究していないため、あえて紹介しません。この記事は、Smarty を学びたいほとんどの初心者を満足させることができるはずです。もちろん、この記事に誤りがある場合はお知らせください。著者は次回の改訂でそれらを修正します。
Smarty の紹介
テンプレート エンジンとは何ですか?
いつからか、HTML にサーバー スクリプトを埋め込むことに不満を感じる人が現れました。ただし、Microsoft の ASP であれ、オープンソースの PHP であれ、それらはすべてサーバー スクリプトが組み込まれた Web サーバーサイド言語です。そこで、プログラムのアプリケーションロジック(または業務アプリケーションのロジック)とWebページのプレゼンテーション(レイアウト)のロジックを分離できれば良いのではないかと考える人もいるのでは?
実際、この問題は長い間存在していました。インタラクティブな Web ページが普及したとき、ASP と PHP のユーザーは両方ともプログラム開発者であり、ビジュアル デザイナーでもありました。しかし、通常、これらのユーザーはプログラミングが得意か芸術が得意で、その両方を同時に処理しようとすると、多くの脳細胞を失うことになります...
そこで、テンプレート エンジンが登場しました。テンプレートエンジンの目的は、上記の論理分離機能を実現することである。これにより、プログラム開発者はデータ制御や機能の実現に集中できる一方、ビジュアルデザイナーは Web ページのレイアウトに集中して、Web ページをよりプロフェッショナルに見せることができます。したがって、テンプレート エンジンは企業の Web サイト開発チームによる使用に適しており、誰もが専門知識を活用できます。
筆者がこれまで接してきたテンプレートエンジンは、データの表現方法により、プログラムで処理する必要があるテンプレートエンジンと、テンプレート自体で完全に決まるテンプレートエンジンの2種類に大別されます。
プログラムによって処理する必要があるテンプレート エンジンでは、プログラム開発者は変数のプレゼンテーション ロジックに責任を負う必要があります。つまり、変数の内容を処理してからテンプレートに出力する必要があります。課題の仕事。言い換えれば、プログラム開発者は変数の外観を決定するためにさらに多くのプログラムを作成する必要があります。テンプレート エンジンはテンプレート自体によって完全に決定され、変数をテンプレートに直接割り当てることができるため、ビジュアル デザイナーはテンプレートの設計時に変数がどのように表示されるかを決定できます。したがって、制御変数の提示を容易にするために、独自のテンプレート プログラム構文の別のセット (Smarty など) が存在する場合があります。ただし、このように、ビジュアル デザイナーはテンプレート言語の使用方法も学ぶ必要があります。
テンプレートエンジンの動作原理 まず、以下の動作図を見てみましょう:
一般的なテンプレートエンジン(PHPLibなど)は、テンプレートオブジェクトを作成する際に解析対象のテンプレートを取得し、変数を挿入してparseを使用します。 ( ) このメソッドは、テンプレートを解析し、最終的に Web ページを出力するために使用されます。
Smarty ユーザーの場合、プログラムで解析アクションを実行する必要はありません。Smarty が自動的に実行します。さらに、コンパイルされた Web ページのテンプレートが変更されていない場合、Smarty はコンパイル アクションを自動的にスキップし、コンパイルされた Web ページを直接実行してコンパイル時間を節約します。
Smarty のいくつかの概念を使用する
一般的なテンプレート エンジンでは、いわゆるブロックの概念はおそらく次のようになります:
Region content
< ; !-- END : ブロック名 --> これらのブロックのほとんどは、PHP プログラムでの表示ステータスを制御するために if または for を使用しますが、表示が変更されるとすぐに異なります。テンプレートを使用するには、PHP プログラムを再度変更する必要があります。
Smarty では、すべてが変数に基づいており、すべてのプレゼンテーション ロジックはテンプレートによって制御されます。 Smarty には独自のテンプレート言語があるため、ブロックを表示する必要があるか繰り返す必要があるかに関係なく、ブロックは Smarty のテンプレート構文 (if、foreach、section) と変数コンテンツを使用して表示されます。このように、テンプレートが少し複雑になったように感じますが、きちんと計画を立てれば、PHP プログラムを 1 行も変更する必要がないという利点があります。
上記の説明から、Smarty を使用する場合は、プログラム アプリケーション ロジックと Web ページ レンダリング ロジックを明確に分離するという 1 つの原則を習得する必要があることがわかります。つまり、PHP プログラム内に HTML コードが多すぎてはなりません。プログラムでは、どの変数をテンプレートに挿入するかを決定するだけでよく、これらの変数をどのように表示するか (またはまったく表示しないことも) はテンプレートに決定させます。
Smartyの基本
Smartyのインストール
まずはプログラムの配置場所を決めます。
Windows では、「d:appservwebdemo」のような場所がある場合があります。
Linux では、「/home/jaceju/public_html/」のような場所になる可能性があります。
Smarty の公式 Web サイトにアクセスして、最新の Smarty パッケージをダウンロードします: http://smarty.php.net。
Smarty 2.6.0 のロックを解除すると、libs フォルダーを含む多くのファイルが表示されます。 libs には 3 つの class.php ファイル + 1 つの debug.tpl + 1 つのプラグイン フォルダー + 1 つのコア フォルダーがあるはずです。次に、libs をプログラムのメイン フォルダーに直接コピーし、その名前を class に変更します。それだけです?それは正しい!このインストール方法は比較的簡単で、通常、独自のホストを持たないユーザーに適しています。
なぜ Smarty 公式マニュアルではより複雑なインストール方法が紹介されているのでしょうか?基本的に、これは公式の方法に従ってインストールされ、ホスト上に 1 回だけインストールされ、その後、Smarty のコピーを繰り返しインストールすることなく、さまざまなプログラムを開発する際に直接参照できるようにホスト下のすべての設計者に提供されます。著者が提供する方法は、プログラムをあちこちに移動したいプログラム開発者に適しているため、ホストに Smarty がインストールされているかどうかを心配する必要はありません。
プログラム フォルダーの設定
著者が Windows に Appserv をインストールした場合を例に挙げます。プログラムのメイン フォルダーは「d:appservwebdemo」です。 Smarty をインストールした後、メイン フォルダーの下に次のようなフォルダーを作成します:
Linux では、templates_c のアクセス許可を 777 に変更することを忘れないでください。 Windows では、読み取り専用としてキャンセルします。
Smarty で作成した最初の小さなプログラム
まず、次のファイルに main.php という名前を付け、メイン フォルダーに配置してください:
main.php:
include "class/Smarty. class.php";
define(@#__SITE_ROOT@#, @#d:/appserv/web/demo@#); // 末尾にスラッシュはありません
$tpl = new Smarty();
$ tpl-> template_dir = __SITE_ROOT . "/templates/";
$tpl->compile_dir = "/configs/"; __SITE_ROOT . "/cache/";
$tpl-<{@#;
$tpl->@#;
写真の目的上記の設定は、プログラムを他の場所に移植する必要がある場合、__SITE_ROOT を変更するだけです。 (これは XOOPS の参照用です)
Smarty のテンプレート パスが設定された後、プログラムはこのパスに従ってすべてのテンプレートの相対位置を取得します (例では、@#d:/appserv/web/demo/templates/@#) 。次に、display() Smarty メソッドを使用してテンプレートを表示します。
次に、test.htm を templates フォルダーの下に配置します: (拡張子は何でも構いませんが、ビジュアル デザイナーが開発するのに便利なので、私は主に .htm を使用します。)
templates/test.htm:
$tpl->compile_dir = __SITE_ROOT . "/templates_c/";
$tpl-> ;config_dir = __SITE_ROOT . "/configs/";
$tpl->cache_dir = __SITE_ROOT . = @#<{@#; = @# }>@#;
?>
modules このフォルダーは、プログラムがあちこちに散らばらず、全体の構造が一目瞭然になるように、プログラム モジュールを配置するために使用されます
main についても説明しました。 php、これはプログラム全体の主要なコアです。定数の定義、外部プログラムのロード、共有変数の作成など、すべてがここから始まります。したがって、後続のモジュールはこのファイルをプログラム フローに含めるだけで済みます。計画期間中は、main.php に何を配置するかを慎重に検討する必要があります。もちろん、各リンクを明確に分離するには、include または require ディレクティブを使用するのが最善です。
Smarty プログラムの 5 つのステップは、前のセクションで説明しました。 、main.PHP は最初の 3 つのステップを実行するのに役立ち、後続のモジュール プログラムは最後の 2 つのステップのみを実行する必要があります。
変数から始める
変数の使用方法
前の章の例から、変数をラップするために 2 つのマーク記号 <{ と }> を使用していることが明確にわかります。デフォルトのマーキング記号は { と } ですが、中国語のコーディングと JavaScript のために、作成者は依然として XOOPS を模倣してマーキング記号を置き換えています。変数の命名方法はPHPと全く同じで、先頭に$フォントも付いています(通常のテンプレートエンジンとは異なります)。マーキング記号は PHP の
に似ているため (実際にはこれに置き換えられます)、次のテンプレート変数の記述方法が可能です: <{$var } > 2. <{ $var }> 開始マーク シンボルと終了シンボルが同じ行にありません --> Smarty では、変数はデフォルトでグローバルです。つまり、変数を 1 回指定するだけで済みます。 2 回以上指定した場合、変数の内容は最後に指定した内容に基づきます。メイン テンプレートに外部サブテンプレートをロードした場合でも、サブテンプレート内の同じ変数も置き換えられるため、サブテンプレートに対して別の解析アクションを実行する必要はありません。
PHP プログラムでは、Smarty の assign を使用してテンプレートに変数を配置します。 assignの使い方は公式マニュアルにたくさん書かれており、使い方は前節の例の通りです。ただし、ブロックを繰り返す場合は、変数をテンプレートに割り当てる前に変数の操作を行う必要があります。これについては次の章で説明します。
変数を変更する
Smarty 変数の外観はテンプレートによって決定されると上で説明しました。そのため、Smarty は変数を変更するための関数を多数提供しています。使用する方法は次のとおりです:
<{変数|変更された関数}>
<{変数|変更された関数: "パラメータ (必要ありません、考慮されます)関数による)"}>
例は以下の通り:
<{$var|nl2br}> に置き換えます。 変数の外観を自分で決定したいですか?まず、以下の HTML をご覧ください。これはショッピング カートのチェックアウト画面の一部です。
合計金額: 21,000 元
一般的なテンプレート エンジンのテンプレートは次のように記述できます:
合計金額: {format_total} 元
PHP プログラムは次のように記述する必要があります:
$total = 21000;
$tpl-> ;assign( "total", $total);
$tpl->assign("format_total",number_format($total));
?>Smarty テンプレートは次のように記述できます: (number_format 変更関数の場合) 、Smarty 公式 Web ページのダウンロードにアクセスしてください)
合計金額: <{$total| number_format:""}>yuan
Smarty の PHP プログラムは次のように記述するだけです:
$total = 21000;
$tpl->assign("total", $total);
そのため、Smarty では変数を 1 回指定するだけで済み、残りはテンプレートの決定に任せます。これわかりますか?これは、変数がどのように表示されるかをテンプレートに独自に決定させることの利点です。
テンプレートのコンテンツを制御する
ブロックを複製する
Smarty テンプレートでは、ブロックを繰り返す方法が 2 つあります: foreach とセクションです。プログラムでは、配列の配列を含めることができる配列を割り当てる必要があります。次の例のように:
まず、PHP プログラムがどのように記述されているかを見てみましょう:
test2.php:
require "main.php";
$array1 = array(1 => "Apple" 、2 => "バナナ"、4 =>assign("array1", $array1); ("index1" => "data1-1", "index2" => "data1-2", "index3" => "data1-3"),
array("index1" => "data2- 1", "index2" => "data2-2", "index3" => "data2-3"),
array("index1" => "data3-1", "index2" => " data3-2", "index3" => "data3-3"),
array("index1" => "data4-1", "index2" => "data4-2", "index3" => ; "データ 4-3"),
array("インデックス 1" => "データ 5-1", "インデックス 2" => "データ 5-2", "インデックス 3" => "データ 5-3")); $tpl->assign("array2", $array2);
$tpl->display("test2.htm");
テンプレートは次のように記述されます:
templates/test2.htm:
< ;html>
重複ブロックをテストします <br>foreach を使用して array1 を表示します <br><{$item1}> <br><{/foreach}>セクションを使用して配列 1 を表示します <br><{セクション名=sec1 ループ=$array1}> <br><{/section}> <br> foreach を使用して配列 2 を表示します <br>< {foreach item=index2 from=$array2}><{foreach key=key2 item=item2 from=$index2}>: <{$item2}> ;{/foreach}> <br><{/foreach}> <br>セクションを使用して配列 1 を表示します <br>index1: <{$array2[sec2] }> <br>index2: <{$array2[sec2].index3}> <br>
上記の例を実行すると、foreach であってもセクションであっても、2 つの実行結果は同じであることがわかりました。それでは、この 2 つの違いは何でしょうか?
最初の違いは明らかです。つまり、foreach は入れ子になった処理メソッドを使用して、割り当てた 2 レベルの配列変数を提示しますが、section は "メイン配列 [ループ名].サブ配列インデックス" を使用して、提示された配列全体を割り当てます。 Smarty のテンプレートの foreach は PHP の foreach と同じであり、セクションは上記の配列変数を処理するために Smarty によって開発された記述であることがわかります。もちろん、セクションの機能はそれ以上です。次のセクションで説明するネストされたデータの表示に加えて、公式マニュアルにはセクションのいくつかの応用例も記載されています。
ただし、セクションにスローされる配列インデックスは 0 から始まる正の整数、つまり 0、1、2、3、... である必要があることに注意してください。配列のインデックスが 0 から始まる正の整数でない場合は、代わりに foreach を使用してデータを表示する必要があります。公式フォーラムでこのディスカッションを参照できます。このディスカッションでは、セクションと foreach の使用法について説明しています。
ネストされたデータのプレゼンテーション
テンプレート エンジンで最も厄介なことは、おそらく、多くの有名なテンプレート エンジンがこの点を特に強調しますが、これは Smarty にとって簡単なことです。
最も一般的なネストされた情報は、ディスカッション プログラムのディスカッション トピック領域です。提示される結果は次のとおりであるとします。
お知らせエリア
サイトサービスのお知らせ
文学エリア
良書の紹介
共有記事
コンピュータエリア
ハードウェア周辺機器
ソフトウェアディスカッション
プログラムでは、まず静的データを例:
test3.php:
require "main.php";
$forum = array(
array("category_id" => 1, "category_name" => "お知らせエリア",
" topic" => array(
array("topic_id" => 1, "topic_name" => "ウェブサイトのお知らせ")
)
),
array("category_id" => 2, "category_name" => ; "文学ゾーン",
"トピック" => array(
array("topic_id" => 2, "topic_name" => "良書紹介"),
array("topic_id" => 3 , "topic_name" => " 素晴らしい記事をすべてお楽しみください")
)
),
array("category_id" => 3, "category_name" => "コンピューター ゾーン",
"topic" => array (
array("topic_id" => ; 4, "topic_name" => "ハードウェア周辺機器"),
array("topic_id" => 5, "topic_name" => "ソフトウェア ディスカッション")
)
)
);
$tpl->assign("forum", $forum);
$tpl->display("test3.htm");
templates/test3 .htm:
align="center" cellpadding="0">
<{section name=sec1loop=$forum}>
<{セクション名=sec2 ループ=$forum[sec1].topic}> td width="25">
<{$forum[sec1].topic[sec2].topic_name}> | /tr>
<{/section }>
著者。
したがって、プログラムでは、繰り返しの値を層ごとに配列に詰め込む方法を見つけて、<{第 1 レベルの配列 [ループ 1]、第 2 レベルの配列 [ループ 2] を使用するだけです。 3 番目のレベルの配列 [ループ 3] ... .Array Index}> この方法で、ネストされた各ループの値が表示されます。どのような方法を使用すればよいでしょうか?次のセクションでデータベースを使用するときにもう一度説明します。
データベース内のデータを変換する
ネストされたループを表示する方法については上記で説明しましたが、実際のアプリケーションではデータがデータベースから取得される可能性があるため、データベース内のデータを上記の倍数に変換する方法を見つける必要があります配列形式。ここでは、DB カテゴリを使用してデータベース内のデータをキャプチャします。好みの方法を使用できます。
PHP プログラムのみを変更し、テンプレートは上記のままです (これはテンプレート エンジンの利点です ~) $db オブジェクトは main.php に作成されているものと想定されており、キャプチャされたデータはサンプルです。その上。
test3.php:
require "main.php";
// まず最初のレベルの配列を作成します
$category = array();
$db->setSQL($SQL1, @#CATEGORY @ #);
if (!$db->query(@#CATEGORY@#)) die($db->error());
// ループの最初の層のデータを取得します
while ($item_category) = $db->fetchAssoc(@#CATEGORY@#))
{
// 第 2 レベルの配列を作成します
$topic = array();
$db->setSQL(sprintf($SQL2, $item_category[ @#category_id@#]), @#TOPIC@#);
if (!$db->query(@#TOPIC@#)) die($db->error());
// 2 番目を取得-レベルのループデータ
while ($item_topic = $db->fetchAssoc(@#TOPIC@#))
{
// キャプチャしたデータを第 2 レベルの配列
array_push($topic, $item_topic); にプッシュします。 }
//第 1 レベルの配列によってキャプチャされたデータのメンバーとして第 2 レベルの配列を指定します
$item_category[@#topic@#] = $topic;
// データの 1 つのレイヤーが最初のレイヤーにプッシュされます。配列
array_push($category, $item_category);
$tpl->assign("forum", $category);
$tpl->display("test3.htm");データベースから情報を取得すると、データを含む配列が得られます。 while ステートメントと array_push 関数を通じて、データベース内のデータを 1 つずつ配列にプッシュします。ループの 1 つのレイヤーのみを使用する場合は、ループの 2 番目のレイヤー (赤い部分) を削除するだけです。
コンテンツを表示するかどうかを決定する
コンテンツを表示するかどうかを決定するには、if 構文を使用して選択できます。たとえば、ユーザーがログインしている場合、テンプレートは次のように記述できます:
<{if $is_login == true}>
ユーザー操作メニューを表示します
<{else}>パスワード入力フォーム
<{/if}>
「==」記号の両側に少なくとも 1 つのスペース文字がなければならないことに注意してください。そうしないと、Smarty はそれを解析できません。
if構文の一般的な応用については、公式の使用説明書を参照していただければよいので、ここでは詳しく紹介しません。しかし、著者は興味深いアプリケーションを見つけました。プログラムで次のようなテーブルが生成されるのをよく見かけます: (数字はデータセットの順序を表します)
1 2
3 4
5 6
7 8
私はこれを「水平テーブル」と呼んでいます。繰り返しテーブル」。その特性は、前のセクションで見た従来の垂直方向の繰り返しとは異なり、すべて上から下にあり、1 つの列に 1 つのデータのみが含まれています。水平方向に繰り返すテーブルでは、1 つの列に n 個のデータを水平方向に生成し、サイクル全体が終了するまで次の列に変更できます。このような機能を実現するには、section と if を一致させるだけの最も簡単な方法です。
次の例を見てみましょう:
test4.php:
require "main.php";
$my_array = array(
array("value" => "0"),
array ( "値" => "1")、
array("値" => "2")、
array("値" => "3")、
array("値" => " 4 ")、
array("value" => "5")、
array("value" => "6")、
array("value" => "7")、
array("値 " => "8"),
array("値" => "9"));
$tpl->assign("my_array", $my_array);
$tpl->display(@ # test4.htm@#);
?> ;/head>
;
<{セクション名=sec1 ループ= $my_array}><{$my_array[sec1].value}> | {if $smarty.section.sec1 .rownum は 2 による div です。