![]() |
|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]()
|
|
| PriZraK |
|
||||||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 65 Регистрация: 22.10.2006 Репутация: нет Всего: нет |
Ломаю голову с самого утра - необходимо создать древовидное меню вида:
Данные берутся из базы данных MySQL, таблица имеет вид:
Отображается это все с помощью JavaScript'a, использую Ajax библиотеку http://script.aculo.us/dist/scriptaculous-js-1.7.0.zip (заказчик требует, чтоб можно было переносить пункты меню) - чем отображать не так важно - важно как написать код... Корректно отображается у меня только 1 и 2 ветвь... как сделать чтоб отображалась и третья..
голова дымится просто... Пробывал по разному из того что сохранилось: Вариант А:
и Вариант Б:
И тот и тот код - не вооружённым глазом видно что тупы и безумны.. как сделать правельно? |
||||||||||
|
|||||||||||
| mishaSL |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1046 Регистрация: 10.1.2007 Где: Санкт-Петербург Репутация: 19 Всего: 54 |
Я бы делал следующим образом.
1. Делаешь выборку всех записей и записываешь в массив вида $arr[parent_id][id] = значение 2. Делаешь рекурсивную функцию типа:
!!! код не проверял, здесь только суть Соответственно должно получиться полностью раскрытое дерево. А раскрывать уже смотри как удобнее. Это сообщение отредактировал(а) mishaSL - 31.1.2007, 17:05 -------------------- Лучший способ научиться программированию - это посмотреть как это делают другие... |
|||
|
||||
| PriZraK |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 65 Регистрация: 22.10.2006 Репутация: нет Всего: нет |
Большое спасибо, за примерчик - от него отталкиваясь получился следующий код:
|
|||
|
||||
| mishaSL |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1046 Регистрация: 10.1.2007 Где: Санкт-Петербург Репутация: 19 Всего: 54 |
В твоем коде есть несколько недостатков:
1. Поле в БД id_parent должно быть числовым, тогда не надо кавычек (' '). 2. Если ты будешь раскрывать сразу все дерево. То чем больше вложенность будет, тем больше запросов в БД. А это очень плохо. Добавлено @ 15:44 Даже при твоей не очень больщой структуре БД. Уже будет 13 запросов. А это очень много. -------------------- Лучший способ научиться программированию - это посмотреть как это делают другие... |
|||
|
||||
| Dr.Wisdom |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 145 Регистрация: 6.1.2005 Репутация: нет Всего: 0 |
А помоему полюбому для одного элемента один запрос.
Можно конечно как нибудь так организовать id_parent что при сортировке записи будут выстраиваться именно в том порядке, в котором они в дереве, потом итерироваться по массиву и по изменению id_parent изменять уровень вложенности. пример такой организации: a# aa# ab# aba# abb# ac# ad# b# ba# bb# тока вместо # надо какойнить символ который будет сортироваться после всех буквенных (не могу вот так просто придумать такой на крайняк - "z"). Тогда размер категории сокращаеться до 32. Но и тут можно извращаться дальше и использовать юникод. Но помоему это извращение. Если очень надо использовать для вывода дерева один запрос - вперед. Еще и базу надо будет перекроить для этого. Нееее. Я за рекурсию. Другого столь же простого выхода я не вижу. Если ктонить видит - напишите пожалуйста. Сколько записей может быть в дереве? Ну я думаю не так много..... А если еще догружать ветвь только ктогда, когда ее развернули..... Это сообщение отредактировал(а) Dr.Wisdom - 5.2.2007, 15:05 --------------------
VIVA LA RESISTANCE |
|||
|
||||
| mishaSL |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1046 Регистрация: 10.1.2007 Где: Санкт-Петербург Репутация: 19 Всего: 54 |
Я и написал каким образом это лучше оргинизовать (тремя постами выше). Сначало выбрать все в массив. А потом на уровне массива уже рекурсивно строить дерево. При построении деревьев с использованием MySQL и PHP именно так и делал. Это работает в разы быстрее, чем в рекурсивной функции делать запросы к БД. Да и безопаснее для сервера это будет...
-------------------- Лучший способ научиться программированию - это посмотреть как это делают другие... |
|||
|
||||
| Dr.Wisdom |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 145 Регистрация: 6.1.2005 Репутация: нет Всего: 0 |
уууупс...... прости, проглядел
$arr[parent_id][id] = значение Список детей для каждого родителя. Так? Интересно. --------------------
VIVA LA RESISTANCE |
|||
|
||||
| mishaSL |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1046 Регистрация: 10.1.2007 Где: Санкт-Петербург Репутация: 19 Всего: 54 |
Просто переносим данные из БД в массив удобного формата. -------------------- Лучший способ научиться программированию - это посмотреть как это делают другие... |
|||
|
||||
| Vaulter |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1724 Регистрация: 30.12.2002 Где: бункер Репутация: 6 Всего: 22 |
почитай про Nested Sets
как раз про удобную организацию деревьев и как выдрать все дерево одним запросом |
|||
|
||||
| mishaSL |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1046 Регистрация: 10.1.2007 Где: Санкт-Петербург Репутация: 19 Всего: 54 |
Вешь не плохая, но для простых задач очень объемная. -------------------- Лучший способ научиться программированию - это посмотреть как это делают другие... |
|||
|
||||
![]()
|
| Правила форума "PHP" | |
|
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |