序文
"PHP スクリプトをレイアウトから分離させるにはどうすればいいのですか?" これは間違いなく、PHPメーリングリストでよく尋ねられた質問のうちの1つでしょう。 PHP は "HTML 埋め込み型スクリプト言語" と言われていますが、 PHP と HTML を混ぜ合わせたプロジェクトを2,3書いた後で、 フォームとコンテンツの分離は良いものであるというアイディアを考え出しました。 その上、多くの会社においてのレイアウトデザイナーとプログラマの役割は分担されています。 このような理由から、テンプレートソリューションの模索が始まりました。
例えば私たちの会社において、アプリケーション開発は次の順序で行われています。 アプリケーションの要求仕様書を作成した後、インタフェースデザイナーは ユーザーインタフェースのモデルを作成しプログラマに渡します。 プログラマーは PHP によってビジネスロジックを実装し、 ユーザーインタフェースのモデルを使ってテンプレートの骨組みを作成します。 その後、プロジェクトはとても素晴らしいテンプレートをもたらしてくれる HTML テンプレートデザイナー/レイアウトデザイナーに手渡されます。 このようにプロジェクトはプログラマー/デザイナーの間で あちこちに何度も行き来する可能性があります。 プログラマーは HTML を何も扱いたくないし、HTML デザイナーに PHP コードの箇所をいじられたくないので、有用なテンプレートの土台を持つ事は重要です。 デザイナーは設定ファイルやダイナミックブロックのサポートや 他のインタフェースの公開が必要ですが、彼らは複雑な PHP 言語を扱いたくありません。
今日、PHP で利用可能な多くのテンプレートソリューションを見ると、 それらの大半は制限付きのダイナミックブロックの機能性や、 テンプレート内に変数を展開するための基本的な方法を提供しています。 しかし、我々のニーズは僅かにそれを上回るものを必要としました。 プログラマーは HTML レイアウトを全く扱いたくないのですが、 これはほとんど避けられませんでした。例えば、 デザイナーが背景色をダイナミックブロックによって変更したい場合、 プログラマーはそれを前もって考慮しておく必要がありました。 また、我々はテンプレートに変数を割り当てるための環境設定用のファイルを扱える デザイナーを必要としました。話は続きます。
我々は 1999 年末からテンプレートエンジンの仕様を書き始めました。 仕様を書き終えた後、願わくば PHP に統合されるようにと C で書かれたテンプレートエンジンに取り組み始めました。 その時、我々は複雑な技術的障害に直面したばかりでなく、 具体的にテンプレートエンジンですべき事とすべきではない事についての激しい討論をしました。 そしてその経験から、テンプレートエンジンは PHP のクラスとして記述されるべきであると決定したのは、 誰もが使用するのに適していると考えたからです。我々は PHP のクラスとしてのエンジンを書き、 そして SmartTemplate が生まれました (注: このクラスは一般に公開されませんでした)。これは、 規則的な変数置換・他のテンプレートのインクルード・設定ファイルによる統一・PHP スクリプトの埋め込み・制限された if ステートメントの機能性と多重ネスト可能なダイナミックブロック等、 我々が必要とした全てを持ち合わせたクラスでした。 ですが、むしろ全てが正規表現によって処理されるというコードは私たちには理解できませんでした。 各呼び出しごとに全てのパースと正規表現による作業を行う必要があったので、 大規模なアプリケーションでは動作が著しく遅かったのです。 プログラマの観点からの最も大きな問題は、テンプレート及びダイナミックブロックをセットアップ・ 処理するために PHP スクリプトにおいての必要な作業でした。どうすれば、 これをより容易に行えるのでしょうか?
そうして、最終的に Smarty となったものの展望がたちました。 私たちはテンプレートのパースによるオーバーヘッドを持たない PHP コードがどれくらい高速に動作するかを知っています。 また、我々は PHP スクリプトが一般のデザイナーにとって こまごまとした高圧的なものに見える可能性がある事を知っています。 そしてそれは PHP よりもはるかにシンプルなテンプレート言語によって隠蔽されるかもしれません。 もし我々がこの2つの強さを兼ね備えたらどうなるでしょう? このようにして "Smarty" は生まれたのです…… (^o^)