Автор Тема: Помогите сделать вывод данных из базы данных MySQL в PHP в виде дерева  (Прочитано 7898 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн AlexDJ

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 6
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
У нас в сети решили сделать портал-базу по рефератам. Все я сделал остались две траблы, про первую я здесь и пишу.
   Итак, имеется база с названием \'referats\'. В ней есть таблицы: {cat [id, name, info]; news [id, data, title, text]; refs [id, scat_id, title, type_id, type, descr, date, pages, comm]; scat [id, cat_id, name]; types [id, name]}. Таблицы отмечены {}, поля в них - [] :)
   Задача такая: нужно организовать на странице вывод вывод работ по категориям в таком виде.
   Сверху должна быть шапка: все предметы, А-Б, В-Г, Д-Е, Ж-З, И-К, Л-М, Н-О, П-Р, С-Т , У-Ф, Х-Ч, Ц-Я
   Дальше само тело вывода: тут должно быть дерево, в котором должны быть выведены категории (cat [name]), причем, если у категории есть подкатегории (то есть в scat есть ссылка на данную категорию в cat - например, scat [cat_id = 7] означает, что в категории cat [id] = 7 есть подкатегории в таблице scat с полем [cat_id] = 7), то слева от категории должен быть "+" и при нажатии на категорию, она бы раскрывалась в виде дерева, меняла цвет на красный, и под ней появлялись бы подкатегории и "+" менялся бы на "-". Соответственно, все наоборот при закрытии.
   Немного подробнее о выводе дерева. Как уже, наверное, понятно, дерево должно выводится в зависимости от запроса из шапки, то есть по алфавитному порядку (или сразу все, в зависимости от выбора). То есть, нажали, допустим, на Ж-З - выведется дерево из категорий, начинающихся на Ж и З и т.д., нажали на П-Р - из категорий, начинающихся на П-Р. По умолчанию, при открытии страницы, должны выводиться категории А-Б.Что касается ссылок. Категории должны иметь ссылки в виде /?mode=cat&id=7 (где ID - это cat [id]), подкатегории - в виде /?mode=item&id=7&sid=1 (где ID - это cat [id], sid - это scat [id]), работы - в виде /?mode=info&id=386 (где ID - это refs [id]).
   Причем, есть еще один нюанс: под деревом должна быть строка: все работы, курсовые, рефераты, контрольные, дипломы, доклады, отчеты. Рядом с этими словами должны быть checkbox’ы, при выборе которых в дереве должны отображаться категории/подкатегории, имеющие внутри себя ТОЛЬКО отмеченные работы. Кстати, это {types [name]}.
   При выборе категории (если она без подкатегорий) или подкатегории, должна открыться новая страница, скажем, spisok.php вместо данной (у меня это все открывается внутри таблицы), на которой сверху наше дерево с выбранным буквенным (или общим) разделом, а под ним собственно, таблица, в которой работы из выбранной категории (подкатегории).
   Причем, есть еще один нюанс: под деревом должна быть строка: все работы, курсовые, рефераты, контрольные, дипломы, доклады, отчеты. Рядом с этими словами должны быть checkbox’ы, при выборе которых в дереве должны отображаться категории/подкатегории, имеющие внутри себя ТОЛЬКО отмеченные работы. Соответственно, в таблице должны отображаться, только те работы, которые сооответствуют выбранному {types [name]}.
   Теперь подробней о структуре таблицы. Сверху таблицы - шапка, в которой слева должны быть подкатегории в выбранной категории (если таковые имеются, иначе NULL), справа должны быть номера страниц (поскольку работ ОЧЕНЬ много, вывод нужно сделать постраничным).
   Далее, шапка самой таблицы. Таблица должна состоять из 5 колонок: ID (refs [id]), тема работы (refs [title]), тип работы (refs [type]), объем (refs [pages]), дата (refs [date]). В таблице, собственно, вывод запроса.
   Под таблицей шапку, аналогичная той, что над таблицей: шапка, в которой слева должны быть подкатегории в выбранной категории (если таковые имеются, иначе NULL), справа должны быть номера страниц (поскольку работ ОЧЕНЬ много, вывод нужно сделать постраничным).


   Вот такая вот задачка. Подобные дерева ввода данных я видел, здесь лишь усложнена структура. Поскольку сам я ч этими деревьями еще не работал, прошу хэлпа, чтобы сразу помогли написать итоговый код. Я думаю, что данный код можно будет потом выложить в open source’ы в интернете, т.к. я думаю, что со временем все сталкиваются с необходимостью реализации подобных проблем.
   Я уже неделю не спал - делал сам портал. Осталось эти два скрипта: дерево и поиск, а я хочу спать :((( Зато, если поможете, я получу автомат по информатике :)))

   ЗЫ Если что - меня можно найти в асе: 125659225, или в ИРКе на 213.24.73.20:6667. Мой ник AlexDJ
   ЗЫ2 Заранее огромный фэнкс и респект тому, кто сможет помочь.

Оффлайн Daiz13

  • наблюдатель
  • Постоялец
  • ***
  • Сообщений: 150
  • +0/-0
  • 2
    • Просмотр профиля
    • http://rg.com.ua/
Мне одно непонятно - с чем именно возникли проблемы, задание описано детально, бери и делай. Возникнут конкретные проблемы - ищи на форуме, может кто-то с таким уже сталкивался, а уже потом спрашивай. Или ты расчитываешь, что кто-то сейчас быстренько напишет тебе твое задание по информатике?

а для начала почитай про Nested Set, например здесь

Оффлайн AlexDJ

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 6
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Для начала я не могу сделать побуквенный вывод, не говоря уже о ссылках. Nested Set попробовал, но запутался окончательно, т.к. там используются вспомогательные три таблицы, а что с ними делать и с чем их есть - я так и не понял :(((

Оффлайн CGVictor

  • теперь местный
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2511
  • +0/-0
  • 2
    • Просмотр профиля
    • http://cg.net.ru
Daiz13
Я понимаю, что хотелось как лучше, но NestedTrees (указание родителя) для понимания гораздо легче чем NestedSets.
LJ: Backslashed life (rss)

Оффлайн Daiz13

  • наблюдатель
  • Постоялец
  • ***
  • Сообщений: 150
  • +0/-0
  • 2
    • Просмотр профиля
    • http://rg.com.ua/
CGVictor
согласен, NestedTrees гораздо легче, хотя в данном случае вообще трудно что-то посоветовать


Цитировать
AlexDJ:
Для начала я не могу сделать побуквенный вывод

к концу недели у меня телепатические способности совсем упали, побуквенный вывод чего и для чего? предметов, рефератов, категорий?

Оффлайн AlexDJ

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 6
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Вот снова и я :)
Итак за то время, пока меня не было, я умудрился сделать почти все сам. :) Осталась лишь одна трабла.

Итак, проблема осталась такая:

К этой проблеме я даже пока не знаю, как подступиться.
Под деревом должна быть строка: все работы, курсовые, рефераты, контрольные, дипломы, доклады, отчеты. Рядом с этими словами должны быть checkbox’ы, при выборе которых в дереве должны отображаться категории/подкатегории, имеющие внутри себя ТОЛЬКО отмеченные работы.

Вот строка с checkbox\'ами (это я сделал сам Ж-) ):

       Все работы
      
       Курсовые
            
       Рефераты
            
       Контрольные
            
       Дипломы
            
       Доклады
            
       Отчеты
            

И что делать дальше, я понятия не имею :(
Дальше нужно проверить, какие checkbox\'ы отмечены, а какие нет, и в зависимости от этого по ссылке из "дерева" должна открываться страница только с выбранными типами работ. Как это сделать - я даже не представляю. Буду признателен, если тут вы сможете помочь.

Оффлайн Daiz13

  • наблюдатель
  • Постоялец
  • ***
  • Сообщений: 150
  • +0/-0
  • 2
    • Просмотр профиля
    • http://rg.com.ua/
шаг 1. На форму добавляеш нудніе чекбоксы:
Курсовые

Рефераты

передаешь данные постом или гетом и потом проверяешь массив types - получаем требуемые типы.

шаг 2. из таблицы извлекаем соответствующие записи (рефераты, контрольные и т.д.). Предполагаю, что все рефераты, курсовые и т.д. хранятся в одной таблице и для каждой работы указан ее тип. Если отмечено "все работы" то извлекаем из таблицы все записи.

Оффлайн AlexDJ

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 6
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Имеется база с названием \'referats\'. В ней есть таблицы: {cat [id, name, info]; news [id, data, title, text]; refs [id, scat_id, title, type_id, type, descr, date, pages, comm]; scat [id, cat_id, name]; types [id, name]}. Таблицы отмечены {}, поля в них - []

Каким образом извлечь эти данные, чтобы они потом выходили на следующей странице? Не понимаю... Можно кодом?

Оффлайн Daiz13

  • наблюдатель
  • Постоялец
  • ***
  • Сообщений: 150
  • +0/-0
  • 2
    • Просмотр профиля
    • http://rg.com.ua/
AlexDJ
твои вопросы это именно тот случай когда ничего более приличного чем RTFM  в голову не приходит
[p]mysql_query[/p]
[p]mysql_fetch_array[/p]
« Последнее редактирование: 22 Ноября 2004, 17:13:29 от Daiz13 »

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Цитировать
Daiz13:
Каким образом извлечь эти данные, чтобы они потом выходили на следующей странице? Не понимаю...

если честно - я тоже.
какой смысл извлекать данные на одной странице, если они нужны на другой?
Какой смысл извлекать ВСЕ данные, какие только есть? Неужили они прямо все и требуются?

Оффлайн AlexDJ

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 6
  • +0/-0
  • 0
    • Просмотр профиля
    • http://

Оффлайн AlexDJ

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 6
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Вот мой скрипт отображения категорий:


function print_cats_8() {

    
$qq "
<script language=javascript>
function undisplayNews5(id)
 {
 document.getElementById(\\"
cat\\"+id).style.display = \\"none\\";
}

function displayNews5(id)
 {
 o = document.getElementById(\\"
cat\\"+id).style;
 o.display = (o.display == \\"
none\\") ? \\"\\" : \\"none\\";
 return false;
}

 function montre(id) {
    if (document.getElementById) {document.getElementById(id).style.display=\'block\';}
  }
  function cache(id) {
    if (document.getElementById) {document.getElementById(id).style.display=\'none\';}
  }

</script>
    "
;


    
$query "SELECT  * FROM  `cat` WHERE  `name` BETWEEN  \'П%\' AND  \'С%\' ORDER by name;";
//    $query = "SELECT  * FROM  `refs` WHERE  `cat_id`  =33 AND  `scat_id`  =24 AND  `type_id`  =2;";
	

    
$rez sql_query($query);

    while (list (
$id$name) = mysql_fetch_array($rez)) {

	
$query2 "SELECT * FROM scat WHERE cat_id=\'".$id."\' ORDER by name;";
	
$rez2 sql_query($query2);


	
if (
mysql_num_rows($rez2) != 0) {
       
$qq .= "<SPAN id=t1 class=\\"style20\\">+ </SPAN>";
	
   
$qq .= "<SPAN id=t2 style=\\"DISPLAYnone\\">-</SPAN>";

  
	
    
$app_1 "onclick=\\"return displayNews5(".$id.");\\" ";
        
$app_2 "onclick=\\"cache(\'a1\'); cache(\'t2\'); montre(\'t1\'); return displayNews5(".$id.");\\" ";
 
	
} else {
       $qq .= "   ";
	
   $qq .= "<SPAN id=t2 style=\\"DISPLAY: none\\">-</SPAN>";
	

	
	
$app_1 = "";
	
	
$app_2 = "";
	
}

   
	
$qq .= "<SPAN id=a1 style=\\"DISPLAY: visible\\"><img src=\\"pics/UnSelected.jpg\\" width=\\"7\\" height=\\"9\\">   <a ".$app_1." href=\\"?mode=cat&id=".$id."\\" class=\\"tree\\">".$name."</a>
\\n</SPAN>";
// 
	
$qq .= "<SPAN id=a2 style=\\"DISPLAY: none\\"><img src=\\"pics/UnSelected.jpg\\" width=\\"7\\" height=\\"9\\">   <a ".$app_2." href=\\"?mode=cat&id=".$id."\\" class=\\"tree\\">".$name."</a>
\\n</SPAN>";


	
if (mysql_num_rows($rez2) != 0) {
//    
	
$qq .= " <img src=\\"pics/corner.jpg\\" width=\\"12\\" height=\\"10\\">  <a ".$app." href=\\"?mode=cat&id=".$id."\\" class=\\"treecat\\">Разделы</a>

//\\n";
	
    $qq .= "<div id=\\"cat".$id."\\" style=\\"display: none;\\">\\n";
	
    while( list ($id2, $cat_id, $name2) = mysql_fetch_array($rez2)) {
	
	
$qq .= "       <img src=\\"pics/UnSelected.jpg\\" width=\\"7\\" height=\\"9\\">   <a href=\\"?mode=item&id=".$id."&sid=".$id2."\\" class=\\"subtree\\">".$name2."</a>
\\n";
	
    }
	
    $qq .="</div>\\n";
	
}
    }
    return $qq;
}

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28