テンプレート エンジンに触れ始めたばかりの 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など)は、テンプレートオブジェクトを作成する際に解析対象のテンプレートを取得し、変数と変数を挿入します。 use parse() このメソッドはテンプレートを解析し、最終的に Web ページを出力します。
Smarty ユーザーの場合、プログラムで解析アクションを実行する必要はなく、Smarty が自動的に実行します。さらに、コンパイルされた Web ページのテンプレートが変更されていない場合、Smarty はコンパイル アクションを自動的にスキップし、コンパイルされた Web ページを直接実行してコンパイル時間を節約します。
Smarty のいくつかの概念を使用する
一般的なテンプレート エンジンでは、いわゆるブロックの概念はおそらく次のようになります:
Region content
これらのブロックのほとんどは、PHP プログラムでの表示ステータスを制御するために if または for を使用しますが、テンプレートは 1 つだけ必要です。表示方法が異なるテンプレートを使用するには、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 という名前を付けて、メイン フォルダーに配置してください。 class/Smarty.class.php";
define(@#__SITE_ROOT@#, @#d:/appserv/web/demo@#); // 末尾にスラッシュはありません
$tpl = new Smarty( ;
$tpl ->cache_dir = __SITE_ROOT . "/cache/";
$tpl-<{@#;
$tpl->@#;
上記のように設定する目的は、プログラムを他の場所に移植する必要がある場合に、__SITE_ROOT を変更するだけです。 (これは XOOPS の参照用です)
Smarty のテンプレート パスが設定された後、プログラムはこのパスに従ってすべてのテンプレートの相対位置を取得します (この例では @#d:/appserv/web/demo/templates です) /@#) 。次に、display() Smarty メソッドを使用してテンプレートを表示します。
次に、test.htm をテンプレート フォルダーの下に配置します: (拡張子の名前は問題ありませんが、ビジュアル デザイナーが開発するのに便利です。私は今でも .htm をメインの拡張子として使用しています。)
templates/test.htm:
<{foreach item=item1 from=$array1}> }>
<{/foreach}>
セクションを使用して array1 を表示します
<{$array1[sec1]}>セクション}>
foreach を使用して array2 を表示します
<{foreach item=index2 from=$index2}> >: <{$item2}>
<{/foreach}>
<{/foreach}>
index1: <{$array2[sec2].index1}>
index2:<{$array2[sec2].index2}> ;{/section}>
は foreach またはセクションです。それでは、この 2 つの違いは何でしょうか?
最初の違いは明らかです。つまり、foreach は入れ子になった処理メソッドを使用して、割り当てた 2 レベルの配列変数を提示しますが、セクションでは「メイン配列 [ループ名].サブ配列インデックス」を使用して配列全体を割り当てます。レンダリングされます。 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) " => "お知らせ地区",
"トピック" => array(
array("topic_id" => 1, "topic_name" => "サイトお知らせ")
)
),
array("category_id" " => 2, "category_name" => "文学セクション",
"topic" => array(
array("topic_id" => 2, "topic_name" => "良書の紹介") ,
array("topic_id" > > array(
array("topic_id" => 4, "topic_name" => "ハードウェア周辺機器"),
array("topic_id" => 5, "topic_name" = > "ソフトウェア ディスカッション")
)
)
$tpl->assign("forum", $forum);
?
テンプレートは次のように記述されます:
& lt; html & gt;
& lt; ネスト循環テスト/table & lt;/head & lt &
& ; gt; テーブル幅 ="200" border="0" align="center" cellpadding="0"> <{セクション名=sec1 ループ=$forum}><
<{セクション名=sec2 ループ=$forum[sec1].topic}>="164"<{$forum[sec1].topic[sec2].topic_name}>
<{/section}> }>
実行結果は作者が示した例と同じです。
したがって、プログラムでは、繰り返しの値を層ごとに配列に詰め込む方法を見つけて、<{第 1 レベルの配列 [ループ 1]、第 2 レベルの配列 [ループ 2] を使用するだけです。 .第 3 レベルの配列 [ループ 3]. ....配列インデックス}> このようにして、ネストされた各ループの値を表示します。どのような方法を使用すればよいでしょうか?次のセクションでデータベースを使用するときにもう一度説明します。
データベース内のデータを変換します
上記ではネストされたループを表示する方法を説明しましたが、実際には、適用するときにデータがデータベースから取得される可能性があるため、データベース内のデータを次のように変更する方法を見つける必要があります。上記の複数の配列形式。ここでは、DB カテゴリを使用してデータベース内のデータをキャプチャします。好みの方法を使用できます。
PHP プログラムを変更するだけで、テンプレートは上記のままです (これはテンプレート エンジンの利点です ~) $db オブジェクトは main.php に作成されているものと想定されており、キャプチャされたデータは上の例。
test3.php:
require "main.php";
// まず最初のレベルの配列を作成します
$category = array(); #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")、
配列("値" => "5")、
配列("値" => "6")、
配列("値" => "7")、
array("value" => "8"),
array("value" => "9"));
$tpl->assign("my_array", $my_array); ; display(@#test4.htm@#);
templates/test4.htm:
テスト {セクション名=sec1 ループ=$my_array}>
body><{$my_array[sec1].value}>
<{if $smarty.section.sec1. 2}>
重要なポイントは、Smarty 変数 $smarty.section.sec1.rownum です。そのため、rownum は 1 から始まります。 2 すべての分割が完了したら、を出力してテーブルの列を変更します (注意! は前にあり、は後ろにあります。したがって、数値 2 は、列に表示するデータ項目の数です。これを使用して、他のさまざまな表示方法を変更できます。
外部コンテンツをロードする
2 つの Smarty テンプレート構文 include_php と include をそれぞれ使用して、PHP プログラム コードまたは別のサブテンプレートをテンプレートにロードできます。 include_php は作成者によってほとんど使用されず、使用方法は次のとおりです。公式マニュアルはこちら ナレーションは不要です。
include を使用すると、サブテンプレートを事前にロードしたり、サブテンプレートを動的にロードしたりできます。プリロードは通常、共通のファイル ヘッダーと著作権宣言がある場合に使用されます。動的ロードは、Winamp のような置換可能なスキンをさらに実現するために統合フレーム ページで使用できます。もちろん、状況に応じてこれら 2 つを混合することもできます。
次の例を見てみましょう:
test5.php:
require "main.php";
$tpl->assign("title", "Include Test");
$tpl->assign("content", "これはテンプレート 2 の変数です");
$tpl->assign("dyn_page", "test5_3.htm"); @ #test5_1.htm@#);
?> equiv= "Content-Type" content="text/html; charset=big5"><{$title}>
{include file=$dyn_page}> ="test5_4.htm"custom_var="カスタム変数の内容"& gt; & & lt;/body & gt;
テンプレート 2 は次のとおりです。 test5_2.htm:
& lt; {$ Content} & gt; 以下の通り:
templates/test5_3.htm:
これはテンプレート 3 の内容です
テンプレート 4 は次のように記述されます:
templates/test5_4。 htm:
<{$custom_var}>
ここでいくつかの重要な点に注意してください: 1. テンプレートの場所は、以前に定義された template_dir に基づきます。 2. 含まれるすべてのサブテンプレートでは、その変数も解釈されます。 。 ; 3. include では、上記のテンプレート 4 と同様に、「変数名 = 変数の内容」を使用して、インポートされたテンプレートに含まれる変数を指定できます。
声明:この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。