Форум сетевых администраторов
Показаны 9 сообщений на этой странице

Форум сетевых администраторов (http://netadmin.ws/forum/index.php)
- PHP (http://netadmin.ws/forum/forumdisplay.php?forumid=6)
-- Выборка из БД и генерация Html таблицы (http://netadmin.ws/forum/showthread.php?threadid=11201)


Помещено he][es 10-11-2005 в 19:34:

Выборка из БД и генерация Html таблицы

Поможите! Мозги пухнут...
Задача: есть 3 таблицы (2 "справочника" и 1 с данными)
Необходимо вывести их на экран причём по горизонтали строки 1огосправочника, по вертикали 2ого а данные соответственно в центре.
Те. таблица с данными это
id | id_name | id_type | summ
(где соответственно id_name и id_type это idшники 2х справочных таблиц) НО таблицы у нас не простые! Они древовидные!
Ну да хрен бы с ними! Как мне это наиболее красивым образом в HTML то табличку вывести, да ещё и с наименьшими затратами?..

Придумал такую муть:

PHP:


$rashodi 
= ''; $col = '';
$result = $db->query("SELECT title, level, cleft, cright FROM structura_rashodov ORDER BY cleft ASC");
$kol_vo = $result->numRows(); $min=$max=0;
while (
$row = $result->fetchRow(DB_FETCHMODE_ASSOC)) { // Генерим заголовок таблицы
    
if($row['level'] > 1) { // Столбцы гасходы которых по уровню вложенности больше единицы по умолчанию прячем
        
$rashodi .= '<td id="td_'.$row['level'].'_'.$row['cleft'].'" onClick="show_columns('.$row['level'].', '.$row['cleft'].', '.$row['cright'].');">l'.$row['level'].$row['title'];
        
$col .= '<col id="'.$row['level'].'_'.$row['cleft'].'" style="display: none; visibility: collapse;">'; 
    } else {
        
$rashodi .= '<td id="td_'.$row['level'].'_'.$row['cleft'].'" onClick="show_columns('.$row['level'].', '.$row['cleft'].', '.$row['cright'].');">'.$row['title'];
        
$col .= '<col id="'.$row['level'].'_'.$row['cleft'].'">';
    }
    if(
$min > $row['cleft']) { $min = $row['cleft']; }
    if(
$max < $row['cright']) { $max = $row['cright']; }
}
$result->free();

$result = $db->query("SELECT *, structura_kks.title AS structura_kks_title FROM limits INNER JOIN structura_kks ON limits.structura_kks_id = structura_kks.id INNER JOIN structura_rashodov ON limits.structura_rashodov_id = structura_rashodov.id ORDER BY structura_kks.cleft, structura_rashodov.cleft");
$tr = '';
while (
$row = $result->fetchRow(DB_FETCHMODE_ASSOC)) {
    
$structura_rashodov = $row['structura_rashodov_id'];
    if (isset(
$structura_kks) && $row['structura_kks_id'] == $structura_kks) {
        
$tr .= '<td>'.$row['to_year_total']; $td_kol_vo--;
    } else {
        
$structura_kks = $row['structura_kks_id'];
        if (isset(
$td_kol_vo) && $td_kol_vo != $kol_vo) $tr .= str_repeat('<td>&nbsp;',$td_kol_vo); // Добиваем таблицу пустыми ячейками если для структ. подразделения не указаны какие-то расх.статьи 
// Вот тут то и нашёл баг!
// Суммы расходов она будет лепить подряд... Без соотношения со столбцами... :/
        
$td_kol_vo = $kol_vo;
        
$tr .= '<tr><td>'.$row['structura_kks_title'].'<td>'.$row['to_year_total'];
        
$td_kol_vo--;
    }
}
if (isset(
$td_kol_vo) && $td_kol_vo != $kol_vo) $tr .= str_repeat('<td>&nbsp;',$td_kol_vo);
$parser->site_body .= '<table style="empty-cells: show;" border=1 id="limit_list"><col>'.$col.'
<thead><tr><td>Структура ТО'
.$rashodi.'
<tbody>'
.$tr.'</tbody>
</table>'
;
$result->free();



Но чего-то меня от этой конструкции подташнивает!.. Всё как то "гнило" сделано, слишком много "хаков" и не элегантно...
Не подскажете чего умного?.. Уж очень не хочется обращаться к БД в цикле... Перебирая сначала один, а потом второй справочники...

(дело в том, что в этой таблице ещё и строки и столбцы прятать придётся, но это ява, это я отдельный топ создам.)

__________________
Админ - вождь Апачей...


Помещено he][es 15-11-2005 в 12:27:

Господа!.. Поможите люди добрые!
Свихнусь скоро...

__________________
Админ - вождь Апачей...


Помещено Xrobak 15-11-2005 в 14:17:

может тебе одна из статей поможет чем-то:
_http://phpclub.ru/detail/article/2002-06-03
_http://phpclub.ru/detail/article/db_tree


Помещено he][es 15-11-2005 в 17:15:

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

__________________
Админ - вождь Апачей...


Помещено Xel'[Naga] 15-11-2005 в 19:47:

Может что-нить наподобии проводника? Имхо удобно когда сильно много вложений. Типа с плюсиками и всё такое =)

__________________
Всего хорошего.


Помещено he][es 16-11-2005 в 06:44:

Xel'[Naga] ну что то на подобе и нужно. НО в виде таблицы!.. По др. не получится

__________________
Админ - вождь Апачей...


Помещено polo 17-11-2005 в 12:04:

Я например при использовании деревьев, сначало создаю массив типа:
массив[уникид] = набор записи
и другой массив:
массив1[уникид - родительская][] = уникид - подкатегории

Потом используя функцию которая проходит по массив1 создает любое дерево.

__________________
Всегда есть решение.


Помещено he][es 17-11-2005 в 14:38:

polo я вот тоже "умозрительно" пришёл к подобному варианту. Но возникла какая то фигня при
array_title[] = 5;
он упорно выдает ошибку JS... Т.е. нужно обязательно нумеровать все элементы?..

__________________
Админ - вождь Апачей...


Помещено polo 17-11-2005 в 16:25:

ну для JS нужно генерировать массив совместимый с JS.

__________________
Всегда есть решение.


Формат времени GMT. Текущее время 05:17.
Показаны 9 сообщений на этой странице

Powered by: vBulletin Version 2.2.4
Copyright © Jelsoft Enterprises Limited 2000, 2001.