Использование расширенной отладки. Часть 10. Табличные контрольные точки

+4
901
Иногда при тестировании кода возникает необходимость как-то более удобно вывести данные из повторяющихся участков кода или наглядно отследить изменения в переменных. Для этого предназначены табличные контрольные точки (ТКТ).



В «Расширенной отладке» есть контрольные точки dbg() (КТ), которые выводят данные в лог последовательно в тех местах, где они вызываются. Если нужно вывести сразу несколько значений, то придётся либо собирать их в массив, либо делать несколько последовательных КТ, что уменьшает наглядность.

Вызов табличных контрольных точек

Для таких случаев удобно использовать табличные контрольные точки dbg_table(). Они вызываются просто:
  1. dbg_table($name, $data);
Параметры вызова:
* @param string $name Название таблицы
* @param array $data Массив данных для вывода в таблицу

Если в функцию dbg_table() передать только один параметр, то она будет считать его данными для вывода, а таблица будет без имени.

Структура таблицы

Выводимая таблица будет иметь следующую структуру

1. В таблице есть две обязательные колонки: "№ по порядку" и "Место вызова" контрольной точки, заполняемые автоматически.
2. Колонки с данными создаются динамически: каждая колонка – это отдельный индекс массива $data.
3. Если в одну и ту же таблицу передаются новые данные без элементов с существующими индексами, то для незадействованных индексов ячейки будут пустыми. А для новых индексов будут добавлены новые колонки.
4. Если какие-то индексы в массиве не заданы, они будут автоматически пронумерованы как в обычном массиве, начиная с нуля.
5. Таблицы, индексы и строки никак не сортируются, а выводятся в порядке добавления по ходу кода.
6. Скалярные (простые) значения выводятся как есть, без форматирования. Если в качестве значений переданы массивы или объекты, то они будут автоматически отформатированы и подсвечены цветом как при выводе обычных КТ.
7. Все таблицы накапливают значения до самого окончания работы скрипта и выводят всё суммарно после окончания лога.

Обратите внимание! Если в нескольких вызовах передавать элементы без заданных индексов, то в каждом вызове индексы таких элементов будут начинаться с нуля, а, значит, будут выводиться в одних и тех же колонках.

Посмотрим на простых примерах

  1. dbg_table('Первая', ['Key_1' => '1-1', 'Key_2' => '1-2'], 1);
  2. dbg_table('Первая', [2, 'Key_2' => '2-2', 'Key_3' => '2-3']);
  3. dbg_table('Первая', ['Key_1' => '3-1', 3, 4, 'Key_3' => '3-3']);
  4. dbg_table('Вторая', ['Key_1' => '1']);

Здесь первые три вызова dbg_table() выводят всё в таблицу с названием 'Первая'.
В первом вызове недостающий индекс автоматически становится равен ‘0’.
Во втором вызове значение 2 первого элемента подставляется в колонку с индексом ‘0’, несмотря на то, что она в таблице последняя.
В третьем вызове значения 3 и 4 выводятся в колонки с существующим индексом ‘0’ и с новым индексом ‘1’.
В четвёртой строке создаётся новая таблица с именем 'Вторая', в которую и выводится элемент с индексом 'Key_1'.

И для проверки выведем массивы в элементах массива данных
  1. dbg_table('Массивы', [['111'], ['222']]);

Массивы отформатированы и подсвечены цветом. Но всё же нагляднее передавать в элементах скалярные значения, то есть выводить одноуровневые массивы.

Более реальный пример

Полезнее всего использовать ТКТ при выводе таблиц. Например, при нескольких итерациях обработки каких-то значений или при проходе по массиву в цикле. Простой пример таких циклов – пункты меню или «хлебных крошек».

Добавим в шаблон «хлебных крошек» /templates/default/assets/ui/breadcrumbs.tpl.php внутрь цикла перебора пунктов строку
  1. dbg_table('breadcrumbs', $item);
Посмотрим таблицу на странице site/articles/literatura/zarubezhnaja — список статей по зарубежной литературе

Мы называем таблицу 'breadcrumbs' и выводим в неё данные – один пункт «крошек» $item за каждый проход цикла.
Индексы массива данных стали заголовками столбцов.

Таблица исходных и вычисленных значений

Теперь представим, что мы пишем свой шаблон меню и нам нужно посмотреть, правильно ли формируются классы css для пунктов меню с учётом подменю (папок). Для примера возьмём «Главное меню» с шаблоном /templates/default/assets/ui/menu.tpl.php
Как видим, на демо-данных в нём 29 пунктов. Пересматривать их xDebug-ом, останавливаясь на каждом пункте и вручную сравнивая исходное значение с новым – вообще не вариант. Можно вывести обычными КТ dbg(), но будет много лишней информации.
Можно вывести с помощью ТКТ, передавая сразу весь пункт меню целиком
  1. dbg_table($menu_title, [ 'id' => $id, $item ];
Но в каждом пункте по 10-15 элементов, некоторые из которых тоже массивы, так что таблица получится широкой и не очень удобной.
Поэтому внутри цикла, перебирающего пункты меню, сделаем вывод в таблицу только интересных нам пунктов (id пункта, название пункта, количество подпунктов, стиль из опций и подготовленный стиль). Индексы для них можно не указывать, тогда колонки пронумеруются автоматически.
  1. dbg_table($menu_title, [ $id, $item['title'], $item['childs_count'], $item['options']['class'], implode(' ', $css_classes) ]);
Но я задал индексы для наглядности:
  1. dbg_table($menu_title, [ 'id' => $id, 'title' => $item['title'], 'childs_count' => $item['childs_count'], 'class' => $item['options']['class'], 'css_classes' => implode(' ', $css_classes) ]);
Имя таблицы подставилось из переменной $menu_title.

Поскольку я выводил эту таблицу на странице httр://site/articles/literatura/zarubezhnaja, пункты «Статьи», «Литература» и «Зарубежная» получили стиль ‘active’ (активный). А пункты, содержащие подпункты (поле childs_count > 0) получили стиль ‘folder’.

Также видим, что только для одного пункта «Ещё» в опциях был задан класс ‘more’. Поскольку он содержит подпункты, то итоговый набор классов для него выглядит как ‘folder more’.
Всё аккуратно и наглядно. 😊


Таким же образом можно выводить в одну таблицу исходные значения из одного места вызова, а полученные после расчётов значения выводить вызовом из другого места (хоть из другого метода или функции) в другую колонку. Правда, тогда эти вызовы будут в двух соседних строках, но это всё равно удобнее, чем искать значения по строкам лога или, тем более, где-то внутри страницы сайта при выводе через var_dump или print_r.

В минимальном случае, для вывода таблицы с исходным значением и результатом нужны всего два элемента массива в вызове, можно даже без заголовка таблицы:
  1. dbg_table('', [ $исходная_переменная, $результат ]);
Всё остальное «Расширенная отладка» сделает сама. Очень просто! Попробуйте!
Нет комментариев. Ваш будет первым!

Еще от автора

Хуки-хухуки: Исключаем неактивных пользователей из списков
Как иногда начинают свой монолог неопытные стендаперы: «У всех в жизни было такое …
«Расширенная отладка» для InstantCMS 2.14.1 (v.14.1.2) – большое обновление для разработчиков
Новые возможности и удобства, облегчающие разработчикам отладку компонентов и шаблонов.
Использование расширенной отладки. Часть 11. Анализ ошибок 403/404 и редиректов
Одной из неудобных задач при отладке для меня является поиск причины ошибки 403/404.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.