テンプレートエンジンsmartyの動作原理と使用例

5811 ワード

テンプレートエンジンはテンプレートファイルとデータ内容を統合するためのプログラムであり、ウェブサイトの開発に便利で、コードの分離とメンテナンスに有利であり、テンプレートを理解するには、その動作原理を知っておくことが望ましい.
テンプレートファイルは一般的にHTML xml jsなどのタイプのファイルですが、テンプレートエンジンを使わずにWebページにデータを表示するにはphpでHTMLを出力する必要がありますが、テンプレートを使うにはテンプレートエンジンプログラムにデータを渡すだけでいいので、どのテンプレートファイルを使うかを教えてあげると、自然とデータとページを結合して戻ったり出力したりします.テンプレートには少なくとも以下の機能があります.テンプレートエンジンにデータを提供する機能.2.テンプレートの機能を指定します.3.結果を出力する機能.一般的にプログラマーたちがテンプレートエンジンを使用するのを容易にするために、開発者はその機能をある程度カプセル化し、クラスにカプセル化し、インスタンス化した後、テンプレートエンジンオブジェクト、すなわちテンプレートエンジンオブジェクトを得る.1つのオブジェクトにはその属性と方法があり、smartyオブジェクトの属性と方法はsmartyマニュアルで検索され、まずその方法について述べる.assignがテンプレートにデータをコミットする方法.テンプレートファイルを個別に指定する方法は出力方法に統合されていません.出力方法には2つのdisplayが直接fetchを出力して統合されたHTMLコードを返します.出力にはassignが主に使用されています.私たちが表示するデータは多様性が多いので、1つの量であってもよいし、1つの配列量であっても多次元配列であってもよいので、異なる状況でどのようにsmartyに正しく提出すべきかは問題であり、提出後どのように対応して表示するかも問題であり、smartyエンジンが使用する解釈方法は、HTMLファイルをphpファイルに変換してから、それぞれの量を付与し、このphpファイルを実行し、異なるデータフォーマットに対応し、固定的な書き方をしている.このような書き方でテンプレートファイルに対応するタグを付ける必要があります.smartyがデフォルトで使用するテンプレートタグは、例えば{$a}というタグがecho$aに等しいペアです.phpでは、$smarty->assign(「a」,「値」)という対応する付与プロセスが必要です.複数の量を割り当てると、1つずつ書くのが面倒になります.smartyは、データベースから1つの文章を読み出し、ページに表示されるコンテンツにタイトルコンテンツの作者時間があるなど、データ構造はほぼこのように考えています.
 
  
array([id]=>1,['title']=>" ",…);

テンプレートにはいくつかの対応するタグが必要です.例えば、
 
  

{$title}


{$content}


個々の付与が面倒で、assignメソッドは配列の直接付与をサポートし、$rows=データベースから読み出したデータ、
$smarty->assign($rows);smartyはデータインデックスを自動的に1つずつ付与しますが、この場合は変数の衝突を避けるために、配列形式で直接付与することを望んでいます.例えば、
 
  
$rows = ,
$smarty->assign("rows",$rows);

テンプレートのタグが{$rows}である場合、arrayはphp内の直接echo配列のようにphp出力の具体的な量がecho$rows['title']であることしか見えません.smartyで規定された記号は点記号,{$rows.title}であり,この方法では
 
  
echo $rows['title']

各テンプレートには対応する書くルールがあります.次に、文章のリストを表示するとします.mysqlが10個のデータを返してくれたとします.10個のデータが表示されます.そして、彼らのインデックスは完全に同じです.プログラミングの考え方によって結果を求める過程を知っています.
 
  

  • 1111

  • 222

  • 333

  • 4444



もしこれが私たちが出力したい様子なら
まずこれは複数の量でもちろん配列を使っていますが、
 
  
$list=array();
While($rows= ){
$list[]=$rows;
}
$smarty->assign("list",$list);

