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

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


All Articles