la_vanille_ciel
Интересующийся
Offline
|
|
« : 20-05-2008 02:52 » |
|
Необходимо создать список или по-другому дерево, которое выглядит таким образом, что при нажатии на узел, подузлы у него выпадают. Вот есть дерево: <html> <head> <title>Untitled web-page</title> </head> <body>
<?php
function get_tree($parent_id = 0) { $out="<ul>"; $query = "SELECT * FROM structure WHERE parent_id = '$parent_id'"; $result = mysql_query($query); while ($row = mysql_fetch_array($result)) { $out .= "<li>". "razdel_name =". $row['razdel_name']." "; $out .= "ID_RAZDEL=". $row['ID_RAZDEL']." "; $out .= "parent_id=". $row['parent_id']." "; $out .= " "; $out .=get_tree($row['ID_RAZDEL']); $out .="</li>"; } return $out."</ul>"; }
$link = mysql_connect("localhost", "root", "1") or die(mysql_error()); mysql_select_db("cad_ugdp", $link) or die(mysql_error()); $test = get_tree(); echo $test;
//Начинаем с начальной строки $tree_items = "[ ['HOME', 'index.php', ";
//Вызываем функцию для построения меню for ($i = 1; $i <= 4; $i++) { $tree_items .= get_tree($i);
} //Заканчиваем структуру конечной строкой $tree_items .= "] ];"; //Вс&#38;#184;, структура для меню получена
?> </body>
</html> И есть список: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <script type="text/javascript"> function subDisplay(subName) { var el = document.getElementById(subName); if (el.style.display!='block') { el.style.visibility='visible'; el.style.display='block'; } else { el.style.visibility='hidden'; el.style.display='none'; } } </script> </head> <body> <ul> <li><a href="#">1</a></li> <li><a href="#" onclick="subDisplay('s2')">2</a> <ul id="s2"> <li><a href="#">2.1</a></li> </ul> </li> </ul> </body> </html> И теперь надо сделать один скрипт такой, который будет делать список/дерево, у которого подпункты основных пунктов выпадают. Да, и вот такая табличка в базе данных: CREATE TABLE STRUCTURE ( ID_RAZDEL int(11) NOT NULL auto_increment, razdel_name varchar(255) NOT NULL DEFAULT '', path varchar(50) NOT NULL DEFAULT '', parent_id int(11) not null default '0', PRIMARY KEY (ID_RAZDEL) ) ENGINE=INNODB;
|
|
« Последнее редактирование: 20-05-2008 02:56 от la_vanille_ciel »
|
Записан
|
|
|
|
Sla
|
|
« Ответ #1 : 20-05-2008 07:44 » |
|
тебе нужно в дочерние списки добавить id для возможности видимости списка т.е. манипулировать значением "subDisplay('s2')" и <ul id="s2">
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Sla
|
|
« Ответ #2 : 20-05-2008 07:54 » |
|
можно использовать static переменную function get_tree($parent_id = 0) { static $id=0;
при входе в функцию инкремнетируется при віходе декрементируется
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Sla
|
|
« Ответ #3 : 20-05-2008 08:00 » |
|
т.е. код приблизительно такой function get_tree($parent_id = 0) { static $id=0; $id++; /*инкремент*/ get_tree; $id--; /*декремент*/
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
la_vanille_ciel
Интересующийся
Offline
|
|
« Ответ #4 : 20-05-2008 08:02 » |
|
То есть эту новую статик get_tree будем использовать вместо старой? Или ее нужно вставить туда, где js ?
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #5 : 20-05-2008 08:08 » |
|
нет, это нужно вставить в php скрипт вот попробуй <html> <head> <title>Untitled web-page</title> </head> <body>
<?php
function get_tree($parent_id = 0) { static $id=0; $out="<ul>"; $query = "SELECT * FROM structure WHERE parent_id = '$parent_id'"; $result = mysql_query($query); while ($row = mysql_fetch_array($result)) {
$out .= "<li>". "razdel_name =". $row['razdel_name']." "; $out .= " ".$id. " "; $out .= "ID_RAZDEL=". $row['ID_RAZDEL']." "; $out .= "parent_id=". $row['parent_id']." "; $out .= " "; $id++; $out .=get_tree($row['ID_RAZDEL']); $id--; $out .="</li>"; } return $out."</ul>"; }
$link = mysql_connect("localhost", "root", "1") or die(mysql_error()); mysql_select_db("cad_ugdp", $link) or die(mysql_error()); $test = get_tree(); echo $test;
//Начинаем с начальной строки $tree_items = "[ ['HOME', 'index.php', ";
//Вызываем функцию для построения меню for ($i = 1; $i <= 4; $i++) { $tree_items .= get_tree($i);
} //Заканчиваем структуру конечной строкой $tree_items .= "] ];"; //Вс&#38;#184;, структура для меню получена
?> </body>
</html>
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
la_vanille_ciel
Интересующийся
Offline
|
|
« Ответ #6 : 20-05-2008 08:14 » |
|
Получается такой же результат, как и при старом варианте php кода..я наверно, что-то не поняла.. То есть для чего мы делали статик get_tree?
|
|
« Последнее редактирование: 20-05-2008 08:16 от la_vanille_ciel »
|
Записан
|
|
|
|
Sla
|
|
« Ответ #7 : 20-05-2008 08:21 » |
|
ну почему же старый? ты видишь как меняется ID в зависимости от вложенности
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
la_vanille_ciel
Интересующийся
Offline
|
|
« Ответ #8 : 20-05-2008 08:25 » |
|
ДА, дошло!!! Там циферки по узлам распределены.... А как теперь, чтобы ссылками сделать?
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #9 : 20-05-2008 08:47 » |
|
вооот, теперь мы пришли к котлетам, или к мухам. function get_tree($parent_id = 0) { static $id=0; $out="<ul>"; $query = "SELECT * FROM structure WHERE parent_id = '$parent_id'"; $result = mysql_query($query); while ($row = mysql_fetch_array($result)) {
$out .= "<li>"; /* вот где-то тут нужно сформировать тег <a> следующего вида $out .= "<a href=\"НУЖНАЯ ССЫЛКА\">"; */ $out .= "razdel_name =". $row['razdel_name']." "; $out .= " ".$id. " "; $out .= "ID_RAZDEL=". $row['ID_RAZDEL']." "; $out .= "parent_id=". $row['parent_id']." "; $out .= " "; /*а вот здесь тег <a> нужно закрыть $out .= "</a>"; $id++; $out .=get_tree($row['ID_RAZDEL']); $id--; $out .="</li>"; } return $out."</ul>"; } /code]
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
|
la_vanille_ciel
Интересующийся
Offline
|
|
« Ответ #11 : 20-05-2008 09:33 » |
|
Sla, спасибо! Теперь ссылки есть: <html> <head> <title>Untitled web-page</title> </head> <body>
<?php
function get_tree($parent_id = 0) { static $id=0; $out="<ul>"; $query = "SELECT * FROM structure WHERE parent_id = '$parent_id'"; $result = mysql_query($query); while ($row = mysql_fetch_array($result)) {
$out .= "<li>"; // вот где-то тут нужно сформировать тег <a> //следующего вида $out .= "<a href=\"#\">"; //$out .= "<a href=\"НУЖНАЯ ССЫЛКА\">";
$out .= "razdel_name =". $row['razdel_name']." "; $out .= " ".$id. " "; $out .= "ID_RAZDEL=". $row['ID_RAZDEL']." "; $out .= "parent_id=". $row['parent_id']." "; $out .= " "; //а вот здесь тег <a> нужно закрыть $out .= "</a>"; $id++; $out .=get_tree($row['ID_RAZDEL']); $id--; $out .="</li>"; } return $out."</ul>"; }
$link = mysql_connect("localhost", "root", "7") or die(mysql_error()); mysql_select_db("cad_ugdp", $link) or die(mysql_error()); $test = get_tree(); echo $test;
//Начинаем с начальной строки $tree_items = "[ ['HOME', 'index.php', ";
//Вызываем функцию для построения меню for ($i = 1; $i <= 4; $i++) { $tree_items .= get_tree($i);
} //Заканчиваем структуру конечной строкой $tree_items .= "] ];"; //Вс&#38;#38;#184;, структура для меню получена
?> </body>
</html> Теперь нужно их схлопывать
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #12 : 20-05-2008 09:47 » |
|
так как id тега должен быть уникален, т.е. мы должны получить что-то типа такого <ul> <li><a href="#">1</a></li> <li><a href="#" onclick="subDisplay('s2')">2</a> <ul id="s2"> <li><a href="#">2.1</a></li> <li><a href="#">2.2</a></li> </ul> </li> <li><a href="#" onclick="subDisplay('s3')">3</a> <ul id="s3"> <li><a href="#">3.1</a> <ul id ="s4"> <li><a href="#">3.1.1</a></li> <li><a href="#">3.1.2</a></li> </li> <li><a href="#">3.2</a></li> </ul> </li>
</ul>
то для такого рода списка, нужно иметь и уникальный $id т.е. после вызова дочернего get_tree не нужно иметь декремента
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Sla
|
|
« Ответ #13 : 20-05-2008 12:05 » |
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <title>Untitled web-page</title> <script type="text/javascript"> function subDisplay(subName) { var el = document.getElementById(subName); if (el.style.display!='block') { el.style.visibility='visible'; el.style.display='block'; } else { el.style.visibility='hidden'; el.style.display='none'; } } </script> </head> <body>
</head> <body> <?php function get_tree($parent_id = 0) { static $id=0; $out="<ul id=\"s". $id ."\">"; $query = "SELECT * FROM structure WHERE parent_id = '$parent_id'"; $result = mysql_query($query); while ($row = mysql_fetch_array($result)) { $out .= "<li>"; // вот где-то тут нужно сформировать тег <a> //следующего вида $out .= "<a href=\"#\" ";
$out .= "onclick=\"subDiasplay('s". $id. "')>"; //$out .= "<a href=\"НУЖНАЯ ССЫЛКА\">"; $out .= "razdel_name =". $row['razdel_name']." ";
$out .= " ".$id. " "; $out .= "ID_RAZDEL=". $row['ID_RAZDEL']." "; $out .= "parent_id=". $row['parent_id']." "; $out .= " "; //а вот здесь тег <a> нужно закрыть $out .= "</a>"; $id++; $out .=get_tree($row['ID_RAZDEL']); $out .="</li>"; } return $out."</ul>"; }
$link = mysql_connect("localhost", "root", "7") or die(mysql_error()); mysql_select_db("cad_ugdp", $link) or die(mysql_error()); $test = get_tree(); echo $test;
//Начинаем с начальной строки $tree_items = "[ ['HOME', 'index.php', ";
//Вызываем функцию для построения меню for ($i = 1; $i <= 4; $i++) { $tree_items .= get_tree($i);
} //Заканчиваем структуру конечной строкой $tree_items .= "] ];"; //Вс&#38;#38;#184;, структура для меню получена
?> </body>
</html>
вот промежуточный код, возможны ошибки
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
la_vanille_ciel
Интересующийся
Offline
|
|
« Ответ #14 : 20-05-2008 15:40 » |
|
Рисуется одна точка первая и все. Это связано с none в функции subDisplay ?
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #15 : 20-05-2008 21:35 » |
|
ничего подобного, это связано с разметкой html, в частности вот тута (или здеся) (или тама) было $out .= "onclick=\"subDiasplay('s". $id. "')>"; нуно $out .= "onclick=\"subDiasplay('s". $id. "')\">"; реально будут еще бока, но мы их с тобой вычистим по мере поступления как вопросов, так и ответов
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
la_vanille_ciel
Интересующийся
Offline
|
|
« Ответ #16 : 26-05-2008 17:19 » |
|
Было бы здорово! Я нашла еще скрипт дерева готовый без боков вроде...вот смотри: http://www.mattkruse.com/javascript/mktree/source.htmlОно хорошо рисуется. Теперь проблема в другом. Мне хотелось бы, чтобы страница выглядела так: Слева колонка с деревом и дальше справа описание. То есть выбираешь раздел, подраздел, элемент в дереве в левой колонке, нажимаешь на этот элемент и справа появляется описание и ссылка для скачки. То есть в базе у меня есть таблица, которая содержит информацию о каждом элементе: ID_DRAWING int(11) NOT NULL auto_increment, drawing_name varchar(60) NOT NULL default '', weight int(11) NOT NULL default '0', downloads_amount int(5) NOT NULL default '0', description varchar (300) NOT NULL default '', index_url varchar(100) NOT NULL default 'http://', PRIMARY KEY (ID_DRAWING), RAZDEL_ID int(11), index raz_id (RAZDEL_ID), FOREIGN KEY (RAZDEL_ID) REFERENCES STRUCTURE (ID_RAZDEL) on delete cascade, То есть при нажатии на элемент должна как-то браться информация из этой таблице о выбранном элементе и выводиться справа в колонке, а именно описание и там же ссылка, по которой происходит скачка.
|
|
|
Записан
|
|
|
|
|
Sla
|
|
« Ответ #18 : 27-05-2008 06:31 » |
|
la_vanille_ciel, ты путаешь php, html, javscript я тебе уже давал "натырку" ознакомиться со стилями давал пример реализованного меню/подменю и даже больше - мы это с тобой сделали. Задавай более уточнённые запросы, а не "хочу вот так"
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
|