Вход • Регистрация

Удобный вывод print_r и var_dump для просмотра

  • 03 ноября 2016 г. , редакция: 12 января 2020 г.
  • Я думаю, многие пользуются выводом переменных и массивов через функции print_r() и var_dump() для просмотра их содержимого при разработке. Новичкам смотреть (знать/помнить/понимать) содержимое того же $result будет очень полезно хотя бы для понимания организации данных внутри модулей.

    ВАЖНОЕ УТОЧНЕНИЕ
    Смотреть и изучать можно много чего, например, вместо $result указать в параметрах $this->diafan и множество других переменных, упоминаемых в документации. Иногда очень выручает.

    Существенный минус - переменная может быть внутри цикла foreach и доступна для вывода только внутри него. А вывод может производиться в произвольном месте вёрстки, например, внутри карточки товара. Смотреть его там не шибко удобно.





    Поэтому я написал небольшую функцию, призванную облегчить этот процесс.

    Функция будет полезна при разработке сайта и при изучении CMS. По окончании разработки (перед сдачей проекта) функцию и её вызовы рекомендую удалить.

    Код функции я добавил при помощи частичной кастомизации к общим функциям файла includes/core.php. Статью, в которой подробно рассматривается этот процесс, найдёте в документации Diafan.

    В статье по ссылке выше говорится о файле /includes/core.custom.php, но не упоминается про то, что файл должен располагаться в папке темы (custom/my_theme/includes/core.custom.php).

    Об этом написано в статье про кастомизацию:
    Цитата
    Класс для внедрения пользовательских разработок – Custom – определен в файле includes/custom.php.
    Этот класс позволяет подключить файл из текущей темы, если он там есть. Кроме того, класс обеспечивает частичную кастомизацию, которая позволяет веб-мастеру выносить свои доработки из файла, который он изменяет.
    Поэтому для работы функции надо создать тему вручную. Инструкцию по установке смотрите на странице дополнения во вкладке "Установка".



    Использование кастомизации позволит избежать проблем при обновлении CMS.

    ВЫЗОВ ФУНКЦИИ

    Функция вызывается в любом месте (но лучше в начале) "вьюшки" модуля (файлы папок "views" модулей) и выводит данные, доступные непосредственно в этом шаблоне, а также адрес самого шаблона.



    Код
    <?php
    // Вызов функции pre_mod();
    if( method_exists($this->diafan, 'pre_mod') ){
    $this->diafan->pre_mod($result, __FILE__, 0, 450, 19.3);
    }

    /**
    * Шаблон кнопки «Купить», в котором характеристики, влияющие на цену выводятся в виде выпадающего списка
    *
    * @package DIAFAN.CMS


    • Расшифровка $this->diafan->pre_mod($var_show, $path, $print_var, $height, $setka, $listen);
    • $var_show данные для вывода
    • $path адрес файла в котором осуществляется вызов функции
    • $print_var способ вывода vd() или print_r(). Значение 0 или 1 соответственно
    • $height высота блока вывода
    • $setka расстояние между вертикальными линиями фона (помогает отслеживать вложенность при прокрутке)
    • $listen - опрос блоков с отложенной загрузкой в секундах

    Блок фиксированный, скроллится, стандартный браузерный поиск (Ctrl+F) без проблем ищет внутри блока, если передать ему фокус. Выглядит это следующим образом:



    Вертикальная разметка (серые линии) позволяет при скролле данных отслеживать вложенность массивов.

    Версия от 12.01.2020


    Для того, чтобы отключить функцию, достаточно снять галку "применить" с темы в разделе "Темы и дизайн".

    БУДЬТЕ ВНИМАТЕЛЬНЫ !

    Вызывайте функцию через условие:
    Код
    if( method_exists($this->diafan, 'pre_mod') ){
    $this->diafan->pre_mod($result, __FILE__, 0, 450, 19.3);
    }

    Это позволит даже при отключённом дополнении избежать ошибок. Если вызвать функцию без условия и отключить впоследствии дополнение, то при обращении к нему будет ошибка:



    ДОПОЛНЕНО (17.01.2017):
    1. Добавлена возможность переключать вывод шаблонов, если функция на странице вызвана более одного раза (из нескольких шаблонов).
    2. Добавлена возможность сворачивать/разворачивать блок.
    3. Скорректировано положение панели редактирования CMS в нижнем положении с учётом вывода блоков с кодом.
    4. Добавлено условие для вывода блоков только администраторам.

    ДОПОЛНЕНО (16.01.2018):
    1. Изменено оформление с учётом того, что блоки выводятся в любой части страницы и ранее могли наследовать стили сайта из-за чего оформление блока могло меняться.
    2. Доработан внешний вид счётчика выводимых блоков и исправлена ошибка из-за которой при количестве блоков более двух они не переключались далее второго.
    3. Скорректировано положение и оформление панели редактирования CMS в нижнем положении с учётом вывода блоков с кодом.
    4. Сокращён путь к файлу. Теперь выводится от корня сайта, а не абсолютный путь.
    5. Изменено название функции с pre() на pre_mod(), чтобы избежать возможных проблем (слишком простое название может прийти в голову не только мне). Также изменены css-классы блоков по этой же причине.

    ДОПОЛНЕНО (17.07.2019):
    1. Полностью переписан скрипт обработки действий с блоками.
    2. Добавлены параметры по-умолчанию и изолированы друг от друга. Теперь у блоков может быть разная высота.
    3. Добавлена проверка на наличие метода в системе. Теперь можно не опасаться, что при отключении дополнения оставленный в шаблонах вызов приведёт к ошибке.

    ДОПОЛНЕНО (12.01.2020):
    1. Сокращён код. Формирование и вывод CSS-стилей и JS-кода теперь происходит однократно при генерации первого блока.
    2. Вызов функции из шаблонов с отложенной загрузкой раньше происходил после отработки скриптов, что приводило к ошибкам. Теперь функция мониторит страницу на предмет появления блоков с отложенной загрузкой каждые 2 секунды. По-умолчанию этот опрос длится 10 секунд, но это время также настривается параметром функции.
    3. Кнопка переключения окон с кодом в левом верхнем углу подсвечивается красным цветом до окончания процесса опроса.


    • 03 ноября 2016 г.
    • Цитата
      думаю, многие пользуются выводом переменных и массивов через функции print_r() и var_dump()
      увы, даже не знаю что это такое, но все равно спасибо!
      • 03 ноября 2016 г. , редакция: 03 ноября 2016 г.
      • Сейчас поясню. Когда нужно вывести переменную, мы пишем
        Код
        echo $variable;

        Выводится значение переменной. А если таким же образом попытаться вывести массив, то echo выведет только слово "Array".

        Допустим, массив $result['rows'] в файле shop.view.rows.php модуля магазин содержит данные о товарах и их нужно просмотреть. Чтобы увидеть содержимое массива, надо воспользоваться вышеуказанными функциями print_r() или var_dump().

        Код
        print_r( $result['rows'] ) ;
        либо
        Код
        var_dump( $result['rows'] ) ;


        Первая выведет только содержимое, вторая добавит в вывод более точные подробности. Поясню. Вы написали код, но при его выполнении ничего не происходит (ничего не выводится).

        print_r() может также вернуть "пустоту", а вот var_dump() может вывести, например, "false", подсказывая, что ваш скрипт при выполнении возвращает не "пустоту", а это значение.

        И разобраться становится уже проще. Это конечно приблизительное объяснение.
        • 04 ноября 2016 г.
        • Спасибо! Все же придется учить php-программирование. Ваши объяснения, неожиданно, оказались понятными.
    • 11 января 2020 г. , редакция: 11 января 2020 г.
    • Здравствуйте, Павел, можете выложить дополнение архивом, если возможно конечно.
      • 12 января 2020 г.
      • Здравствуйте! Я его переписал на Jquery, но не всегда библиотека успевала загрузиться перед модулем. Поэтому отключил до лучших времён. А раз спросили, решил доделать, добавил проверку на блоки с отложенной загрузкой и кое-что переписал и доработал. Активирую в аддонсах завтра, скачаете.
  • 04 ноября 2016 г.
  • Для поверхносного использования для понимания процессов или чтобы найти переменную в окружении конечно сгодится. Молодец. Но
    существуют участки, на которых воспользоваться print_r() или var_dump() ну никак не получиться. Пользуйтесь IDE не умеете - учитесь. Успехов.
    • 06 ноября 2016 г. , редакция: 06 ноября 2016 г.
    • Цитата
      Но существуют участки, на которых воспользоваться print_r() или var_dump() ну никак не получиться.
      Например, ajax? А если так
      Код
      $result = '<pre>'.print_r($var, true).'</pre>';
      Можно и в конструкциях
      Код
      try {
      ...
      } catch (Exception $ept) {
      ...
      } finally {
      ...
      }


      Вариантов много. Все получится. Успехов.
      • 06 ноября 2016 г.
      • Блин, читаю форум, ВИТАЛИЙ (NVGPRO), есть моменты в программировании, которые Вы не знаете?)
  • 04 ноября 2016 г. , редакция: 05 ноября 2016 г.
  • Спасибо за комментарий, Денис! Но с утверждением про IDE я согласен только отчасти.

    Это решение (изложенное выше) призвано помочь в вёрстке и доработке фронт-энда, т.е. "вьюх". Не более того. Большинству этого будет достаточно, чтобы разобраться и чтобы найти необходимое. Во "вьюхах" нет ни одного участка, который нельзя вывести при помощи print_r. Всё в $result передаётся. Его решение и показывает.

    Пользоваться неповоротливыми IDE, у которых 500 настроек, далеко не всегда оправдано. Также как и использование Git и прочих современных фишек. В среде программистов очень сильна мода на новшества и они порой их используют только потому что это модно, современно, профессионально. У некоторых это переходит в маниакальное подобие религии. На "Хабре" об этом уже десятки статей от профессионалов и с большинством из них я полностью согласен.

    Это как устанавливать полный пакет Photoshop, "жрущий" по 4 гигабайта оперативки, чтобы линию нарисовать. Если заниматься сложным программированием, идущим дальше переменных, массивов и циклов - тогда да. Но тут об этом речи не идёт.

    Я в основном специализируюсь на фронт-энде. Пробовал с десяток IDE, почти все наиболее известные редакторы и в результате сейчас использую SinWrite. У него, разумеется, ограниченные возможности, но той совокупности инструментов, которую он предоставляет для решения моих задач при работе с фронт-эндом, я ни в одной IDE не видел и вряд ли увижу.

    Так что тут надо придерживаться правила: "Каждой задаче - свой инструмент", вместо "используйте IDE - это круто".

    P.S.:
    Цитата
    Пользуйтесь IDE не умеете - учитесь. Успехов.
    - более уместен был бы пример решения аналогичной задачи при помощи IDE, а так немного смахивает на выпендрёж.

    "Успехов", - это "фишка" Виталия. На форуме Diafan нужно писать: "Успехов" (c).
    • 05 ноября 2016 г.
    • А как спасибо забрать можно?
      Ладно если будет, что то подходящее и найдётся время как нибудь ролик запишу про то как отлаживать не имея возможности пользоваться print_r();
      Да я использовал bred, потом был notepad++, потребности росли и кроме правки шаблонов занимаюсь разработкой модулей поэтому и git и meld и kiki я тоже использую. Ваше решение достойно внимания и кому-то действительно пригодится, кто до сих пор ещё не попробовал инструменты которые позволяют обходится без print_r. В этом я согласен поэтому и похвалил.
      Цитата
      Молодец.

      • 06 ноября 2016 г.
      • Цитата
        кому-то действительно пригодится, кто до сих пор ещё не попробовал инструменты которые позволяют обходится без print_r
        Я думаю, что среди пользователей CMS таких более половины и им никогда не понадобится забираться дальше фронт-энда. И у многих из них не будет желания изучать для решения этих задач что-то более сложное, чем Notepad++. Сами же пишите, что IDE вам понадобилась по мере роста потребностей.
        Далеко не во всех IDE есть даже множественная каретка и другие "плюшки" для быстрой вёрстки.
        Поэтому IDE может быть очень удобной для одних задач и совершенно неудобной и тем более избыточной для других.

        Поэтому и прокомментировал вашу фразу про IDE. Как уже отметил выше - "всему свой инструмент".

        "Спасибо" вернул, спасибо!
  • 11 ноября 2016 г.
  • Возможно, я что-то не так прочитал, но почему не использовать вывод
    Код
    <pre><? print_r($result['key']) ?></pre>
    • 11 ноября 2016 г.
    • Он и используется, для переменной $result. С дополнительным оформлением. Вопрос удобства.
  • 14 ноября 2016 г. , редакция: 14 ноября 2016 г.
  • для меня оч удобно использовать консоль для отладки, нет лишнего в html, можно сворачивать/разворачивать дерево вложенности, расширение для Crome (php-console)
    или просто
    Код

    function dс( $data ) {

    if ( is_array( $data ) )
    $output = "<script>console.log( 'Debug Objects: " . implode( ',', $data) . "' );</script>";
    else
    $output = "<script>console.log( 'Debug Objects: " . $data . "' );</script>";

    echo $output;
    }
  • 12 января 2020 г. , редакция: 12 января 2020 г.
  • В cms также предусмотрен вывод переменных. Далее в качестве примера три варианта.
    Код

    $variable1 = date("H:i:s");
    vd($variable1);

    В данном случае содержание переменной будет выведено в контенте страницы.


    Код

    $variable1 = date("H:i:s");
    $variable2 = date("d.m.Y");
    Dev::var_dump($variable1, $variable2);

    В данном случае содержание переменных будет выведено после формирования страницы. Также будет выведена трассировка кода вызова (содержание стека) - удобно для понимания, логики вызовов в cms. Дополнительно будет отображена информация, сколько памяти и времени было израсходовано от инициализации кода или от предыдущего аналогичного вызова функции Dev::var_dump(). Так можно отследить, на что больше всего требуется времени и памяти.


    Код

    $variable1 = date("H:i:s");
    $variable2 = date("d.m.Y");
    File:var_dump($variable1, $variable2, 'tmp/log.tmp');

    В таком случае вывод содержания переменных пойдет в файл tmp/log.tmp. Путь к файлу в данной функции указывается последним аргументом.


    Код

    $variable1 = date("H:i:s");
    $variable2 = date("d.m.Y");
    File:var_dump($variable1, $variable2, 'tmp/log.tmp', true);

    $variable3 = time();
    File:var_dump($variable3, 'tmp/log.tmp', true);


    Если нужно вывести множество переменных в файл, то после указания файла вывода поставьте значение true.


    Да, забыл. Для использования функции Dev::var_dump() нужно в разделе "Параметры сайта" активировать пункт "Включить профилирование PHP-скриптов".


    Будут вопросы, задавайте.
    Всем приятной работы с DIAFAN.CMS

Новости

  • 18 июня
  • В сборке большое обновление demo-шаблона, дополнительная защита от спама, улучшение YML-импорта и еще много важного и интересного.
  • 24 апреля
  • В новой сборке совершили революцию в структурировании кастомизированной информации в шаблонах, добавили авторегистрацию пользователей, усовершенствовали защиту от спама, актуализировали накопительную скидку, а также улучшили производительность и стабильность работы системы.
  • 12 января
  • После выхода сборки 7.1 мы выпустили уже три патча, в каждом из которых улучшаем административную часть сайта. Сборка DIAFAN.CMS 7.1.3 уже доступна к установке. 

Форум