カスタムテンプレートリソース

PHPからアクセスできるあらゆるところからテンプレートを取得出来ます。 データベースやソケット、ファイルなどからです。 ユーザーはリソースプラグイン関数を書き、それを Smarty に登録することで、 PHPからアクセスできるあらゆるところからテンプレートを取得します。

提供しようと考えている関数について詳しい情報が必要なら リソースプラグイン のセクションを参照して下さい。

注意

組み込みの file: リソースは上書きできないので注意して下さい。 しかし、別のリソース名で登録すれば、ファイルシステムにあるテンプレートを他のやり方で取得するリソースプラグインを提供出来ます。

例 16.10. カスタムのテンプレートリソースを使う


<?php

/**
* MySQL リソースプラグイン
*
* Smarty のテンプレートと設定を格納するために、MySQL をストレージとして使う
* カスタムAPI ベースの実装
*
* テーブル定義:
* <pre>CREATE TABLE IF NOT EXISTS `templates` (
*   `name` varchar(100) NOT NULL,
*   `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
*   `source` text,
*   PRIMARY KEY (`name`)
* ) ENGINE=InnoDB DEFAULT CHARSET=utf8;</pre>
*
* デモデータ:
* <pre>INSERT INTO `templates` (`name`, `modified`, `source`) VALUES ('test.tpl', "2010-12-25 22:00:00", '{$x="hello world"}{$x}');</pre>
*
* @package Resource-examples
* @author Rodney Rehm
*/
class Smarty_Resource_Mysql extends Smarty_Resource_Custom {
 // PDO instance
 protected $db;
 // prepared fetch() statement
 protected $fetch;
 // prepared fetchTimestamp() statement
 protected $mtime;

 public function __construct() {
     try {
         $this->db = new PDO("mysql:dbname=test;host=127.0.0.1", "smarty", "smarty");
     } catch (PDOException $e) {
         throw new SmartyException('Mysql Resource failed: ' . $e->getMessage());
     }
     $this->fetch = $this->db->prepare('SELECT modified, source FROM templates WHERE name = :name');
     $this->mtime = $this->db->prepare('SELECT modified FROM templates WHERE name = :name');
 }
 
 /**
  * テンプレートおよびその変更時刻をデータベースから取得する
  *
  * @param string $name template name
  * @param string $source template source
  * @param integer $mtime template modification timestamp (epoch)
  * @return void
  */
 protected function fetch($name, &$source, &$mtime)
 {
     $this->fetch->execute(array('name' => $name));
     $row = $this->fetch->fetch();
     $this->fetch->closeCursor();
     if ($row) {
         $source = $row['source'];
         $mtime = strtotime($row['modified']);
     } else {
         $source = null;
         $mtime = null;
     }
 }
 
 /**
  * データベースから、テンプレートの変更時刻を取得する
  *
  * @note このメソッドの実装は任意です。
  * コンパイル済みのテンプレートを読み込むよりも変更時刻の取得が速い場合のみ実装するようにして下さい。
  * @param string $name template name
  * @return integer timestamp (epoch) the template was modified
  */
 protected function fetchTimestamp($name) {
     $this->mtime->execute(array('name' => $name));
     $mtime = $this->mtime->fetchColumn();
     $this->mtime->closeCursor();
     return strtotime($mtime);
 }
}


require_once 'libs/Smarty.class.php';
$smarty = new Smarty();
$smarty->registerResource('mysql', new Smarty_Resource_Mysql());

// using resource from php script
$smarty->display("mysql:index.tpl");
?>

  

Smarty のテンプレート内でこのカスタムリソースを使うには、次のようにします。


{include file='mysql:extras/navigation.tpl'}