[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Динамическое, древовидное меню. PHP-скрипт.
qsajeal
Здравствуйте! У меня следующая проблема:
У меня есть каталоги неограниченной вложенности:
таблица categ содержит поля:
с_id (первичный ключ)
pc_id (первичный ключ родительской категории)
таблица articles содержит поля:
a_id
c_id(первичный ключ категории в которой находится статья)
-----
Причем в категории могут быть как другие категории, так и статьи
----

Нужно написать скрипт, который будет динамически формировать древовидное меню в виде списка(беря данные из бд, которые естетвенно меняются постоянно), а этот список уже с помощью одного
плагина jQuery преобразуется в древовидное меню
Пример списка:
<li><span class="folder">Folder 1</span>
<ul>
<li><span class="file">Item 1.1</span></li>
<li><span class="file">Item 1.2</span></li>
<li><span class="file">Item 1.3</span></li>
<li><span class="file">Item 1.4</span></li>
<li><span class="file">Item 1.5</span></li>
</ul>
</li>
<li class="closed"><span class="folder">Folder 2</span>
<ul>
<li><span class="folder">Subfolder 2.1</span>
<ul id="folder21">
<li><span class="file">File 2.1.1</span></li>
<li><span class="file">File 2.1.2</span></li>
<li><span class="file">File 2.1.3</span></li>
<li><span class="file">File 2.1.4</span></li>
<li><span class="file">File 2.1.5</span></li>
<li><span class="file">File 2.1.6</span></li>
<li><span class="file">File 2.1.7</span></li>
</ul>
</li>

Я уже 2 дня думаю как это сделать.
Вот если бы уровень вложенности был известен, то легко. А универсального решения найти не могу.
ПОМОГИТЕ МНЕ ПОЖАЛУЙСТА.
Задача ведь действительно интересная и решение может часто использоваться.



Спустя 32 минуты, 56 секунд (14.08.2008 - 18:01) Viking написал(а):
Цитата(qsajeal @ 14.8.2008, 18:29) [snapback]46182[/snapback]
Вот если бы уровень вложенности был известен, то легко. А универсального решения найти не могу.
ПОМОГИТЕ МНЕ ПОЖАЛУЙСТА.
Задача ведь действительно интересная и решение может часто использоваться.

дык а что мешает расчитать уровень вложенности? ведь известно же ид родительской категории для каждого элемента

Спустя 4 дня, 16 часов, 57 минут, 12 секунд (19.08.2008 - 10:59) CaXaP написал(а):
Добрый день.

Я, конечно, не разбираюсь в принципах работы jQuery и формате списка, который ему нужно предоставить, но, имхо, с Вашей задачей справится рекурсивный метод. Для удобства алгоритма, сотрём разницу между статьёй и категорией, объединив всё в 1 массив, с индексом, совпадающим с id (Здесь id - это идентификатор статьи или категории (в БД наверняка может случиться, что у статьи и категории будет один и тот же айди, но средствами пхп можно это обойти (например, сделав в массиве у статей отрицательный индекс)), и со значениями, равными родительской категории. А дальше запускаем рекурсию.

Пример:

//mas - полученный нами из 2 таблиц массив.
function tree($id)
{
if (mas[$id] != '')
{
echo "Начало директории ".$id;
tree(mas[$id]);
echo "Конец директории ".$id;
}
else echo "Статья ".$id;
}

В целом идея такая.

ЗЫ: Пишу с работы - код на отсутствие ошибок проверить возможности нет.

Спустя 3 дня, 15 часов, 12 минут, 10 секунд (23.08.2008 - 02:11) Gibbzy написал(а):
Код
function tree($id){
$sql="SELECT * FROM table WHERE parent_id = '$id";
$result =mysql_query($sql);
echo "<ul>";
while($row=mysql_fetch_array($result)){
echo "<li><span class="file">"$row[ваши данные]"</span></li>";
tree($row[id]);
}
echo "</ul>";
}

вот так

по части динамичности php на такое не способно только если вызывать эту функцию постоянно с каким то промежутком времени, но это нагрузка большая и перезагрузки страницы не избежать.
а так нужно смотреть работает ли JS с mysql но я в этом вопросе некомпитентен.

Спустя 7 часов, 56 минут, 48 секунд (23.08.2008 - 10:08) Alchemist написал(а):
Замечательный пример - как не надо писать скрипты...

n-цать запросов к БД, вместо одного, 4 синтаксических ошибки в 6-ой строке + You have an error in your SQL syntax.

Спустя 6 часов, 14 минут, 57 секунд (23.08.2008 - 16:23) Gibbzy написал(а):
я его на форуме писал
оттуда и ошибки думаю автору топика не составит труда исправить их

по поводу большого кол - ва запросов буду рад если вы мне покажете другой способ построения дерева

Спустя 52 минуты, 35 секунд (23.08.2008 - 17:15) Alchemist написал(а):
Цитата(Gibbzy @ 23.8.2008, 16:23) [snapback]46850[/snapback]
по поводу большого кол - ва запросов буду рад если вы мне покажете другой способ построения дерева

ну... ИМХО интуитивным способом избежать множественных обращений к БД, будет вытаскивание всех данных в массив заранее, и дальнейшая работа с этим массивом в функции (передавая его как параметр или через global)

Спустя 2 года, 7 месяцев, 24 дня, 21 час, 29 минут, 2 секунды (18.04.2011 - 14:44) plyuh написал(а):
http://phpcss.ru/d_v_menu_php.php вот выпадающее и эффективное меню на php

Спустя 13 минут, 29 секунд (18.04.2011 - 14:58) Семён написал(а):


_____________
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.