ダンプ用Smartyプラグインで快適デバッグ

Smartyでテンプレート変数のダンプを取りたい時、テンプレートに{debug}と書いたりしてデバッギングコンソールを表示するという手があります。ただ、別ウィンドウでいちいち開くのがウザかったり、不要な情報も表示されてしまったり、逆に必要な情報が途切れてしまったり、不便な時も多いです。
そこで、ダンプ用のプラグインを作るというのがわりとポピュラーな解決策になります。ちょっと今更感もありますが、せっかく手元にあるのでご紹介。

まずは、値をvar_dumpで出力するプラグイン。{var_dump var=$hoge} とかで呼び出します。<pre> でくくってるのでブラウザからも綺麗に見えます。また、{var_dump} のように引数を付けずに呼び出すと、全てのテンプレート変数をダンプしてくれます。

<?php
/**
 * Smarty plugin {var_dump}
 *
 * usage: {var_dump [var="var"]}
 *
 * 値をpre要素でくくってダンプするSmartyプラグイン。
 * {var_dump} だけで呼び出すと、全ての変数をダンプする。
 *
 * @package   Lism::Plugins
 * @version   $Id: function.var_dump.php 94 2007-05-15 09:19:45Z Ryo Miyake $
 * @copyright 2006-2007 Lism.in
 * @author    Ryo Miyake <ryo.studiom@gmail.com>
 */

/**
 * var_dump
 *
 * @param  array   $value   引数のハッシュ
 * @param  object  &$smarty Smartyオブジェクト
 * @return void
 */
function smarty_function_var_dump($value, &$smarty)
{
    echo '<pre style="font-size:9pt">';
    var_dump((isset($value['var'])) ? $value['var'] : $smarty->get_template_vars());
    echo "</pre>\n";
}

こいつを {var_dump} だけで呼び出すと、こんな感じ。

そして、もう一本。ただのダンプじゃ見にくいという人に、テーブルで出力するプラグイン。同じく {tbl_dump var=$hoge} とか {tbl_dump} とかで呼び出し。

<?php
/**
 * Smarty plugin {tbl_dump}
 *
 * usage: {tbl_dump [var="var"]}
 *
 * 値をテーブルでダンプするSmartyプラグイン。
 * 基本的には配列やオブジェクトの中身を調べるために使うのが基本。
 * {tbl_dump} だけで呼び出すと、全ての変数をダンプする。
 *
 * @package   Lism::Plugins
 * @version   $Id: function.tbl_dump.php 94 2007-05-15 09:19:45Z Ryo Miyake $
 * @copyright 2006-2007 Lism.in
 * @author    Ryo Miyake <ryo.studiom@gmail.com>
 */

/**
 * tbl_dump
 *
 * @param  array   $value   引数のハッシュ
 * @param  object  &$smarty Smartyオブジェクト
 * @return void
 */
function smarty_function_tbl_dump($value, &$smarty)
{
    if (isset($value['var'])) {
        /*
         * 指定された変数をダンプ
         */
        $var = $value['var'];
        if (is_array($var)) {
            // 配列をテーブルで出力
            $i = 0;
            echo '<table class="list">'."\n";
            echo '<tr><th>キー</th><th>値</th></tr>'."\n";
            foreach ($var as $key=>$val) {
                echo sprintf('<tr%s><td>%s</td><td><pre style="font-size:9pt">',
                             ($i++%2) ? ' class="oddline"' : '',
                             $key);
                var_dump($val);
                echo '</pre></td></tr>';
            }
            echo "</table>\n";
        } else {
            // 配列以外は型と値を表示
            echo '<table class="list">'."\n";
            echo '<tr><th>型</th><th>値</th></tr>'."\n";
            echo '<tr><td>'.gettype($var).'</td><td><pre style="font-size:9pt">';
            var_dump($var);
            echo "</pre></td></tr>\n";
            echo "</table>\n";
            pre_dump($value);
        }
    } else {
        /*
         * 全ての変数をダンプ
         */
        $i = 0;
        echo '<table class="list">'."\n";
        echo '<tr><th>変数名</th><th>変数の内容</th></tr>'."\n";
        foreach ($smarty->get_template_vars() as $key=>$val) {
            echo sprintf('<tr%s><td>%s</td><td><pre style="font-size:9pt">',
                         ($i++%2) ? ' class="oddline"' : '',
                         $key);
            var_dump($val);
            echo '</pre></td></tr>';
        }
        echo "</table>\n";
    }
}

さっきの画面で {tbl_dump var=$PATHINFO} とか書くとこうなります。

この手のは簡単に作れる割にお役立ち度が非常に高いので、Smartyで開発する人は自分に都合のいいプラグインを作っておくといいですね。このサンプルではHTMLをエスケープしないので、そのあたりを考慮したのを作っておくのもありかと。