PHPやJavaScriptなどの覚え書き、たまに愚痴、反省など。
Smartyテンプレートに直接SQLを記述するSmartyプラグイン
Smartyを使ってるとselectメニューなどを作成したいときにPHP側とテンプレート側の両方を触らなくちゃいけなくて、たまにめんどくさいことがありませんか?
以下で紹介するプラグインは、Smartyテンプレートに直接SQL文を記述することが出来ます。(MySQL専用です!)
MVCの観点からすると若干違和感がある方も多いかもしれませんが、SQLのデバッグ等の作業は劇的にやりやすくなります。
あと、うまく説明できないのですが$smarty->cachingをtrueにした場合も、PHP側の記述がシンプルになります。
インストール方法
以下のソースを「block.sql.php」というファイル名でpluginsディレクトリに保存してください。
<?php
function smarty_block_sql($params, $content, &$smarty, &$repeat){
if( isset($content) ){
if( $data = mysql_fetch_array($smarty->_block_sql['result']) ){
$smarty->assign($data);
$repeat = true;
}else{
$repeat = false;
}
return $content;
}else{
if( isset($params['sql']) && strlen($params['sql']) ){
if( isset($params['dbh']) && $params['dbh'] ){
$smarty->_block_sql['result'] = mysql_query($params['sql'], $params[$dbh]);
}else{
$smarty->_block_sql['result'] = mysql_query($params['sql']);
}
$data = mysql_fetch_array($smarty->_block_sql['result']);
$smarty->assign($data);
}
}
}
?>
使用方法
PHP側で、データベースハンドルをassignしてください。
これは必須ではありませんが、やったほうがベターです。
$smarty->assign('dnh', $dbh);
テンプレート側は以下の通り。
<select name="myselect">
{sql dbh=$dbh sql="select id, value from my_table limit 0,5"}
<option value="{$id}">{$value}</option>
{/sql}
</select>
クエリー結果のフィールド名がそのまま変数名として使えるところがミソです。
ちなみにネストには対応していません。(試してもいません。)
動作環境
データベースはMySQLのみですが、簡単な構文なので、PostgreSQL等への対応はこれを参考に自作していただければ幸いです。
ライセンス
MITライセンスとします。
ただし、気に入っていただけた方からの寄付は歓迎します。
| この記事は miya によって 2009 年 1 月 21 日 4:07 PM に投稿されました, Smartyプラグイン 以下に保存されています。 RSS 2.0 を通してコメントをフォローする。 コメントを残すか、ご自分のサイトからトラックバックできます。 |
コメント無し
トラックバックはありません。
Additional comments powered by BackType


