Всем привет. Хочу поделиться свеженаписанным генератором HTML таблиц.
Участились случаи сбора различной статистики и компоновки ее в сложные таблицы с различными групировками.
Заметив такую тенденцию решил автоматизировать рисование таблиц.
Как итог:
- Избавил себя от составления слоеных циклов для вывода массива;
- Получил стандартизацию структуры массивов;
Простейшая структура
Собственно сам класс статичный, имеет 1 public метод, который принимает 2 параметра:
Table::write($data, $tableInfo = false);
$data
— сам массив, который предстоит напечатать$tableInfo(опционально)
— массив настроек таблицы
Массив $data
имеет следующую структуру:
Array
(
[0] => Array // 1 строка
(
[0] => Cell_00 // 1 ячейка 1 строки
[1] => Cell_01 // 2 ячейка 1 строки
[2] => Cell_02 // 3 ячейка 1 строки
)
[1] => Array // 2 строка
(
[0] => Cell_10 // 1 ячейка
[1] => Cell_11 // 2 ячейка
[2] => Cell_12 // 3 ячейка
)
);
for($i=0;$i<5;$i++)
for($j=0;$j<5;$j++)
$matrix[$i][$j] = $i.$j;
Вложенные массивы
Но это примеры простейших матриц. Главной особенностью класса является автоматический подсчет rowspan
и группировка данных.
Если вместо строки данных(ячейки) вставить аналогичный массив, то все данные этого подмассива будут помещены в строку родителя:
Array
(
[0] => Array
(
[0] => Cell_00
[1] => Cell_01
[2] => Cell_02
)
[1] => Array
(
[0] => Cell_10
[1] => Cell_11
[2] => Array
(
[0] => Array
(
[0] => Cell_120
)
[1] => Array
(
[0] => Cell_121
)
)
)
)
Чуть глубже:
Array
(
[0] => Array
(
[0] => Cell_00
[1] => Cell_01
[2] => Cell_02
)
[1] => Array
(
[0] => Cell_10
[1] => Array
(
[0] => Array
(
[0] => Cell_110
[1] => Array
(
[0] => Array
(
[0] => Cell_1100
)
[1] => Array
(
[0] => Cell_1101
)
)
)
[1] => Array
(
[0] => Cell_111
[1] => Cell_112
)
)
)
)
Кастомизация
Итак, класс умеет автоматически рисовать сложные таблицы и подсчитывать rowspan'ы
. Теперь перейдем к ручной настройке таблицы.
Массив $data
может содержать подмассив ['tableInfo']
— в нем можно указывать различные настройки, в зависимости от его('tableInfo'
) расположения.
Он может находиться:
-
В корне массива, при перечислении строк
ПримерArray ( [0] => Array(...) [1] => Array(...) ... [n] => Array(...) [tableInfo] => Array (...) )
'tableInfo'
расположенный в корне массива позволяет задать общие настройки и параметры для всей таблицы:Array ( [rowspan] => false //Отключить автоматическую группировку. Глобальное правило для всей таблицы. [cols] => Array //Массив колонок ( [0] => Array ( [title] => ФИО //title указывает заголовки колонок(выводятся в th). [key] => name //key указывает какие и в каком порядке выводить ячейки. ) [1] => Array //title и key независимы друг от друга ( //в массиве cols можно задать только title, можно только key [title] => Телефон //Но если решили указывать оба правила, то указывайте их попарно для каждой колонки, [key] => tel //иначе получите нежелательный результат ) ) //Ряд HTML атрибутов для таблицы: [id] => tableId [class] => tableClass [style] => color:#000; [args] => align=left width=80% //В args можно указывать любые атрибуты, будут переданы без изменений. )
Этот же массив можно передать вторым параметром методу:
Table::write($data, $tableInfo = false);
Если используются оба способа одновременно(
isset($data['tableInfo'] && isset($tableInfo)
), то в спорных случаях приоритет отдается правилам из второго массива $tableInfo.array_replace_recursive($data['tableInfo'], $tableInfo);
Пример использования
title
КодArray ( [0] => Array ( [0] => Cell_00 [1] => Cell_01 [2] => Cell_02 ) [1] => Array ( [0] => Cell_10 [1] => Cell_11 [2] => Cell_12 ) [tableInfo] => Array ( [cols] => Array ( [0] => Array ( [title] => Title 1 ) [1] => Array ( [title] => Title 2 ) [2] => Array ( [title] => Title 3 ) ) ) )
Пример использования
key
КодArray ( [0] => Array ( [0] => Cell_00 [1] => Cell_01 [2] => Cell_02 ) [1] => Array ( [0] => Cell_10 [1] => Cell_11 [2] => Cell_12 [3] => Cell_13 //Будет проигнорирован, т.к. не указан в key ) [tableInfo] => Array ( [cols] => Array ( [0] => Array ( [key] => 2 ) [1] => Array ( [key] => 0 ) [2] => Array ( [key] => 1 ) ) ) )
Код$exmpl3 = array( 'tableInfo' => array( 'cols' => array( 0 => array('key' => 'cell0'), 1 => array('key' => 'cell1'), 2 => array('key' => 'cell2'), ) ), 0 => array( 'cell0' => 'Cell_00', 'cell2' => 'Cell_02', 'cell1' => 'Cell_01', ), 1 => array( 'cell0' => 'Cell_10', 'sub' => array( 0 => array( 'cell1' => 'Cell_110', 'sub' => array( 0 => array( 'cell2' => 'Cell_1100', ), 1 => array( 'cell0' => 'asdasd_10', //Не будут выведены, т.к. при выводе подмассива 'cell1' => 'asdasd_110',//учитываются только неиспользованные ключи 'cell2' => 'Cell_1101' ) ) ), 'sub' => array('cell1' => 'Cell_111', 'cell2' => 'Cell_112'), ) ) );
Здесь стоит упомянуть, что если
key
вообще не используются, то массив выводимых ключей заполняется всеми ключами ячеек(не подмассивов), которые находятся в этой строке. Например в этом случае:Код$exmpl = array( 0 => array( 0 => 'Cell_00', 1 => 'Cell_01', 2 => 'Cell_02', ), 1 => array( 0 => 'Cell_10', 1 => 'Cell_11', 2 => 'Cell_12', ), );
Для обоих строчек массив
$colKeys (массив выводимых ячеек)
будет выглядеть вот так:$colKeys = array('Cell_00', 'Cell_01', 'Cell_02',);
-
В любом массиве ячеек (на любом уровне)
ПримерArray ( [0] => Array( [qwe] => йцу [asd] => фыв [tableInfo] => Array (...) ) [1] => Array(...) ... )
Array ( [0] => Array( [qwe] => йцу [asd] => фыв [zxc] => Array( [0] => Array( [jkl] => олд [tableInfo] => Array (...) ) [1] => Array() ) ) [1] => Array(...) ... )
расположенный в массиве ячеек, может содержать настройки для строки, в которой он находится и/или настройки для каждой отдельной ячейки:
'tableInfo''tableInfo' => array( 'rowspan' => false, //Запретить подсчет rowspan для данной строки 'rowspan' => true, //Разрешить подсчет rowspan для данной строки 'rowspan' => 5, //Указать точное значение rowspan для данной строки 'keys' => array( //Правила по модификации масива выводимых ячеек 'delete' => 'all', //Удалить все ключи выводимых ячеек 'delete' => array('cell2'), //Удалить некоторые ключи(тут 'cell2') 'add' => array('cell3'), //Добавить в конец несколько ключей(тут 'cell3') 'forwarding' => array( //Замена одного ключа на другой. Можно указать несколько правил 0 => array( 'src' => 'cell1', //В этом примере вместо ячейки cell1 'dst' => 'cell2' //Будет выведена ячейка cell2 ), ), //Эти правила действуют, даже если вы не указывали явно список ключей для таблицы ), //т.к. в этом случае массив выводимых ячеек будет содержать все ячейки строки 'cells' => array( //Правила для ячеек 'cell2' => array( //Массив правил для ячейки 'cell2' 'rowspan' => false, //Отключить 'rowspan' => true, //Включить 'rowspan' => 5, //Указать точное значение 'colspan' => 6, //Указать ТОЛЬКО точное значение //Ряд HTML атрибутов для ячейки: 'id' => 'cellId', 'class' => 'cellClass', 'style' => 'color:#000;', 'args' => 'align=left width=80%' ) ), //Ряд HTML атрибутов для строки: 'id' => 'rowId', 'class' => 'rowClass', 'style' => 'color:#000;', 'args' => 'align=left width=80%' );
Приоритеты rowspan
- Правило для ячейки (самое главное правило);
- Правило для строки;
- Правило для таблицы;
- По умолчанию rowspan считается всегда, если присутствует подмассив.
Ну, вот и все. Некоторые моменты решил не рассматривать подробно, если будут вопросы — распишу.
Скачать класс Table
Автор: 0xSS
Как вы думаете, вот тут http://c-wd.ru/tools/cnopka/ красивую кнопку можно сделать для сайта?