Smarty3のリソース・プラグイン
Smarty3のリソース・プラグインについて
Smarty3(3.0.9)でリソース・プラグインを行うと以下エラーが出力され、データベース内のテンプレートを呼び出すことができません。
Uncaught exception 'SmartyException' with message 'Unable to load template db 'test.tpl'' in /usr/local/lib/php/smarty/sysplugins/smarty_internal_template.php:165 Stack trace: #0 /usr/local/lib/php/smarty/sysplugins/smarty_internal_template.php(554): Smarty_Internal_Template->isExisting(true)
#1 /usr/local/lib/php/smarty/Smarty.class.php(340): Smarty_Internal_Template->getRenderedTemplate()
#2 /usr/local/lib/php/smarty/Smarty.class.php(384): Smarty->fetch('test.tpl', NULL, NULL, NULL, true)
#3 /usr/local/apache2/htdocs/test.php(18): Smarty->display('test.tpl')
#4 {main} thrown in /usr/local/lib/php/smarty/sysplugins/smarty_internal_template.php on line 165
同様のプログラムでSmarty2*で実行するとうまく表示します。
Smarty3のマニュアル(英語版)を見てもうまくいきません。。
ご存知の方、ぜひ教えてください。
(環境)
OS:Debian 6.0.1
WebServer:Apache2.2.19
PHP:PHP5.3.6
MySQL:MySQL5.0.87
(プラグイン)
<?php
require('DB.php');
define("DB_FILE","mysqli://*****:*****@localhost/*****");
function smarty_resource_db_source ($name, &$source, $o_smarty)
{
$db = DB::connect(DB_FILE);
$stt = $db->prepare("SELECT source FROM templates WHERE name =?");
$rs = $db->execute($stt,array($name));
if(is_null($row=$rs->fetchRow(DB_FETCHMODE_ASSOC))){
return FALSE;
}else{
$source=$row["source"];
return TRUE;
}
}
function smarty_resource_db_timestamp($name, &$modified, $o_smarty)
{
$db = DB::connect(DB_FILE);
$stt = $db->prepare("SELECT * FROM templates WHERE name =?");
$rs = $db->execute($stt,array($name));
if(is_null($row=$rs->fetchRow(DB_FETCHMODE_ASSOC))){
return FALSE;
}else{
$modified=$row["modified"];
return TRUE;
}
}
function smarty_resource_db_secure($name, $o_smarty)
{
// 全てのテンプレートがセキュアであると仮定します
return true;
}
function smarty_resource_db_trusted($name, $o_smarty)
{
// テンプレートから使用しません
}
?>
(呼び出しファイル)
<?php
set_include_path('/usr/local/lib/php/smarty/:' . get_include_path());
@include('Smarty.class.php');
$o_smarty = new Smarty();
// Smartyのテンプレートのキャッシュファイル格納先を指定
$o_smarty->compile_dir = "/usr/local/apache2/htdocs/template_c";
$o_smarty->plugins_dir[]="/usr/local/apache2/htdocs/plugin";
$o_smarty->default_resource_type="db";
// phpスクリプトからテンプレートリソースを使用します
$o_smarty->display("test.tpl");
?>
(データベース)
CREATE TABLE templates (
name VARCHAR(100) NOT NULL default '',
modified TIMESTAMP,
source TEXT,
PRIMARY KEY (name)
) DEFAULT CHARACTER SET utf8;
-- Dumping data for table 'templates'
INSERT INTO templates VALUES('test.tpl', "2010-12-25 22:00:00", '{$x="hello world"}{$x}');
お礼
お礼が遅くなりまして、すみません。 大変役に立ちました。無事解決することができ、 感謝しております。 ありがとうございました。
補足
ご回答ありがとうございます。 右側にメニューを常に表示させておいて、左側に商品を羅列したいので、 ページ全体がながーくなってしまうのです。 includeでブロックごとに読み込むのはスマートな方法ですね。 どうしてもテンプレートを使いたい場合、 tplファイル内のframesrcで指定したtplファイルにも、 PHPで割り当てたsmary変数が使えるのでしょうか。