Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Древовидное меню
 
 автор: neadekvat   (15.05.2010 в 14:00)   письмо автору
 
 

Облазил форум, нашел решения для раскрытия всего списка
-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("&nbsp;"$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 оставалось открытым? Сейчас страница подпункта откроется, но дерево свернется - это неудобно пользователям.

  Ответить  
 
 автор: sim5   (15.05.2010 в 14:13)   письмо автору
 
   для: neadekvat   (15.05.2010 в 14:00)
 

JS и cookies, и готовых уже скриптов таких меню предостаточно.

  Ответить  
 
 автор: neadekvat   (15.05.2010 в 14:16)   письмо автору
 
   для: sim5   (15.05.2010 в 14:13)
 

Ммм..динамическое меню на js - это несколько другое.
В том-то и смысл, прежде чем js использовать, хотелось бы решить эту задачу средствами php, а уж потом туда js прикрутить.

  Ответить  
 
 автор: sim5   (15.05.2010 в 14:29)   письмо автору
 
   для: neadekvat   (15.05.2010 в 14:16)
 

А смысл задачи свойственные клиенту решать на РНР?

  Ответить  
 
 автор: neadekvat   (15.05.2010 в 14:31)   письмо автору
 
   для: sim5   (15.05.2010 в 14:29)
 

То есть вы считаете, что древовидные менюшки обязательно строится с использованием js?

  Ответить  
 
 автор: sim5   (15.05.2010 в 14:35)   письмо автору
 
   для: neadekvat   (15.05.2010 в 14:31)
 

Древовидное и компактное, значит раскрываемое (веть в Проводнике пример), и вы полагаете это будет удобно делать средствами РНР?

  Ответить  
 
 автор: neadekvat   (15.05.2010 в 14:41)   письмо автору
 
   для: sim5   (15.05.2010 в 14:35)
 

Я не имел в виду, что пользователь нажмет на плюсик и раскроется ветвь.
Просто меню выглядит именно таким образом.
Но в целом соглашусь, для пользователей удобнее будет на js, да и на сервер нагрузка должна быть меньше (никаких рекурсий, лишних запросов - только выбранное пользователем).

  Ответить  
 
 автор: sim5   (15.05.2010 в 14:48)   письмо автору
 
   для: neadekvat   (15.05.2010 в 14:41)
 

Ну если думать о пользователе, то управление меню посредством РНР, это не удобно.
А вот получить все ветви для описания меню, так тут без запроса с рекурсией возможно и не обойтись, но полученное дерево можно и запомнить.

  Ответить  
 
 автор: neadekvat   (15.05.2010 в 14:57)   письмо автору
 
   для: sim5   (15.05.2010 в 14:48)
 

Да и подгружать можно через ajax, хоть с бд, хоть с кэша - переписывать его при изменении структуры из админки, не так и часто это происходит.

  Ответить  
 
 автор: neadekvat   (15.05.2010 в 14:45)   письмо автору
 
   для: sim5   (15.05.2010 в 14:35)
 

Однако стоп.
Если меню будет таким, как список папок в проводнике - тогда все как вы говорите.

Однако если не будет тех же плюсиков и других отметок о том, что меню может раскрываться, а на заголовке находится отдельная страница. Например:
...
-2
--2.1
--2.2
...
Нажмем на "2" - откроется обобщенная статья, а заодно и список подпунктов - согласны, что это лучше на php делать?

update.
Хотя если добавить к раскрывающимуся списку некий аргумент, от которого зависит, будет открываться список автоматически (например, при загрузки обобщающей статьи), то тогда опять же можно без php в области построения дерева меню обойтись.

  Ответить  
 
 автор: sim5   (15.05.2010 в 15:08)   письмо автору
 
   для: neadekvat   (15.05.2010 в 14:45)
 

Если ваше меню, это все, что в этом списке, то да, но если вложений много, то нет - все же дерево вы не будете держать открытым? И тогда пользователю для просмотря другой ветви делать запрос к серверу?
Делайте как считаете нужным, вам виднее. Ajax для древовидного меню, это уже излишек, хватит просто JS-сценария, а куки всегда запомнят состояние меню.

  Ответить  
 
 автор: neadekvat   (15.05.2010 в 15:12)   письмо автору
 
   для: sim5   (15.05.2010 в 15:08)
 

PHP (генерация всего дерева) + JS (раскрытие/скрытие списков) + Cookie (хранение состояния меню) + cache (для хранение сгенерированно раз дерева) — хороший вариант, согласен :) Буду его реализовывать.

  Ответить  
 
 автор: bab-nike   (16.05.2010 в 12:17)   письмо автору
 
   для: neadekvat   (15.05.2010 в 14:00)
 

смотрите по ссылке, отличный пример с подробным описанием как делается
http://webew.ru/articles/2080.webew

  Ответить  
 
 автор: Gubichev   (16.05.2010 в 13:15)   письмо автору
 
   для: neadekvat   (15.05.2010 в 14:00)
 

А как на счёт передачи двух переменных, первая отвечающая за открытие главного меню, а вторая за подменю и т.д.

  Ответить  
 
 автор: PhMaster   (20.05.2010 в 15:15)   письмо автору
 
   для: Gubichev   (16.05.2010 в 13:15)
 

Да я именно так и делаю для своего меню.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования