Структура массива для формирования HTML-таблицы

netstuff

Новичок
Структура массива для формирования HTML-таблицы

Добрый день, уважаемые!

Возникла необходимость в разработке механизма для вывода различных результатов запроса к БД в виде HTML-таблицы.
Принято решение прогонять данные через массив, который в последствии будет прогоняться через стандартный модуль.

После долгих и мучительных попыток получить требуемую структуру, пришел к такому массиву:

PHP:
Array
(
    [0] => Array
        (
            [1] => Расход продукции по видам при дегустации
        )

    [1] => Array
        (
            [1] => Количество продукции на начало дня
            [2] => Количество продукции в течении дня
            [3] => Количество продукции на конец дня
        )

    [2] => Array
        (
            [1] => Вид 1
            [2] => Вид 2
            [3] => Вид 3
            [4] => Вид 1
            [5] => Вид 2
            [6] => Вид 3
            [7] => Вид 1
            [8] => Вид 2
            [9] => Вид 3
        )
где, первый уровень массива - это строки, а второй -столбцы.
в данной структуре крайне неудобно то, что невозможно отследить произвольные colspan и rowspan. другими словами, пока деление столбцов равномерное (в данном случае, каждая вторая строка имеет по три дочерних столбца) - все в порядке. но если в этой же структуре понадобится формула не 3-3-3, а 2-4-2- сделать это уже будет невозможно.

пожалуйста, кто уже имел дело с похожей задачей, подкиньте идейку. потому как мозг мой мягок в этот час :eek:
 

FractalizeR

Новичок
Вы не могли бы привести различные примеры структур, которые вам требуется отображать?
Мне кажется, вы смешиваете заголовок таблицы и, собственно, данные. Насколько я понял, в приведенном вами примере rowspan и columnspan касаются исключительно заголовка таблицы, но никак не данных.
 

netstuff

Новичок
FractalizeR

Структура должна быть единая - универсальная.
По поводу смешивания данных и хедера - а как иначе, они же завязаны в HTML-таблице.
По поводу rowspan и colspan - пока они нужны только в заголовке. Но хотелось бы иметь универсальный подход, чтобы и rowspan и colspan выводились в любом доступном месте таблицы.
 

Фанат

oncle terrible
Команда форума
netstuff
А зачем вообще возлагать на PHP работу по рисованию заголовка таблицы?
Во-первых, заголовок - это элемент оформления, то есть,часть шаблона, а не скрипта
Во-вторых, неочевидная логика задания всех этих форматирующих параметров не сложнее ли окажется простого ручного написания этого заголовка таблицы?
 

FractalizeR

Новичок
Автор оригинала: netstuff
FractalizeR

Структура должна быть единая - универсальная.
По поводу смешивания данных и хедера - а как иначе, они же завязаны в HTML-таблице.
По поводу rowspan и colspan - пока они нужны только в заголовке. Но хотелось бы иметь универсальный подход, чтобы и rowspan и colspan выводились в любом доступном месте таблицы.
Вам не кажется, что вы сами себе придумываете проблему? Заголовок - есть заголовок. Он может быть произвольной сложности и самое простое иметь его уже готовым, прямо в HTML. А каждая строка данных результата запроса всегда имеет одно и то же число столбцев. Во всяком случае, так это видится мне, и именно поэтому я вас попросил привести примеры.

Если вам действительно нужна панацея, то вы изобретаете велосипед. Гораздо проще воспользоваться каким-нибудь готовым механизмом отчетов типа http://phpreports.sourceforge.net/, а не выдумывать описание сложной структуры данных простым массивом.
 

С.

Продвинутый новичок
Вопрос у человека не ерундовый, а очень важный. Это как раз тот случай, когда визуализация имеет довольно сложную логику (например слияние ячеек). Имеются два варианта:

1. Создать данные по структуре модели и выпихнуть в шаблон. Пусть верстальщик там переводит древовидную структуру в плоскую матрицу таблицы. Но тогда в шаблоне получается довольно безобразный кусок кода в перемешку с тэгами.

2. Создать в модели уже более-менее "плоскую" структуру данных и верстальшик ее выдаст элементарным цыклом. Но тогда в модель попадают вьюшные вещи.

Как поступить лучше - совсем не очевидно.
 

dark-demon

d(^-^)b
3. Создать отдельную вьюху для представления древовидной модели в виде табличной модели.
 

С.

Продвинутый новичок
Это как "отдельную вьюху"? Разбить один шаблон на два? И чем это отличается от (1)?
 

netstuff

Новичок
*****

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

FractalizeR
вполне возможно, что я и создаю себе проблемы, но в рамках поставленной задачи я иного пути пока не вижу.
за ссылку спасибо. поизучаю. хотя, надежда слабая =/

ВСЕМ, ВСЕМ, ВСЕМ
Фактически, пользователь должен иметь возможность сам состряпать таблицу по определенному шаблону, в которой как столбцы так и строки представляют собой динамические данные.

пример отчета:


Видов товара может быть произвольное количество.
Это самый простой блок отчета.
Блоки должны уметь состыковыватья в единую таблицу.

ИТАК? Что скажете?
 

AmdY

Пью пиво
Команда форума
Приведённый массив явно не удовлетворяет требованием задачи, тебе нужна древовидная структура, обрабатывчыдея рекурсивной функцией.
Как вариант, в данной задаче хорошо подойдёт xslt
 

FractalizeR

Новичок
От каких данных при решении задачи нужно отталкиваться? Что у нас определено на этапе проектирования и что может настраиваться пользователем?
 

dark-demon

d(^-^)b
AmdY, в данном случае xslt - слабый помощник..
С., это значит создать программу, которая будет трансформировать модель к другому формату, которую уже отдавать верстальщику.
 

С.

Продвинутый новичок
dark-demon, лично для себя я именно к такому же способу пришел. Только у меня язык не поворачивается это "вьюхой" называть. Для ТС, например, в его конкретном случае это похоже вообще неотъемлемая часть модели.

-~{}~ 01.02.08 06:03:

netstuff, ничего тут мудрствовать не надо. Делать прямо "в лоб". Массив строк, в каждой строке - массив ячеек, где каждая ячейка является:

PHP:
array('colspan'=>1, 'rowspan'=>1, 'value'='...');
 

netstuff

Новичок
FractalizeR

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

вид шаблона, в целом похож на тот что я выложил, с поправкой на разное количество столбцов и некую вариативность шапки.

ИТОГО: шапка содержит часть статических данных и часть динамических (динамическаячасть самая последняя и именно она формирует количество столбцов). строки таблицы - это также динамические данные. ячейки, соответственно должны связывать динамические строки и динамические столбцы.

ВСЕМ ВСЕМ ВСЕМ
Пытался ещё реализовать это с помощью другой структуры массива. Это был двухмерный массив, первый элемент которого содержал родительский идентификатор, а второй собственный. Таким образом я получал жоскую зависимость элементов между собой. Но проблема такой структуру, как я считаю, в её негибкости. Во-первых,сложно получить часть таблицы. Во-вторых, также непросто внедрять в таблицу дополнительные данные.
 

netstuff

Новичок
FractalizeR

Имел в виду стандартный модуль для вывода таблиц по заранее определенной структуре массива. Чтобы можно было в дальнейшем использовать для вывода любых таблиц в любом месте.

Что-то энтузиазм стих =)
 

FractalizeR

Новичок
Вы не посмотрели phpreports? Мне все же пока не понятно, чем вас не устраивает решение типа:

Пользователь формирует:
1. SQL запрос с именоваными полями. В зависимости от сложности системы это может быть запрос на SQL-подобном языке (как в 1С бухгалтерии), если вы хотите скрыть от пользователя истинную структуру таблиц БД, или на чистом SQL (не слишком безопасно, но, думаю, это решаемо).
2. Шаблон, в который передается датасет, сформированный из запроса (например, Smarty шаблон).

Фактически, шаблон реализует нестандартную логику форматирования данных. А результат запроса - всегда таблица.

Ваш код выполняет запрос и рендерит пользователю шаблон на основании его результатов.
 
Сверху