もう一度テンプレートについて

遅かれ早かれ、「サイト名刺」よりも高いステータスを持つサイトを作成する開発者は、「テンプレート」または「テンプレート」視覚プレゼンテーション(デザインテンプレートではない)などの概念に対処する必要があります。 これは何ですか テンプレートメカニズムを使用すると、内部ロジックなどを変更するときにhtml-レイアウト この分野では、レイアウトデザイナーとプログラマーの分業の観点からかなり柔軟なアプリケーションを作成し、大規模なアプリケーションでのコードの混乱を防ぐことができるいくつかのフラグシップソリューションが長い間ありました。 それらすべてを記述することは意味がありません。 これは、すでに私の前で何度も行われています。 さらに、ほとんどすべてのCMSおよびフレームワークには、アプリケーションロジックをプレゼンテーションロジックから分離するための独自のソリューションがあります。



もちろん、数万行のコードを含むプロジェクトの場合、顧客がプログラマーとレイアウトデザイナーの両方を雇う機会がある場合、テンプレートの機能はプロジェクトのすべての参加者にのみ有効です。 しかし、開発者がSmartyを3ページの単純なWebサイトに配置し始めると、これは私見では破綻します。 そのような場合、George Schlosneigelの素晴らしい本「Professional PHP Programming」-「ハンマーでハエを殺そうとする試み」からの表現を思い出します。



実際、同じSmartyを機能が非常にシンプルなサイトに統合すると、開発者は単に時間を費やします。 そして、ご存じのとおり、時間はお金です。 ほとんどの場合、顧客は自分のサイトがどのテンプレートエンジンで動作するかを気にしません。 顧客は費やされた時間をより心配しています。



サイトが「名刺」ではなく、2番目のAmazonではない場合はどうすればよいですか? 個人的には、この場合の問題に対する最適な解決策は、現在のリソースに必要な狭い範囲のタスクを解決するためだけに機能全体が強化された独自の自己記述型テンプレートシステムを使用することだと思います。 その後、特定の最小限の機能セットを使用して、単一のプロジェクトで必要に応じて拡張するユニバーサルテンプレートエンジンの「式」を導き出すことができます。



この記事の著者は、Smartyや他のテンプレートエンジンに非常に懐疑的であるように思われるかもしれません。 そうではありません。 かなり長い間、同じSmartyがテンプレートエンジンの役割を果たしているプロジェクトで働いていました。 そして、私は、機能が豊富なプロジェクトのコンテキストでこのテンプレートシステムを使用することを本当に気に入っています。



しかし、視覚と抽象のギャップに戻ります。 平均的なプロジェクトでテンプレートエンジンが満たさなければならない最小要件は何ですか?



ところで、「平均」プロジェクトは、個人的な規模でWebアプリケーションの複雑さを測定する特定の基準であり、ほぼ以下の基準を満たしています。



開発者ごとに独自の規模があるため、この問題について厳密に判断しないでください。



言葉から行為に移りましょう。



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種類のテンプレートと、これらのテンプレートからアプリケーションが生成するページ数に制限はありません。



結論:すべての種類のツールを豊富に提供する洗練されたテンプレートライブラリを使用するために、関与しているすべてのプロジェクトに努力しないでください。ほとんどの場合、これらは適切に使用されません。 独自のソリューションを作成することをお勧めします。これにより、時間とシステムリソースが節約され、最も重要なことは、神経が整然と維持されることです。



ご清聴ありがとうございました。



All Articles