テンプレートエンジンを使用する方法

ネストされたテンプレートはタイトルを設定する必要があります



ほとんどの場合、このような問題に遭遇しました。ブロックはページの中央に表示され、このブロックはタイトルを設定しますが、実際にはタイトルは既に頭に表示されています。



ソリューション(AlexHampに感謝)



フッターとヘッダーの概念を放棄し、ネストされたブロックの概念に進みます。 ネストされたブロックの再生成の問題は残ります。次のように解決されます。まず、ネストされたブロックのコンテンツを生成し、それらにタイトルを設定してから、メインページテンプレートに表示します。



ページテンプレート:

 {assign var = "pageTitle" value = "My site"}
 {if!empty($ innerTemplate)}
	 {インクルードファイル= $ innerTemplate assign = "innerContent"}
 {else}
	 {assign var = "innerContent" value = "ネストされたテンプレートなし"}
 {/ if}

 <HTML>
 <HEAD>
     <TITLE> {$ pageTitle} </ TITLE>
 </ HEAD>
 <BODY>
 {$ innerContent}
 </ BODY>
 </ HTML>


今、内部テンプレート:

 {assign var = "pageTitle" value = "My site:News"}
 <h1>ニュース</ h1>
 ...その他のニュース出力...




共通の名前空間を持つQuickieなどのテンプレートエンジンを使用する場合、これで十分ですが、スマートで作業する場合は、スクリプトで次の操作を行う必要があります。

 $ pageTitle = '';
 $ smarty-> assign_by_ref( 'pageTitle'、$ pageTitle);


これで、スクリプトからの$ pageTitleを使用して内部テンプレートの変更が行われ、それによって出力が実行されます。



したがって、ヘッダーを生成するタスクを内部テンプレートに転送することができました。



テンプレートでデータを生成しますか?



「今すぐスパゲッティコードを見せてくれて、このトマトを投げます!」と思ったのではないでしょうか。 しかし、私は急いであなたを止めます! ディスプレイとモデルを許容可能な間隔でリンクする問題を解決する方法について説明します。 多くの場合、インフォーマーなど、あらゆる場所にブロックを導入する必要があります。たとえば、ユーザーのニックネーム(すべてのメッセージ、コメント、全員)の横に表示されるブロックを取り上げ、それに関する小さな情報を吸収します(時間を登録して、userpic ) もちろん、一部の達人は言う:このデータの生成をモデルで直接使用する! これらのユーザーログインを生成するすべての場所で、関連情報を生成します! 私はあなたに同意し、あなたがそれを行うことができない場合でも、プロジェクトのアーキテクチャは悪臭を放ち始めますが、私たちはしばしば理想的ではない状況で作業する必要があり、時には私たちは、例えば他人のコードで、またはブラックボックス内。 拡張機能の書き方 頭に浮かぶ最初のことは、関数を記述してスマートに登録してから呼び出すことです。たとえば、次のようになります。{getUserRegDate userlogin = $ login}多くの関連情報が必要な場合、解決方法は面倒です。



そうすることをお勧めします:

情報にアクセスするクラスを宣言し、情報の抽出方法にすべてのロジックを含めます。

クラスUserInfo(){
     public $ regDate;
     public $ iniciateStatus = false;
     public iniciate($ login){
         if(ログインのデータを読み取ります){
           データを取得してコンテナに書き込みます
            $ this-> regDate = ...
            $ this-> iniciateStatus = true;
         }その他
              $ this-> iniciateStatus = false;
     }
 }


そしてそれを接続する

 $ smarty-> assign(新しいUserInfo()、$ userInfo);


今、テンプレートでそれを使用する方法?

 {if $ userInfo-> iniciate($ login)}
    登録済み{$ userInfo-> regDate | date_format}
 {/ if}




これをすべてサブパターンブロックにカプセル化し、次のように呼び出す必要があります。

 {インクルードファイル= userInfoBlockログイン= $ログイン}


その結果、モデルからテンプレート内のデータを照会し、それらを最小限に混合するという問題に対するかなりエレガントなソリューションが得られます。

これは、たとえば、テンプレート自体のプロセスで、モデルからさらにデータが必要であることがわかった場合に必要です。 そして、私の実践が示しているように、これは必ずしも貧弱なシステムアーキテクチャを意味するわけではありません。




UPD

制御アクセスなしで気に入らない場合は、制限できます。

最初に、データを割り当てます。テンプレートには、すでに簡単に書き込みます。

{if $ userInfo-> iniciate($ login)}

登録済み{$ userRegDate | date_format}

{/ if}




trueの場合、名前の競合が発生します。



All Articles