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ライセンスとします。
ただし、気に入っていただけた方からの寄付は歓迎します。