Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Вебмастеру (http://forum.oszone.net/forumdisplay.php?f=22)
-   -   Дерево ссылок с неограниченным числом вложений (http://forum.oszone.net/showthread.php?t=149087)

rizz 27-08-2009 20:00 1204837

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

DedAlex 27-08-2009 22:58 1205011

Можно создать таблицу с 3 полями: ID, ID "родителя", ссылка.

rizz 29-08-2009 22:11 1206671

Вложений: 2
id | ud_parent | ud_current | time_create | nazvanie | status |

id - autoincrement
ud используются потому что хочется понятные имена подразделов, а не цифры id
status 1 - ветка дерева развёрнута, 0 - ветка дерева свёрнута

сделал в одной таблице table.gif image.gif , но сейчас непонятно как отобразить это дерево,
получается опять нужно писать бесконечно вложенный код, этот код отобразит только верхний уровень, а для каждого вложенного уровня чё новый писать, или как-нибудь функцией может написать

PHP код:

echo("<!-- razdel -->");

$result mysql_query ("SELECT * FROM razdel ORDER BY `id` ASC",$db);
$myrow mysql_fetch_array ($result);

do

if (
$myrow['ud_current'] == $razdel)

{


  if (
$myrow['status'] == 0// в зависимости от status отображает plus или minus
  
{
  echo(
"
  <a href='$pathdomain/?razdel=$razdel&status=1&status_target=$myrow[ud_current]'><image src='/img/plus.gif' style='float:left; margin: 4px 10px 0px 0px;'></a>
  "
);
  }
  else
  {
  echo(
"
  <a href='$pathdomain/?razdel=$razdel&status=0&status_target=$myrow[ud_current]'><image src='/img/minus.gif' style='float:left; margin: 4px 10px 0px 0px;'></a>
  "
);
  }


echo(
"
<div class='conteiner_link_1_current'>
$myrow[nazvanie] <a href='$pathdomain/?razdel=$myrow[ud_current]' class='add_razdel' onClick='openwindow = window.open(\"add_razdel.php\", \"add_razdel\", \"toolbar=0,width=360,height=150\"); openwindow.focus();' title='Добавить раздел'>*</a>
</div>
"
);

}
else
{


  if (
$myrow['status'] == 0// в зависимости от status отображает plus или minus
  
{
  echo(
"
  <a href='$pathdomain/?razdel=$razdel&status=1&status_target=$myrow[ud_current]'><image src='/img/plus.gif' style='float:left; margin: 4px 10px 0px 0px;'></a>
  "
);
  }
  else
  {
  echo(
"
  <a href='$pathdomain/?razdel=$razdel&status=0&status_target=$myrow[ud_current]'><image src='/img/minus.gif' style='float:left; margin: 4px 10px 0px 0px;'></a>
  "
);
  }


echo(
"
<div class='conteiner_link_1'>
<a href='$pathdomain/?razdel=$myrow[ud_current]'>$myrow[nazvanie]</a>
</div>
"
);

}

while (
$myrow mysql_fetch_array ($result));




echo(
"<a href='#' onClick='openwindow = window.open(\"add_razdel.php\", \"add_razdel\", \"toolbar=0,width=360,height=150\"); openwindow.focus();' title='Добавить раздел'>Добавить раздел</a>");


echo(
"<!-- razdel -->"); 


Coutty 30-08-2009 09:42 1206864

Для отображения воспользоваться рекурсией (надеюсь, правильно алгоритм составил):
Код:

запрос_элементов_уровня(х) // изначально x=0, но при рекурсивном вызове будет увеличиваться
{ // начало функции
запросить_строки(x);
цикл_по_всем_выданным_результатам
      {
      если_уровень_не_самый_нижний // ведь метка в таблице будет?
            {
            вывести_текущую_строку_с_отступом(x); // и соответствующим JavaScript'ом
            запрос_элементов_уровня(x+1);
            }
      иначе // уровень нижний
            {
            вывести_ссылку_с_отступом(x); // без JS уже
            return;
            }
      }
} // конец функции

Разве в интернете нет готовых функций?


Но, быть может, использовать XML+XSLT? Думается мне, что мороки будет меньше.


Время: 14:57.

Время: 14:57.
© OSzone.net 2001-