2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Smartyでデバッグを折りたたみ

Posted at

Smartyには生成時間やアサインされている変数一覧などを表示するデバッグモードがある。
デバッグモードの設定方法は詳しくは砂岡氏の下記に詳しい。
cl.pocari.org - Smarty を使った開発でデバッグを行う 4 つの方法

で、デバッグモードはSmartyに渡されたすべての変数が表示されるようになっているのだが、
ちょっと複雑なオブジェクトや配列などを渡すととてもみづらい。
なので、折り畳んで表示してしまおうという話。

幸いなことにデバッグ機能自体の実態はSmartyのプラグイン(modifier.debug_print_var.php)として提供されているので
これを修正してしまえばいい。

で、修正した結果が以下

<?php
/**
 * Smarty plugin
 *
 * @package Smarty
 * @subpackage Debug
 */

/**
 * Smarty debug_print_var modifier plugin
 *
 * Type:     modifier<br>
 * Name:     debug_print_var<br>
 * Purpose:  formats variable contents for display in the console
 *
 * @author Monte Ohrt <monte at ohrt dot com>
 * @param array|object $var     variable to be formatted
 * @param integer      $depth   maximum recursion depth if $var is an array
 * @param integer      $length  maximum string length if $var is a string
 * @return string
 */
function smarty_modifier_debug_print_var ($var, $depth = 0, $length = 40)
{
    $_replace = array("\n" => '<i>\n</i>',
        "\r" => '<i>\r</i>',
        "\t" => '<i>\t</i>'
        );

    switch (gettype($var)) {
        case 'array' :
            $results = '<b onclick="hide_seek(this, arguments[0])" style="color:red">Array (' . count($var) . ')</b><div style="display:none">';
            foreach ($var as $curr_key => $curr_val) {
                $results .= '<br>' . str_repeat('&nbsp;', $depth * 2)
                 . '<b>' . strtr($curr_key, $_replace) . '</b> =&gt; '
                 . smarty_modifier_debug_print_var($curr_val, ++$depth, $length);
                $depth--;
            }
            $results .='</div>';
            break;
           
        case 'object' :
            $object_vars = get_object_vars($var);
            $results = '<b onclick="hide_seek(this, arguments[0])">' . get_class($var) . ' Object (' . count($object_vars) . ')</b><div>';
            foreach ($object_vars as $curr_key => $curr_val) {
                $results .= '<br>' . str_repeat('&nbsp;', $depth * 2)
                 . '<b> -&gt;' . strtr($curr_key, $_replace) . '</b> = '
                 . smarty_modifier_debug_print_var($curr_val, ++$depth, $length);
                $depth--;
            }
            $results .='</div>';
            break;
           
        case 'boolean' :
        case 'NULL' :
        case 'resource' :
            if (true === $var) {
                $results = 'true';
            } elseif (false === $var) {
                $results = 'false';
            } elseif (null === $var) {
                $results = 'null';
            } else {
                $results = htmlspecialchars((string) $var);
            }
            $results = '<i>' . $results . '</i>';
            break;
           
        case 'integer' :
        case 'float' :
            $results = htmlspecialchars((string) $var);
            break;
           
        case 'string' :
            $results = strtr($var, $_replace);
            if (Smarty::$_MBSTRING) {
                if (mb_strlen($var, Smarty::$_CHARSET) > $length) {
                    $results = mb_substr($var, 0, $length - 3, Smarty::$_CHARSET) . '...';
                }
            } else {
                if (isset($var[$length])) {
                    $results = substr($var, 0, $length - 3) . '...';
                }
            }

            $results = htmlspecialchars('"' . $results . '"');
            break;
           
        case 'unknown type' :
        default :
            $results = strtr((string) $var, $_replace);
            if (Smarty::$_MBSTRING) {
                if (mb_strlen($results, Smarty::$_CHARSET) > $length) {
                    $results = mb_substr($results, 0, $length - 3, Smarty::$_CHARSET) . '...';
                }
            } else {
                if (strlen($results) > $length) {
                    $results = substr($results, 0, $length - 3) . '...';
                }
            }
            
            $results = htmlspecialchars($results);
    }

    if ($depth == 0) {
        $results .= '<script>'
        .'function hide_seek(obj,e) {'
        .    'var e = e || window.event;'
        .    'if (obj.nextSibling.style.display == "none") {'
        .        'obj.nextSibling.style.display = "block";'
        .    '} else {'
        .        'obj.nextSibling.style.display = "none";'
        .    '}'
        .    'e.cancelBubble = true;'
        .    'e.stopPropagation();'
        . '}'
        .'</script>';
    }

    return $results;
}

?>

gettypeが'array'と'object'の場合に要素を<div style="display:none">で囲み、
<b onclick="hide_seek(this, arguments[0])" style="color:red">でアコーディオン機能を呼び出しているだけ。
注意としてfunctionは再起的に呼び出されているので、jsの呼び出し部分は$depth=0のときだけ書き出すようにしている。

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?