まずデータを1つの配列に置いてからsmartyに一度に渡します.リスト変数の中には2次元配列があります.もし私たちがこのような2次元配列を手に入れたら、中のすべての値を表示するには、循環出力が一番いいです.同じsmartyは私たちに循環用のマークを提供しています.sectionとforeach
sectionタグフォーマット
 
  
{section name= loop= }
...
{/section}


{section name=i loop=$list}

  • {$list[i].title}

  • {/section}

    上のコードはforループに似ているように見えますが、ここのiはforループの中の$iではなくこのループの名前だけです.$list[ループ名]という書き方は配列から毎回1つの量を得ることができます.さっき言ったように、$listは2次元配列ですが、$list[i]は配列です.
    もう一つの書き方はforeachの文法は以下の通りです.
     
      
    {foreach key= item= from= }

    {$key}:{$item}

    {/foreach}

    {foreach  item=v from=$list}

  • {$v.title}
  • {/foreach}


    ループリスト変数は各量vに割り当てられ、変数vから表示するインデックスを指定します.ループタグのほか、ファイルを含むなど、よく使われる文法タグも提供されています.条件判断では、HTMLにはページヘッダなどのファイルが含まれていないことがわかりますが、smartyは{include}のタグを提供しています.phpのようにファイルを含むことができます.例えば{include file="ファイルパス"}というタグフォーマットは固定されており、このパスはテンプレートエンジンが指定したパスの下にある必要がありますが、条件判断の構文はphpと同様にif条件判断であり、構文は以下の通りです.
     
      
    {if == }

    {else}

    {/if}

    また、elseを書かずに実際に表示するコンテンツだけを書くこともできます.例えば、ウェブページにログイン口がある場合、ログイン前にフォームログイン後に表示されるのはユーザー情報です.テンプレートに値を付けたと仮定します.例えば、$usernameユーザーログインという量でユーザー名がログインしていないという量が空になります.このように書くことができます.
     
      
    {if $username !=""}
    {$username}
    {else}

    {/if}

    phpでこの変数を準備し、smartyに値を付けるだけで、これらのマークのほかにマークがあるので、マニュアルを参照してください.
    次に変数レギュレータです.多くの場合、データベースから得られたデータは、小さな処理で出力されます.例えば、日付フォーマットで、年月日だけを表示します.また、出力された内容の改行を変更してこそ、ページに対応する様子を表示することができます.この場合、smartyが持っている変数レギュレータを使用することができます.フォーマットは以下の通りです.
     
      
    { | : }

    内容部分が表示されている場合は、すべての改行を次のように表示します.
     
      
    {$content|nl2br}

    日付のフォーマットはdate_format例えばマニュアル
     
      
    index.php:

    $smarty = new Smarty;
    $smarty->assign('yesterday', strtotime('-1 day'));
    $smarty->display('index.tpl');

    index.tpl:

    {$smarty.now|date_format}
    {$smarty.now|date_format:"%A, %B %e, %Y"}
    {$smarty.now|date_format:"%H:%M:%S"}
    {$yesterday|date_format}
    {$yesterday|date_format:"%A, %B %e, %Y"}
    {$yesterday|date_format:"%H:%M:%S"}

    OUTPUT:

    Feb 6, 2001
    Tuesday, February 6, 2001
    14:33:00
    Feb 5, 2001
    Monday, February 5, 2001
    14:33:00


    本当にだめです.phpで処理してから賦値することができます.
    以下に構成を書きます
     
      
    define("ROOT",str_replace('\\','/',dirname(__FILE__)).'/');//
    // smarty
    require ROOT.'lib/smarty.class.php';
    $samrty = new smarty();// smarty
    //
    $smarty ->setTemplateDir(ROOT.'templates/')
            ->setCompileDir(ROOT.'templates_c')
            ->setPluginsDir(ROOT.'plugins/')
            ->setCacheDir(ROOT.'cache/')
            ->setConfigDir(ROOT.'configs/');
    $smarty->caching = false;//
    $smarty->left_delimiter = '$smarty->right_delimiter = '}>';
    ?>