SmartyからTwigに切り替えた方法

私はかつて熱烈なスマーティーファンでした。 Smartyには多くの利点があります。それは一般的であり、シンプルであり、使い慣れているなどです。 しかし、Smartyのプロジェクトの1つでは、重すぎて少しブレーキがかかっていることがわかりました。 私は、スマーティーが悪いとか、彼が価値がないと言っているのではありません。 いくつかの条件では、そのパフォーマンスは不十分であり、代替を探す必要がありました。 別の方法があり、Twigで仕事をする機会を得たことを非常に嬉しく思います。



Smartyは2番目のバージョンでしたが、コメントでは、3番目のバージョンには違いがあり、しばしば重要であることが事実です。



まず第一に、私はTwigをSmarty構文に微調整しようとしました。 完全ではありませんが、これを行うことができます。 このように:

$loader = new Twig_Loader_Filesystem('/templates'); $twig = new Twig_Environment($loader,array('charset'=>' utf -8','cache'=>'/templ_c','auto_reload'=>true)); $escaper = new Twig_Extension_Escaper(true); $twig->addExtension($escaper); $lexer = new Twig_Lexer($twig, array( 'tag_comment' => array('{*', '*}'), 'tag_block' => array('{', '}'), 'tag_variable' => array('{$', '}'), )); $twig->setLexer($lexer);
      
      





初期化時に、配列でtag_comment、tag_block、およびtag_valiableを宣言します。 Smartyで変数を表示できるようになりました。 移行は十分に便利ですが、今ではこれを行わない方が良いと理解しています。 構文は異種になります。



それでも、何かを混乱させないために、私はしばらくの間、いくつかのことに慣れ、ドキュメントをのぞかなければなりませんでした。 たとえば、配列の横断

 {for category in category_tree} {$category.name} {endfor}
      
      





代わりに

 {foreach from=$category_tree item=category} {$category.name} {/foreach}
      
      





Twigでは、変数のタグの再定義にもかかわらず、変数名の前にドル記号が表示されないことに注意してください。 Smartyからの移行でない場合は、より便利です。



ブロックは{/ if}ではなく{endif}で閉じられます。 最初は混乱しています。



または、たとえば、テンプレートエンジンで処理する必要のないブロック。

{literal} {/ literal}の代わりに{raw} {endraw}。



これらはすべて、移行に伴うマイナーな調整と適応です。 ほとんどの場合、これは構文が似ているという事実によってさらに複雑になります。



Smartyでの作業に慣れていますか?



最初はパターン構造です。 パターンは帽子、本体、地下室に押しつぶされました。 また、サイドブロックや他のブロックも際立っていました。 さらに、この全体がシーケンスのメインテンプレートに接続されました。 今、私はこれがまったくクールではないことを理解しています。 継承は素晴らしいです! 多くの場合、サイトページは同じ原則に基づいて構築されていますが、組織にはいくつかの種類のページがあります。 多くの場合、見出し/地下はどこでも同じですが、左/右メニューが左または右にジャンプするか、ページの一部にまったく表示されない場合があります。 Smartyでは、条件を作成して目的のテンプレートを接続し、その中の別のテンプレートを接続します。 小枝は違います。 ここでは、OOPと同様に、テンプレートは相互に継承され、テンプレートの一部を再定義できます。 これは素晴らしいです。 動きは実際には他の方向です-メインテンプレートから娘テンプレートへではなく、最終テンプレートを表示することにより、親の親からルートへと続きます。

メインテンプレートをヘッダー/地下室で構築し、サイドブロックを作成することもできます。その後、それから下位レベルの他のテンプレートを継承します。 彼らは簡単にサイドブロックを再定義します。 たとえば、メインテンプレートから左メニューのテンプレートと右メニューのテンプレートを継承できます。 より高いもの、誰から継承されたものは、より高い者のビジネスです。 そして、必要な作業に応じて、右メニューのテンプレートまたは左メニューのテンプレートのいずれかから最終テンプレートを継承します。 そして、心を変えて、左側のメニューテンプレートからではなく、右側のメニューテンプレートからテンプレートを継承できます。 このようなシンプルさ、透明性、柔軟性は私をとても幸せにします。 劇的な変更でも簡単です。 コードのビット。



メインの親テンプレート。



main.tpl

 <!doctype html> <head> <title>{block html_title}  {endblock}</title> </head> <html> <div class=”header”> </div> <div class=”body”> {block content}   . {*     ,       .*} {endblock} </div> <div class=”footer”></div> </html>
      
      





次に、メニューなしでページを作成します。

left_menu.tpl

 {extends "main.tpl "} {block html_title} {endblock} {*  *} {block content}    .        . {endblock}
      
      





そして今、メニューテンプレートは左側にあります。

left_menu.tpl

 {extends "main.tpl "} {block content} <div class=”left_menu”> {*  - *} {for category in category_tree} <a href=”?{$category.id}”>{$category.name}</a> {endfor} </div> <div class=”content”> {block page_content} {*  ,     content,      . *}   . {endblock} </div> {endblock}
      
      





そして終了ページ

 {extends "left_menu.tpl "} {block html_title} {endblock} {endblock} {block page_content}    .      ,    ,  . {endblock}
      
      





その結果、最終的なテンプレートは、接続、条件、その他すべてで混雑しません。 テンプレートの継承元を言うだけで、本質的にのみです。



Smartyを使用するとき、すべての変数をテンプレートに転送してそこに出力する必要があり、すべての処理はコードに含まれていたという事実に慣れています。 多くの場合、テンプレートエンジンの前に書式設定さえ行わなければならず、その結果、ミッシュマッシュが発生しました。 Twigでは、通常、ジェスチャーなしでテンプレートから実行ロジックを制御できます。 出力がフィールドの名前ではなく、メソッドの名前である場合、この場所にメソッドによって返される値が表示されます。 つまり ある種のカウント値を表示する必要がある場合、事前にカウントする必要はありません。これは出力で直接行われます。

 //   class User { public function free_space() { // - ,    . Return $result; } }   : {$user.free_space}
      
      





そしてそれだけです。 事前に考える必要はありません。すべてがうまくいき、すぐに解決します。 不快な瞬間は、クラスフィールドがプライベートの場合、getterがクラスに記述されていても、twigはそれを出力しません。



3番目は、独自の拡張機能を記述することです。 多くの場合、テンプレートエンジンに実装されていない機能が必要です。 小枝の拡張は非常に簡単です。 たとえば、出力を印刷する必要があります。 選択的に。



 class My_Twig_Extension extends Twig_Extension { //      . public function getFilters() { return array( 'typograph => new Twig_Filter_Method($this, 'typograph') ); } public function typograph($text) { return $typograph->parse($text); //        . } }
      
      





そして、初期化段階で接続します。

 $twig->addExtension(new My_Twig_Extension());
      
      





これで、処理する必要のある変数のテンプレートは、修飾子{$ page.content | typograph}を追加するだけで、それで値が処理されます。 テンプレートエンジンに値を渡して処理する前に、まずすべての値を並べ替える必要はありません。 テンプレートエンジンは引き続きアレイをバイパスして終了します。これは2回ではなく1回行われます。 拡張機能を作成してから、必要な機能を追加することができます。



Twigの後、私は本当にSmartyに目を向けたくありません。 それはあまりにも簡単で論理的であるため、すべてが彼と一緒になります。



All Articles