Иногда при тестировании кода возникает необходимость как-то более удобно вывести данные из повторяющихся участков кода или наглядно отследить изменения в переменных. Для этого предназначены табличные контрольные точки (ТКТ).
В «Расширенной отладке» есть контрольные точки dbg() (КТ), которые выводят данные в лог последовательно в тех местах, где они вызываются. Если нужно вывести сразу несколько значений, то придётся либо собирать их в массив, либо делать несколько последовательных КТ, что уменьшает наглядность.
Параметры вызова:
* @param string $name Название таблицы
* @param array $data Массив данных для вывода в таблицу
Если в функцию dbg_table() передать только один параметр, то она будет считать его данными для вывода, а таблица будет без имени.
1. В таблице есть две обязательные колонки: "№ по порядку" и "Место вызова" контрольной точки, заполняемые автоматически.
2. Колонки с данными создаются динамически: каждая колонка – это отдельный индекс массива $data.
3. Если в одну и ту же таблицу передаются новые данные без элементов с существующими индексами, то для незадействованных индексов ячейки будут пустыми. А для новых индексов будут добавлены новые колонки.
4. Если какие-то индексы в массиве не заданы, они будут автоматически пронумерованы как в обычном массиве, начиная с нуля.
5. Таблицы, индексы и строки никак не сортируются, а выводятся в порядке добавления по ходу кода.
6. Скалярные (простые) значения выводятся как есть, без форматирования. Если в качестве значений переданы массивы или объекты, то они будут автоматически отформатированы и подсвечены цветом как при выводе обычных КТ.
7. Все таблицы накапливают значения до самого окончания работы скрипта и выводят всё суммарно после окончания лога.
Обратите внимание! Если в нескольких вызовах передавать элементы без заданных индексов, то в каждом вызове индексы таких элементов будут начинаться с нуля, а, значит, будут выводиться в одних и тех же колонках.
Здесь первые три вызова dbg_table() выводят всё в таблицу с названием 'Первая'.
В первом вызове недостающий индекс автоматически становится равен ‘0’.
Во втором вызове значение 2 первого элемента подставляется в колонку с индексом ‘0’, несмотря на то, что она в таблице последняя.
В третьем вызове значения 3 и 4 выводятся в колонки с существующим индексом ‘0’ и с новым индексом ‘1’.
В четвёртой строке создаётся новая таблица с именем 'Вторая', в которую и выводится элемент с индексом 'Key_1'.
И для проверки выведем массивы в элементах массива данных
Массивы отформатированы и подсвечены цветом. Но всё же нагляднее передавать в элементах скалярные значения, то есть выводить одноуровневые массивы.
Добавим в шаблон «хлебных крошек» /templates/default/assets/ui/breadcrumbs.tpl.php внутрь цикла перебора пунктов строку
Посмотрим таблицу на странице site/articles/literatura/zarubezhnaja — список статей по зарубежной литературе
Мы называем таблицу 'breadcrumbs' и выводим в неё данные – один пункт «крошек» $item за каждый проход цикла.
Индексы массива данных стали заголовками столбцов.
Можно вывести с помощью ТКТ, передавая сразу весь пункт меню целиком
Но в каждом пункте по 10-15 элементов, некоторые из которых тоже массивы, так что таблица получится широкой и не очень удобной.
Поэтому внутри цикла, перебирающего пункты меню, сделаем вывод в таблицу только интересных нам пунктов (id пункта, название пункта, количество подпунктов, стиль из опций и подготовленный стиль). Индексы для них можно не указывать, тогда колонки пронумеруются автоматически.
Но я задал индексы для наглядности:
Поскольку я выводил эту таблицу на странице httр://site/articles/literatura/zarubezhnaja, пункты «Статьи», «Литература» и «Зарубежная» получили стиль ‘active’ (активный). А пункты, содержащие подпункты (поле childs_count > 0) получили стиль ‘folder’.
Также видим, что только для одного пункта «Ещё» в опциях был задан класс ‘more’. Поскольку он содержит подпункты, то итоговый набор классов для него выглядит как ‘folder more’.
Всё аккуратно и наглядно. 😊
Таким же образом можно выводить в одну таблицу исходные значения из одного места вызова, а полученные после расчётов значения выводить вызовом из другого места (хоть из другого метода или функции) в другую колонку. Правда, тогда эти вызовы будут в двух соседних строках, но это всё равно удобнее, чем искать значения по строкам лога или, тем более, где-то внутри страницы сайта при выводе через var_dump или print_r.
В минимальном случае, для вывода таблицы с исходным значением и результатом нужны всего два элемента массива в вызове, можно даже без заголовка таблицы:
Всё остальное «Расширенная отладка» сделает сама. Очень просто! Попробуйте!
В «Расширенной отладке» есть контрольные точки dbg() (КТ), которые выводят данные в лог последовательно в тех местах, где они вызываются. Если нужно вывести сразу несколько значений, то придётся либо собирать их в массив, либо делать несколько последовательных КТ, что уменьшает наглядность.
Вызов табличных контрольных точек
Для таких случаев удобно использовать табличные контрольные точки dbg_table(). Они вызываются просто:
dbg_table($name, $data);
* @param string $name Название таблицы
* @param array $data Массив данных для вывода в таблицу
Если в функцию dbg_table() передать только один параметр, то она будет считать его данными для вывода, а таблица будет без имени.
Структура таблицы
Выводимая таблица будет иметь следующую структуру1. В таблице есть две обязательные колонки: "№ по порядку" и "Место вызова" контрольной точки, заполняемые автоматически.
2. Колонки с данными создаются динамически: каждая колонка – это отдельный индекс массива $data.
3. Если в одну и ту же таблицу передаются новые данные без элементов с существующими индексами, то для незадействованных индексов ячейки будут пустыми. А для новых индексов будут добавлены новые колонки.
4. Если какие-то индексы в массиве не заданы, они будут автоматически пронумерованы как в обычном массиве, начиная с нуля.
5. Таблицы, индексы и строки никак не сортируются, а выводятся в порядке добавления по ходу кода.
6. Скалярные (простые) значения выводятся как есть, без форматирования. Если в качестве значений переданы массивы или объекты, то они будут автоматически отформатированы и подсвечены цветом как при выводе обычных КТ.
7. Все таблицы накапливают значения до самого окончания работы скрипта и выводят всё суммарно после окончания лога.
Обратите внимание! Если в нескольких вызовах передавать элементы без заданных индексов, то в каждом вызове индексы таких элементов будут начинаться с нуля, а, значит, будут выводиться в одних и тех же колонках.
Посмотрим на простых примерах
dbg_table('Первая', ['Key_1' => '1-1', 'Key_2' => '1-2'], 1); dbg_table('Первая', [2, 'Key_2' => '2-2', 'Key_3' => '2-3']); dbg_table('Первая', ['Key_1' => '3-1', 3, 4, 'Key_3' => '3-3']); dbg_table('Вторая', ['Key_1' => '1']);
Здесь первые три вызова dbg_table() выводят всё в таблицу с названием 'Первая'.
В первом вызове недостающий индекс автоматически становится равен ‘0’.
Во втором вызове значение 2 первого элемента подставляется в колонку с индексом ‘0’, несмотря на то, что она в таблице последняя.
В третьем вызове значения 3 и 4 выводятся в колонки с существующим индексом ‘0’ и с новым индексом ‘1’.
В четвёртой строке создаётся новая таблица с именем 'Вторая', в которую и выводится элемент с индексом 'Key_1'.
И для проверки выведем массивы в элементах массива данных
dbg_table('Массивы', [['111'], ['222']]);
Массивы отформатированы и подсвечены цветом. Но всё же нагляднее передавать в элементах скалярные значения, то есть выводить одноуровневые массивы.
Более реальный пример
Полезнее всего использовать ТКТ при выводе таблиц. Например, при нескольких итерациях обработки каких-то значений или при проходе по массиву в цикле. Простой пример таких циклов – пункты меню или «хлебных крошек».Добавим в шаблон «хлебных крошек» /templates/default/assets/ui/breadcrumbs.tpl.php внутрь цикла перебора пунктов строку
dbg_table('breadcrumbs', $item);
Мы называем таблицу 'breadcrumbs' и выводим в неё данные – один пункт «крошек» $item за каждый проход цикла.
Индексы массива данных стали заголовками столбцов.
Таблица исходных и вычисленных значений
Теперь представим, что мы пишем свой шаблон меню и нам нужно посмотреть, правильно ли формируются классы css для пунктов меню с учётом подменю (папок). Для примера возьмём «Главное меню» с шаблоном /templates/default/assets/ui/menu.tpl.phpКак видим, на демо-данных в нём 29 пунктов. Пересматривать их xDebug-ом, останавливаясь на каждом пункте и вручную сравнивая исходное значение с новым – вообще не вариант. Можно вывести обычными КТ dbg(), но будет много лишней информации.
Можно вывести с помощью ТКТ, передавая сразу весь пункт меню целиком
dbg_table($menu_title, [ 'id' => $id, $item ];
Поэтому внутри цикла, перебирающего пункты меню, сделаем вывод в таблицу только интересных нам пунктов (id пункта, название пункта, количество подпунктов, стиль из опций и подготовленный стиль). Индексы для них можно не указывать, тогда колонки пронумеруются автоматически.
dbg_table($menu_title, [ $id, $item['title'], $item['childs_count'], $item['options']['class'], implode(' ', $css_classes) ]);
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.
В минимальном случае, для вывода таблицы с исходным значением и результатом нужны всего два элемента массива в вызове, можно даже без заголовка таблицы:
dbg_table('', [ $исходная_переменная, $результат ]);