8行のサイトのPHPマトリョーシカまたはテンプレート

2003年に思いついた(8行の)テンプレートについてお話します。それ以来、テンプレートは私を失敗させず、改善を必要としませんでした。

パターンの本質は、小さな入れ子人形が大きなものの一部である場合の入れ子人形の原理です。
実際には、次のようになります。最初のphpテンプレートの名前を示し、その中に親テンプレートの名前を記述します。このテンプレートは、そのphp親を指すこともできます。

画像

物理的には、このように見えます。 Apacheで構成されたホストがあります http://start.local http://start.localブラウザのホームディレクトリを含む/home/start.local/www/index.php 、開始ルートファイル/home/start.local/www/index.phpます。

 <?load::integration('main.tpl');?> 


このテキストは次のように読む必要があります。ロードクラスは関数(メソッド) load::integration()呼び出し、そこに1つのパラメーター-行'main.tpl'ます。

ここで、main.tplは最初のphpテンプレートのファイル名であり、 load::integration()関数には、指定されたテンプレートを処理できるメカニズムが含まれています。 具体的には、mail.tplの結果が埋め込まれるdefault.tplなど、main.tplテンプレートに別のテンプレートを書き込むことができます。 次に、default.tplは親テンプレートを指定することもできます(図を参照)。 より高いテンプレートが指定されていない場合、 load::integration()関数はテンプレートのアセンブリを停止し、すべてのテンプレートの全体的な結果をブラウザに提供します。

次に、すべてがどのように機能するかを説明し、コードをダウンロードするためのリンクを提供します。



このスキームは、サーバー上の各ページ(この場合は開始ファイルindex.php)の処理を開始する前に、スクリプトを実行する前に指定したファイルを最初にダウンロードする必要があることをPCPに指定するという事実により機能します。 これは、ファイル/home/start.local/www/.htaccessように1行で実行されます。

 php_value auto_prepend_file /home/start.local/bin/lib/config.mdl 


この場合、便宜上config.mdlファイルを指定しました。 その内容は次のとおりです。

 #  OC:    define("OS", getenv("COMSPEC")? ";": ":"); # ,  -    #   -. #,    dirname,   , # -    , #   , ..    /home/start.local/bin ini_set("include_path", ini_get("include_path").OS.dirname(dirname(__FILE__))); #   - load.cls require_once 'lib/load.cls'; #  - create.cls,     require_once 'lib/create.cls'; # - db.cls,      #require_once 'lib/db.cls'; 


したがって、config.mdlファイルを使用するロードクラス( /home/start.local/bin/lib/load.cls )およびそのload::integration()関数は、すべてのスクリプトに対してプリロードされます。

