|
|
|
| Облазил форум, нашел решения для раскрытия всего списка
-1
--1.1
--1.2
-2
--2.1
--2.2
Добавил условие, чтобы полностью выводилась только одна ветвь (про большую глубину вложенности уже не говорю - сдался, да и как-то не особо такая возможность нужна), т.е. так:
-1
-2
--2.1
--2.2
-3
-4
Вот код вывода:
<?php
$_GET['parent_id'] = isset($_GET['parent_id']) ? $_GET['parent_id'] : NULL;
function recurse($id, $count)
{
$count += 2;
$query = mysql_query("SELECT * FROM testtest WHERE parent_id = $id") or die(mysql_error());
if(mysql_num_rows($query) > 0) {
while($arr = mysql_fetch_assoc($query)) {
echo str_repeat(" ", $count) . "<a href='?parent_id={$arr['id']}'>{$arr['name']}</a><br>";
//if ($_GET['parent_id'] == $arr['id']) {
recurse($arr['id'], $count);
//}
}
}
}
recurse(0, -2);
|
Как видно, ситуация идеализированна, т.к. через ГЕТ параметр передается id каталога, ветви которого нужно раскрыть.
Вопрос следующий: как сделать так, чтобы выбирая один из подпунктов (2.1, 2.2) дерево под 2 оставалось открытым? Сейчас страница подпункта откроется, но дерево свернется - это неудобно пользователям. | |
|
|
|
|
|
|
|
для: neadekvat
(15.05.2010 в 14:00)
| | JS и cookies, и готовых уже скриптов таких меню предостаточно. | |
|
|
|
|
|
|
|
для: sim5
(15.05.2010 в 14:13)
| | Ммм..динамическое меню на js - это несколько другое.
В том-то и смысл, прежде чем js использовать, хотелось бы решить эту задачу средствами php, а уж потом туда js прикрутить. | |
|
|
|
|
|
|
|
для: neadekvat
(15.05.2010 в 14:16)
| | А смысл задачи свойственные клиенту решать на РНР? | |
|
|
|
|
|
|
|
для: sim5
(15.05.2010 в 14:29)
| | То есть вы считаете, что древовидные менюшки обязательно строится с использованием js? | |
|
|
|
|
|
|
|
для: neadekvat
(15.05.2010 в 14:31)
| | Древовидное и компактное, значит раскрываемое (веть в Проводнике пример), и вы полагаете это будет удобно делать средствами РНР? | |
|
|
|
|
|
|
|
для: sim5
(15.05.2010 в 14:35)
| | Я не имел в виду, что пользователь нажмет на плюсик и раскроется ветвь.
Просто меню выглядит именно таким образом.
Но в целом соглашусь, для пользователей удобнее будет на js, да и на сервер нагрузка должна быть меньше (никаких рекурсий, лишних запросов - только выбранное пользователем). | |
|
|
|
|
|
|
|
для: neadekvat
(15.05.2010 в 14:41)
| | Ну если думать о пользователе, то управление меню посредством РНР, это не удобно.
А вот получить все ветви для описания меню, так тут без запроса с рекурсией возможно и не обойтись, но полученное дерево можно и запомнить. | |
|
|
|
|
|
|
|
для: sim5
(15.05.2010 в 14:48)
| | Да и подгружать можно через ajax, хоть с бд, хоть с кэша - переписывать его при изменении структуры из админки, не так и часто это происходит. | |
|
|
|
|
|
|
|
для: sim5
(15.05.2010 в 14:35)
| | Однако стоп.
Если меню будет таким, как список папок в проводнике - тогда все как вы говорите.
Однако если не будет тех же плюсиков и других отметок о том, что меню может раскрываться, а на заголовке находится отдельная страница. Например:
...
-2
--2.1
--2.2
...
Нажмем на "2" - откроется обобщенная статья, а заодно и список подпунктов - согласны, что это лучше на php делать?
update.
Хотя если добавить к раскрывающимуся списку некий аргумент, от которого зависит, будет открываться список автоматически (например, при загрузки обобщающей статьи), то тогда опять же можно без php в области построения дерева меню обойтись. | |
|
|
|
|
|
|
|
для: neadekvat
(15.05.2010 в 14:45)
| | Если ваше меню, это все, что в этом списке, то да, но если вложений много, то нет - все же дерево вы не будете держать открытым? И тогда пользователю для просмотря другой ветви делать запрос к серверу?
Делайте как считаете нужным, вам виднее. Ajax для древовидного меню, это уже излишек, хватит просто JS-сценария, а куки всегда запомнят состояние меню. | |
|
|
|
|
|
|
|
для: sim5
(15.05.2010 в 15:08)
| | PHP (генерация всего дерева) + JS (раскрытие/скрытие списков) + Cookie (хранение состояния меню) + cache (для хранение сгенерированно раз дерева) — хороший вариант, согласен :) Буду его реализовывать. | |
|
|
|
|
|
|
|
для: neadekvat
(15.05.2010 в 14:00)
| | смотрите по ссылке, отличный пример с подробным описанием как делается
http://webew.ru/articles/2080.webew | |
|
|
|
|
|
|
|
для: neadekvat
(15.05.2010 в 14:00)
| | А как на счёт передачи двух переменных, первая отвечающая за открытие главного меню, а вторая за подменю и т.д. | |
|
|
|
|
|
|
|
для: Gubichev
(16.05.2010 в 13:15)
| | Да я именно так и делаю для своего меню. | |
|
|
|