Smartyを使う

Daisukeh 2009/01/19 10:01 投稿
Daisukeh 2009/01/22 10:19 解説
Daisukeh 2009/08/06 15:14 移設

記事一覧

 PHPで作られているDokuWikiは、非常にPHPと親和性が良く、デフォルトで<php>タグを使ってコンテンツ内にPHPコードを書くことができる。これって実は非常に使いやすい機能で、自分のようにウィキを CMS の代わりに使ったり、ウェブ・プログラミングをしようとする人にとっては、DokuWikiがフロントエンドになってくれるから、とても便利なのだ。<php>タグにそのままコードを書いてもいいのだけれど、データベースなどから動的に生成した情報を整形して表示しようとするとき、DokuWikiの助けを借りることはできない。1)従って、DokuWikiとは独立したテンプレートエンジンであるSmartyを使えるように、プログラムを作ってみた。

 作ったプログラムはプラグインではなく、plugin:phpincプラグインを利用して、外部PHPとして呼び出す方式。Smartyの初期化とレンダリングのヘルパー関数を実装してみた。レンダリングにはテンプレートを直接文字列で渡すヘルパー関数も用意した。通常Smartyは、テンプレートファイル(*.tpl)を指定したディレクトリに用意して、レンダリング時に引数として渡さなければならないが、この関数を使えばDokuWiki内のPHPコードでテンプレート文字列を記述できるため、ロジックとテンプレートが一緒に見えて便利だと思う。

 「テンプレートとロジックを一緒に記述する」というのはSmartyの本来の目的から逸脱しているように思えるが、PHPの文字列内変数展開で HTML をレンダリングするよりも、キャッシュや各種ヘルパー関数が使えるSmartyで、ワンタイム・レンダリングする方が容易だし安全だと思うのだ。

 使い方はこんな感じだ。

DokuWikiでの使用例

<phpinc=smarty.php>
<php>
  $smarty = smarty();
  $smarty->assign('name', 'Daisukeh');
  $template = '<div align="center">'
            .   '<div style="margin:1em;padding:1em;background-color:yellow;">'
            .     'Hello, {$name}!'
            .   '</div>'
            . '</div>';
  smarty_display_immediate('sample', $template);
</php>

実行結果はこんな感じになる。2)

Hello, Daisukeh!

 書き忘れたけど、Smartyを使うにはまずインストールしなければならない。DokuWikiを使っている(もしくは使おうとしている)人であれば、PHPのインストールとコンフィギュレーションは知っているはずだから、多くは語るまい。http://www.smarty.net/

Smartyを使うためのPHPプログラム「smarty.php」。plugin:phpincの指示どおりに /phpincludes ディレクトリに配置する。

ダウンロードsmarty-090122.zip

smarty.php

<?php
 
  // Smartyプラグイン   2.00 09/01/15 Daisukeh
 
  function smarty()
  {
    // Smartyオブジェクト生成・初期化
    $smarty_plugin = 'smarty_plugin';
    if(!array_key_exists($smarty_plugin, $GLOBALS))
    {
      require_once('Smarty/Smarty.class.php');
      $smarty = new Smarty();
      $smarty_dir            = $_SERVER['APPL_PHYSICAL_PATH'] . '/smarty/';
      $smarty->template_dir  = $smarty_dir . 'templates/';
      $smarty->immediate_dir = $smarty_dir . 'templates/immediate/';
      $smarty->compile_dir   = $smarty_dir . 'templates_c/';
      $smarty->config_dir    = $smarty_dir . 'configs/';
      $smarty->cache_dir     = $smarty_dir . 'caches/';
      if(!file_exists($smarty_dir))
      {
        mkdir($smarty->template_dir,  0777, true);
        mkdir($smarty->immediate_dir, 0777, true);
        mkdir($smarty->compile_dir,   0777, true);
        mkdir($smarty->config_dir,    0777, true);
        mkdir($smarty->cache_dir,     0777, true);
      }
      $GLOBALS[$smarty_plugin] = $smarty;
    }
    return $GLOBALS[$smarty_plugin];
  }
 
  function smarty_display($template, $parameter = '', $cache = false)
  {
    // 外部テンプレートのレンダリング
    if($template == '') return;
    $smarty = smarty();
    if($cache)
    {
      $smarty->caching        = 2;
      $smarty->cache_lifetime = 3600;
    }
    $smarty->display($template, $parameter);
  }
 
  function smarty_display_immediate($name, $template, $cache = false)
  {
    // テンプレート文字列によるレンダリング
    if(($name == '') || ($template == '')) return;
    $name = mb_eregi_replace('[^\.0-9a-z]', '', $name);
    if(!eregi('\.tpl$', $name) && !eregi('\.html$', $name)) $name .= '.tpl';
    $smarty = smarty();
    $filename = $smarty->immediate_dir . $name;
    if(file_put_contents($filename, $template) == false) return;
    if($cache)
    {
      $smarty->caching        = 2;
      $smarty->cache_lifetime = 3600;
    }
    $smarty->display($filename, 'immediate');
  }
 
?>

 以前にPukiWikiを使っていたときも、プラグインとしてSmartyを使えるようにしていたが、自分の予想に反して使いやすく、MySQLPHPとの組み合わせで使っていた。DokuWikiはコードが直接コンテンツ中に書けるので、もっと使いやすいことは間違いないだろう。

1) 正確には内部変数やプラグインへのアクセスは可能だが、少々面倒
2) サーバー移管に伴い、実行サンプルではなく、実行結果の埋め込みとしました。

掲示板

, 2013/09/15 21:23
It's woufnrdel to have you on our side, haha!
Enter your comment
 
 
programming/dokuwiki/smartyを使う.txt · 最終更新: 2009/08/06 15:23 by daisukeh
 

Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS
Driven by DokuWiki Powered by Google do yourself a favour and use a real browser - get firefox ! GIMP is the GNU Image Manipulation Program. Adobe Flex smarty : Template Engine