ロードクラスのコードを見てみましょう。

 <? class load { static $layout = ''; static $title = ''; static $body = ''; static $path; static $db; static function integration($maket) { #    self::$path = self::path(); #    //self::$db = new db(); do { $current = self::$layout; ob_start(); require_once "tpl/" .$maket; self::$body = ob_get_clean(); $maket = self::$layout; } while ($current != self::$layout); echo self::$body; } static function path($url='') { $var = (!$url)? dirname(getenv("SCRIPT_NAME")): $url; return explode("/", trim($var, "/\\") ); } } ?> 


ご覧のとおり、関数load::integration()は、do {}で始まる8行のみが含まれています。 その本質は、テンプレートのコードを実行し、実行結果を変数self::$body保存することです。 さらに、開始テンプレートが変更された場合に操作を繰り返す必要があるかどうかのチェックがあります。

次に、テンプレートmain.tplのコードを見てみましょう。
 <? load::$layout = 'default.tpl'; load::$title = ' '; ?> <h2> </h2> <p>  </p> 


制御変数load::$layoutはここで指定され、親テンプレートを指します。 また、default.tplテンプレートで使用されるオプションの変数load::$title

default.tplテンプレートコードを見てみましょう
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional"> <html> <head> <title><?=load::$title?></title> </head> <body> <table align="center" width="600"> <tr valign="top"> <td width="150"> <? if ( !empty(load::$path[0]) ) { ?> <p><a href="<?=create::file('/', 'main.tpl')?>"></a></p> <? } else { ?> <p>:</p> <? } ?> <p><a href="<?=create::file('/news/', 'page.tpl')?>"></a></p> <p><a href="<?=create::file('/cont/', 'page.tpl')?>"></a></p> </td> <td> <?=load::$body?> </td> </tr> </table> </body> </html> 


ご覧のとおり、これは通常のphpコードが配置されるhtmlマークアップにすぎません。 php挿入の中には、変数load::$body出力するための出力があります。 この変数には、main.tplコードの結果、または変数load::$layoutを親として示す他のテンプレートが含まれます。

default.tplテンプレートには、親テンプレートを示すload::$layout変数が存在しないことが重要です。したがって、 load::integration()関数は、テンプレート内でアクション全体が実行され、do {}ループを終了して最終結果を出力します。 、つまり 実行結果をブラウザに提供します。

次に、default.tplに記述されている、サイトのメニュー内のリンクを見てみましょう。たとえば、

 <a href="<?=create::file('/news/', 'page.tpl')?>"></a> 


ここでは、リンクではなくaタグのhref属性で、 create::file()クラスのcreate::file()関数の結果を出力する必要があることが示されています。

この関数の本質は非常に単純です-指定されたパスにファイルを作成し(これが最初のパラメーター- '/news/' )、その中の最初のテンプレートへの呼び出しを記録します(これは2番目のパラメーター'page.tpl' )。

create::file()関数の結果は2つのアクションになります。
  1. href属性には、リンクが追加されます。 ブラウザでは、このようなリンクは次の形式を取ります
     <a href="/news/"></a> 
  2. 指定されたパスのサーバーにファイルが作成され、/ /home/start.local/www/news/index.phpが表示されます。次の内容が含まれます
     <?load::integration('page.tpl');?> 


つまり 指定されたパスにはstart page.tplテンプレートが含まれ、その処理は考慮されるmain.tplに似ています。

default.tplテンプレートのif()条件については説明しません。 これはテンプレートのロジックには影響しませんが、純粋にサイトのデザインのみを参照します。

結論として、 create::file()関数をcreate::file()してcreate::file()クラスのコードを見ることが残っています。 コードは次のとおりです。
 <? class create { #    static function dir($arr, $dir='') { if ($dir=='') $dir = $_SERVER['DOCUMENT_ROOT']; #  chdir($dir); #    foreach ($arr as $a) { if ( $a=='' ) continue; if( !is_dir($a.'/') ){ mkdir($a, 0770) or print("   $dir/<b>$a</b><br>"); } chdir($a); $dir .= '/' .$a; } return $dir; } #       static function file($path, $template, $content='') { #    $path = trim($path, '/'); #  $arr = explode('/', $path); #    $end = array_pop($arr); #     if ( !strpos($end, '.php') ) { #    array_push($arr, $end); $end = 'index.php'; $temp[ $path ] = '/'.$path.'/'; $temp[ '' ] = '/'; $path = $temp[ $path ]; } else { $path = '/'.$path; } $dir = self::dir($arr); #   #   . $fp = fopen($end, "w+") or print ("   $dir/<b>$end</b>!"); #  $content = $content==''? "<?load::integration('$template');?>": $content; #  . fputs($fp, $content); # . fclose ($fp); return $path; } } ?> 


実際には2つの関数(メソッド)があります。
  1. フォルダーの作成、 create::dir()関数
  2. フォルダー内にファイルを作成し、どのテンプレートを使用して開始するかを示す1行でファイルを埋めcreate::file()関数が考慮されます

以上です! 8行。 私のホストstart.localのアーカイブをより明確にダウンロードできます。

この手法により、私は純粋なPCPで8年間サイトを書いてきましたが、悲しみはわかりません。
カスタムデザインセクションが必要ですか? 2つの点で、新しいテンプレートを作成し、そこに別のデザインを接続します。
サイトにフォームを追加する必要がありますか? フォームを別のテンプレートで作成し、テンプレートエンジンまたは通常のrequire_once挿入を使用して接続します。

もちろん、データベース、フォーム、またはレターを操作するための、かなりの数の関連するクラスと関数を蓄積しています。 しかし、肝心な点は、成果を取得して簡単に使用し、サードパーティのライブラリをPC matryoshkasに接続できることです。 これはたった8行のおかげで機能します。 のこぎり抜きで、タンバリンで引っ張って踊る。

私の経験が役に立つことを願っています。 たとえば、それができることを証明する必要がある状況では、一部のシステムのフレームワーク内では、これを達成する方法がわからないだけです。

PS。
次の記事では、phpMyAdminを使用してサイトデータベースを管理するだけでよいことを説明します。 リンクされたフィールドの識別子を変更するだけでなく、この識別子の背後にあるリンクテーブルから完全なリンクデータを同時に表示できます。

Source: https://habr.com/ru/post/J126980/


All Articles