Blitzテンプレートエンジンの概要

Blitzドキュメントから:非常に大規模なインターネットプロジェクト向けの非常に高速で強力なテンプレートエンジン。



いくつかの事実を引用します。

  1. これは、Habréが使用するテンプレートエンジンです。
  2. このテンプレートエンジンは、負荷の高いプロジェクトで使用され、Cで記述され、PHP拡張機能として接続されています。
  3. その速度はphp自体に匹敵します(カットの下のベンチマーク)。
  4. テンプレートにはアプリケーションロジックがなく、ループや分岐などがないため、レイアウト設計者は満足します。
  5. 著者の一人は、アレクセイ・ライバック漁師です。








ベンチマークテンプレート



Blitzは、Smartyなどと根本的に異なるブロックテンプレートエンジンです。

Blitzと比較したSmartyはプログラミング言語です。



Blitzテンプレートの構文は、3つの構成要素に基づいています。

  1. ブロック(コンテキストです):{{BEGIN blockName}}ブロックの内容{{END}}
  2. 変数:{{$ var}}
  3. 関数呼び出し{{myFunc($ params)}}


ループ、条件ステートメント、およびその他の豊富な構文がありません。 これにより、ロジックの分離が保証されます。

プレゼンテーションロジックからのアプリケーション。 その結果、テンプレートはプロジェクトの成長に混乱することはありません。



コード編成の観点から、ビュー(MVC)コンポーネントは2つの部分に分けることができます。

  1. テンプレート (Blitzタグ付きのHTMLファイル);
  2. テンプレートコントローラー -これは、テンプレートの処理を制御するBlitzオブジェクトです(Webアプリケーションコントローラーと混同しないでください)。




テンプレートコントローラーは、プログラマーが多く処理できるテンプレートのすべての冗長ロジックを搭載しています

タイプセッターよりも効果的です。



いくつかの例:



1.伝統により:こんにちは、世界!




テンプレートtemplate.tpl:

 
    こんにちは、{{$ name}}!




スクリプト:

  
     $ template = new Blitz( 'template.tpl');
     echo $ template-> parse(array( 'name' => 'world'));




2.テンプレートはファイルからだけでなくダウンロードできます。


Blitzを試すには、ダウンロードできます

変数からスクリプトコードで直接テンプレート:

  
     $ template = new Blitz();
     $ template-> load( 'Hello、{{$ name}}!');
     echo $ template-> parse(array( 'name' => 'world'));




3.ブロック(コンテキスト):


ブロックは、必要に応じて表示できるテンプレートの一部です。

    こんにちは{{BEGINブロック}} {{$ name}} {{END}}


デフォルトでは、このテンプレートには文字列「hello」が表示され、ブロックは非表示になります。



次のコードは、ブロックを1回印刷します。

  
     $ template = new Blitz( 'some.tpl');
     $ template-> block( '/ block'、array( 'name' => 'Dude'));
     echo $ template-> parse();


結果
  「こんにちは」。 


ブロックの同義語はコンテキストです。 ブロックの出力は反復と呼ばれます。



明確にするために、ENDステートメントの後にブロックの名前を指定できます。

{{ENDブロック}}。

4.出力を数回ブロックします(リストまたはループ):


