Красивая замена var_dump для 1С Битрикс

Иногда так хочется узнать, что содержит в себе тот адский массив в неизвестной части кода битрикса. Большинство программистов используют для этого функцию var_dump или print_r для вывода содержимого переменных. Но вывод не очень красивый, из-за не...

Автор . Дата: 07.12.2014

Иногда так хочется узнать, что содержит в себе тот адский массив в неизвестной части кода битрикса. Большинство программистов используют для этого функцию var_dump или print_r для вывода содержимого переменных. Но вывод не очень красивый, из-за него может съехать верстка, да и этот вывод виден всем пользователям без исключений. Сегодня я хочу поделиться с вами красивой замене этим функциям.

function print_var(&$var)
{
    if (is_array($var))
    {
        if (empty($var))
            echo 'Array()';
        else
        {
            echo "<span class=\"folder\" onclick=\"$(this).next('.placeholder').fadeToggle(150).next('.array').slideToggle(150);this.textContent=this.textContent=='?'?'+':'?';\">+</span> Array(<span class=\"placeholder\">...</span><div class=\"array\">";
            foreach($var as $key => &$value)
            {
                echo '<span class="fl-l"><span class="label">[', is_string($key)?'<span class="string">"':'<span class="integer">', $key, is_string($key)?'"</span>':'</span>', ']</span> => </span>';
                print_var($value);
            }
            echo '</div>)';
        }
    }
    else if (is_bool($var))
        echo '<span class="boolean">', ($var?'true':'false'), '</span>';
    else if (is_float($var))
        echo '<span class="float">', $var, '</span>';
    else if (is_int($var))
        echo '<span class="integer">', $var, '</span>';
    else if (is_null($var))
        echo '<span class="null">null</span>';
    else if (is_object($var))
    {
        echo "<span class=\"folder\" onclick=\"$(this).next('.placeholder').fadeToggle(150).next('.object').slideToggle(150);this.textContent=this.textContent=='?'?'+':'?';\">+</span> ", get_class($var),"(<span class=\"placeholder\">...</span><div class=\"object\">";
        foreach($var as $key => &$value)
        {
            echo '<span class="fl-l"><span class="label">->', $key, '</span> = </span>';
            print_var($value);
        }
        echo '</div>)';
    }
    else if (is_resource($var))
        echo '<span class="resource">[[', get_resource_type($var), ']]</span>';
    else if (is_string($var))
        echo '<span class="string">"', $var, '"</span>';
    else
        echo '<span class="unknown">', print_r($var), '</span>';
    echo "\n";
}

function p(&$var, $label = false)
{
    global $USER;
    if ($USER->IsAdmin())
    {
        echo "<pre class=\"p\">";
        if ($label !== false) echo '<span class="label">', $label, '</span>: ';
        print_var($var);
        echo "</pre>";
    }
}

Использовать нужно функцию p. На входе она имеет 2 аргумента: первый это переменная, содержимое которой нужно отобразить, а второй, не обязательный, это текстовая метка. Функция print_var используется для красивого вывода. Фукнции нужно поместить в файл /bitrix/php_interface/init.php. Так же вам нужно добавить стили:

pre.p
{
    font-size: 13px;
    box-shadow: inset 0 0 0 1px rgba(0,0,0,.15);
    border-radius: 2px;
    line-height: 20px;
    background-color: #fbf9f5;
    padding: 3px;
    overflow: hidden;
}
pre.p .label
{
    color: #555555;
}
pre.p .folder
{
    display: inline-block;
    width: 7px; height: 7px;
    text-align: center;
    line-height: 7px;
    vertical-align: middle;
    border: solid 1px #0055cc;
    color: gray;
    cursor: pointer;
    border-radius: 2px;
}
pre.p .array,
pre.p .object {
    display: none;
    padding: 0 0 0 30px;
}
pre.p .placeholder {
    border: solid 1px #ddd;
    font-size: 11px;
    padding: 0 3px;
    border-radius: 3px;
    background-color: #fbf5f2;
    color: gray;
}
pre.p .resource {
    color: #ff8000;
}
pre.p .null,
pre.p .boolean {
    color: #00f;
}
pre.p .integer,
pre.p .float {
    color: #008000;
}
pre.p .string {
    color: #0080af;
}

Добавить их можно, например в файл /bitrix/templates/%template_name%/template_styles.css, где %template_name% это название вашего шаблона. В результате мы получаем такой красивый вывод:

Кстати, убрав все места, где упоминается объект $USER, данные функции можно использовать в любых других проектах, а не только в битриксе.

PS: Для корректной работы функции требуется jQuery, так что не забудьте установить его. Приятного использования :-)


comments powered by HyperComments