もちろん、数万行のコードを含むプロジェクトの場合、顧客がプログラマーとレイアウトデザイナーの両方を雇う機会がある場合、テンプレートの機能はプロジェクトのすべての参加者にのみ有効です。 しかし、開発者がSmartyを3ページの単純なWebサイトに配置し始めると、これは私見では破綻します。 そのような場合、George Schlosneigelの素晴らしい本「Professional PHP Programming」-「ハンマーでハエを殺そうとする試み」からの表現を思い出します。
実際、同じSmartyを機能が非常にシンプルなサイトに統合すると、開発者は単に時間を費やします。 そして、ご存じのとおり、時間はお金です。 ほとんどの場合、顧客は自分のサイトがどのテンプレートエンジンで動作するかを気にしません。 顧客は費やされた時間をより心配しています。
サイトが「名刺」ではなく、2番目のAmazonではない場合はどうすればよいですか? 個人的には、この場合の問題に対する最適な解決策は、現在のリソースに必要な狭い範囲のタスクを解決するためだけに機能全体が強化された独自の自己記述型テンプレートシステムを使用することだと思います。 その後、特定の最小限の機能セットを使用して、単一のプロジェクトで必要に応じて拡張するユニバーサルテンプレートエンジンの「式」を導き出すことができます。
この記事の著者は、Smartyや他のテンプレートエンジンに非常に懐疑的であるように思われるかもしれません。 そうではありません。 かなり長い間、同じSmartyがテンプレートエンジンの役割を果たしているプロジェクトで働いていました。 そして、私は、機能が豊富なプロジェクトのコンテキストでこのテンプレートシステムを使用することを本当に気に入っています。
しかし、視覚と抽象のギャップに戻ります。 平均的なプロジェクトでテンプレートエンジンが満たさなければならない最小要件は何ですか?
- 変数をテンプレートに割り当てる機能
- 単一のHTMLテンプレートの個別の変数名前空間
- ページの一般的なフレームに1つのテンプレートを使用してフォームの構築を繰り返すことを回避するには、 'header.tpl'; ... require 'footer.tpl';が必要です。 各ファイル内
ところで、「平均」プロジェクトは、個人的な規模でWebアプリケーションの複雑さを測定する特定の基準であり、ほぼ以下の基準を満たしています。
- プロジェクトは、オンラインストアまたはソーシャルコミュニティです。
- 10〜20種類のページ。 私は強調します-ページではなく、ページの種類。 例:製品の説明ページ。 つまり このタイプのページには1つのhtmlテンプレートがありますが、ディレクトリがコンテンツで満たされている場合、多くのページ自体があります。
開発者ごとに独自の規模があるため、この問題について厳密に判断しないでください。
言葉から行為に移りましょう。
3つのメソッドのみで構成される最も単純なクラスを考えます。
<?php class Template { private $_tmpl; private $_vars = array(); public function __construct($filename) { $this->_tmpl = $filename; } public function assign($name, $value) { $this->_vars[$name] = $value; } public function render() { if (count($this->_vars) > 0) { extract($this->_vars); } $tmplPath = "../templates/{$this->_tmpl}.tpl"; if (file_exists($tmplPath)) { require $tmplPath; } else { throw new Exception(" <strong>{$this->_tmpl}</strong> "); } } }
このクラスを使用した例を見てみましょう。 次のディレクトリ構造を作成します。
/ wwwroot
|
-/クラス
| -Template.php
-/テンプレート
| -Main.tpl
| -Catalog.tpl
| -Product.tpl
| -Index.tpl
| -404.tpl
|-index.php
Main.tpl
<!-- --> <!DOCTYPE html> <html> <head> <title></title> </head> <body> <?php echo $content ?> </body> </html>
Catalog.tpl
<!-- --> <p> №<?php echo $ID ?></p>
Product.tpl
<!-- --> <p> №<?php echo $ID ?></p>
Index.tpl
<!-- --> <p> </p>
404.tpl
<!-- 404- --> <p> !</p>
index.php
/** * . * , echo- print-, , . */ ob_start(); // require dirname(__FILE__).'/classes/Template.php'; // // , 404.tpl // , if (isset($_GET['route']) && $_GET['route'] == 'catalog') { $tmpl = new Template('Catalog'); $tmpl->assign('ID', $_GET['ID']); $tmpl->render(); } else if ($_GET['route']) && $_GET['route'] == 'product') { $tmpl = new Template('Catalog'); $tmpl->assign('ID', $_GET['ID']); $tmpl->render(); } else if (!isset($_GET['route'])) { $tmpl = new Template('Index'); $tmpl->render(); } else { header("HTTP/1.0 404 Not Found"); $tmpl = new Template('404'); $tmpl->render(); } // $content = ob_get_clean(); // $tmpl = new Template('Main'); $tmpl->assign('content', $content); $tmpl->render();
例からわかるように、カタログと製品ページの内容は、$ _GET ['ID']の値に応じて変わります。 T.O. 2種類のテンプレートと、これらのテンプレートからアプリケーションが生成するページ数に制限はありません。
結論:すべての種類のツールを豊富に提供する洗練されたテンプレートライブラリを使用するために、関与しているすべてのプロジェクトに努力しないでください。ほとんどの場合、これらは適切に使用されません。 独自のソリューションを作成することをお勧めします。これにより、時間とシステムリソースが節約され、最も重要なことは、神経が整然と維持されることです。
ご清聴ありがとうございました。