各ブロックを数回「反復」して、リスト(Smartyのサイクルのアナログ)、テンプレートコントローラーコードを表示できます。

     foreach(array( 'Dude'、 'Sobchak'、 'Donny')as $ i_name){
       $ template-> block( '/ block'、array( 'name' => $ i_name);
     }


前の例のテンプレートに対してこのコードを実行すると、次のことがわかります。

     「こんにちは、Donny Sobchak」


5.用語


次に、同じリストをコンマで区切って表示してみましょう。

これを行うには、ブロックまたはifステートメントを使用する2つの方法があります。



まず、ブロックを使用します。

 こんにちは{{BEGINブロック}} {{BEGINカンマ}}、{{END}} {{$ name}} {{END}} 




ループで繰り返します:

     $ need_comma = FALSE;
     foreach(array( 'Dude'、 'Sobchak'、 'Donny')as $ i_name){
        if($ need_comma){
            $ template-> block( '/ block /カンマ');
        } else {
            $ need_comma = TRUE;
        }
        $ template-> block( '/ block'、array( 'name' => $ i_name);
     }




私にとっては、あまりエレガントではありません。 このような単純なケースでは、ifステートメントを使用する方が適切です。



    こんにちは{{BEGINブロック}} {{if($ _ first、 ''、 '、')}} {{$ name}} {{END}}。




Blitzには、ブロックの定義済み変数があります: $ _first (最初の反復)、

$ _last (最後の反復)、 $ _total (総数)、 $ _num$ _even$ _odd

名前は、目的について簡単に推測できます。 定義することもできます

テンプレートコントローラーからの変数。



例としてさらに2つ:

     {{if(TRUE、 '2 + 2 = 4'、 '2 + 2 = 5');  }}
     {{if($ a、 "b"、$ c);  }}


6.コンテキストと反復の使用


ブロックの代わりに、3つの低レベルメソッドの組み合わせを使用できます。

コンテキスト設定および反復コンテキストメソッドは、1つのパラメーター(完全または相対)を取ります

パス、それ以降のすべてのセットおよび相対パスは、デフォルトでこのパスを使用します。

     $ template-> context( '/ block');
     foreach(array( 'Dude'、 'Sobchak'、 'Donny')as $ i_name){
       $ template-> iterate();
       $ template-> set(array( 'name' => $ i_name));
     }




コンテキストメソッドは、cd consoleコマンドのように機能します。

反復メソッドはブロックを「表示」します。



ブロックの使用簡単ですが、多くの場合、必要になります

コンテキストと反復を伴う低レベル操作。



7.すべては反復です


テンプレートの各状態は、特定のデータ構造によって記述できます。

前の例に次のコードを追加した場合:

     $ data = $ template-> getIterations();


$データの構造は次のとおりです。

  配列(
       0 =>配列(
           'block' =>配列(
                0 =>配列( 'name' => 'Dude')、
                1 =>配列( 'name' => 'Sobchak')、
                2 =>配列( 'name' => 'Donny')
            )
       )、
   )


これは、 解析メソッドを呼び出す前のテンプレートの内部状態です。



blocksetiteratecontextメソッドを使用してテンプレートをどうするか-

Blitzはこの配列を変更します。 解析メソッドが呼び出されたとき-ブリッツレンダリング

この構造に基づいたテンプレート。



さまざまな課題を実践し、ダンプで何が起こるかを確認して、迅速なデバッグを実現

あなたのコード。



8.すべて同じで、配列を通して:


     $データ=配列(
         0 =>配列(
             'block' =>配列(
                  0 =>配列( 'name' => 'Dude')、
                  1 =>配列( 'name' => 'Sobchak')、
                  2 =>配列( 'name' => 'Donny')
              )
         )、
     );

     $ template = new Blitz( 'some.tpl');
     echo $ template-> parse($ data);




some.tpl:

     {{BEGINブロック}} {{if($ _ first、 ''、 '、')}} {{$ name}} {{END}}




前の例と同じ結果ですが、

ブロック/コンテキスト/反復メソッドを使用せずに。



9.ネストされた反復


     $データ=配列(
        配列(
             'who' => 'soldiers'、
             'what' =>配列(
                 0 =>配列(
                     '動詞' => 'going'、
                     'details' =>配列(
                         0 =>配列( 'item' => 'nowhere')、
                     )
                 )、
                 1 =>配列(
                     「動詞」=>「盲目」、
                     'details' =>配列(
                         0 =>配列( 'item' => 'by')、
                         1 =>配列( 'item' => 'their')、
                         2 =>配列( 'item' => 'faith')
                     )
                 )
             )
         )
     );

     $ template = new Blitz();
     $ template-> load( '{{$ who}} {{BEGIN what}} {{$ verb}} {{BEGIN details}} {{$ item}} {{END}} {{END}}');
     $ template-> set($ data);
     echo $ template-> parse();




実行結果:

    信仰によって盲目にされない兵士




それがどのように機能するかを理解すれば、あなたは完全に認識しています。

コンテキストと反復。



10.テンプレートの一部を操作できます


テンプレート全体に関係なく、テンプレートの一部(ブロック)を使用すると便利な場合があります。

これは、 fetchメソッドを使用して実行できます。



some.tpl:

     {{BEGIN hello}}こんにちは、{{$ name}} {{END}}
     {{BEGIN bye}}さようなら、{{$ name}} {{END}}




コード:

     echo $ template-> fetch( '/ hello'、array( 'name' => 'Lena'));  //こんにちは、レナ
     echo $ template-> fetch( '/ bye'、array( 'name' => 'Sveta'));  //さようなら、Sveta


11.テンプレート内の関数呼び出し:


次のコード
  {{my_test($ a、 "foo"、 'bar'、TRUE、2005);  }} 
意味する

パラメーターを指定してmy_testメソッドを呼び出すもの。



次のようにmy_test関数追加します。

  クラスビューはBlitzを拡張します{
      関数my_test($ a){
           return '(user method called(' .__ CLASS __。 '、' .__ LINE__。 ')、a ='。$ a;
       }
   }

   $ template = new View();
   $ template-> load( 'user method call test:{{my_test( "test")}}');
   echo $ template-> parse();




結果:

    ユーザーメソッド呼び出しテスト:ユーザーメソッド呼び出し(blitztemplate、5)、a =テスト




結論として:



この概要は、 Quck Geek Blitz Tutorialチュートリアルの無料翻訳として書かれています。

詳細については、このテンプレートエンジンの使用の基本のみを示しています

ドキュメントを参照する価値があります



参照資料



BlitzプロジェクトのWebサイト: alexeyrybak.com/blitz/blitz_ru.html

テンプレートとベンチマークの例: alexeyrybak.com/blitz/lebowski_bench.tar.gz



All Articles