Мой способ создания дерева, без ID, без Parent Id...

Статус
В этой теме нельзя размещать новые ответы.

Safary

Новичок
Мой способ создания дерева, без ID, без Parent Id...

В общем много прочитал уроков про деревья, все не подходят, поэтому решил сделать свой способ, но он конечно же много заимствует у других способов.

С выводом дерева проблем вообще никаких нет, это очень просто!
Перед тестированием кода не забудьте подключиться к БД!
======================================================
вот код:
PHP:
function show_level($num){
for($e=0;$e<$num;$e++){ $s.= '>'; }
return $s;
}

$query="SELECT name,level FROM tree_programs";
$query=mysql_query($query);

while($ar=mysql_fetch_array($query)){
echo show_level($ar['level']).$ar['name'].'<br>';
}
======================================================
выводит вот такое дерево:
======================================================
софт
>игры
>>аркады
>>гонки
>>стрелялки
>программы
>>безопасность
>>>антивирусы
>>>фаерволлы
>>текст
>>>текстовые редакторы
>>графика
>>система
======================================================

А SQL-таблица для этого дерева вот такая:


После каждого редактирования таблицы надо сортировать поля по полю path:
PHP:
ALTER TABLE `tree_programs` ORDER BY `path`
и тогда каждый ребенок под своим родителем.

Уровни нужны тут для того, чтобы всегда их занова не считать при выводе.

1).path - это путь каталога. к примеру главный каталог имеет путь - 01

2).чтобы в него засунуть другой каталог - надо написать путь главного каталога и что в него засовываем и сохранить в поле path. типа каталог в главном каталоге будет иметь такой path - 0101

3). Чтобы добавить второй каталог в каталог 01 - естественно пишем ему path 0102 и т.д.

4). Тоесть во второй каталог, который имеет path 0102 мы легко добавим третий, назвав его path - 010201

Всё понятно?

5). При такой структуре есть возможность перемещать каталоги из каталога в каталог. Или просто менять местами.
К примеру если хоти поменять местами каталоги "игры" и "программы" - то просто перенумеровываем 0101 в 0102 и 0102 в 0101 и каталог "программы" будет стоять раньше чем игры. Ну разумеется у всех детей ещё path нужно будет поменять.

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

типа вот такого:


первая кнопка означает - добавить каталог
вторая кнопка означает - редактировать каталог
третья кнопка означает - удалить каталог

А чтобы перетащить каталог из одного в другой - то нужно на DHTML сделать, чтоб просто перетаскивать в веб-интерфейсе, а path'ы всех каталогов сохранялись в базу в новом виде, а потом делалась сортировка. Вроде всё просто, но у меня уже плохо очень думается, всю ночь программировал... Подскажите как всё это сделать...
Мне кажется тут javascript, dhtml нада будет, а я их не знаю пока что, поэтому без них как-то сделать, а их изучать потом буду, через некоторое время и переделывать....
И вообще как вам моя идея?
 

Safary

Новичок
MiksIr, ничего нового не узнал, но идея точь-в-точь =)

Есть где-нибудь туториалы по построению админок например для таких деревьев?

Просто я не знаю как начать админку писать, с чего даже...
 

Safary

Новичок
Вот я и думаю как сделать. Точнее добавление категории я уже делаю(смотрите картинку в первом сообщении) и вот как:
у каждой кнопки "добавление" ссылка вот такого вида - ?category='.$ar['path'].'&action=add

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

И в таблицу добавляется новая запись, где path = $_GET['path'].newpass;

newpass - это для примера, тут по идее должно быть вычисление, нет ли такого path'a уже и если есть, делаем инкримент и снова проверяем, когда нету - сохраняем и делаем сортировку по полю path.

Вроде всё правильно, думаю так для начала сделаю, потом уже буду переделывать на аякс чтобы на лету всё было.

кнопки "удалить" и "редактировать" будут делаться точно также.

А вот как сделать перемещение архива в другой архив - это я пока что не представляю даже как сделать, вот в этом сейчас и заключается вопрос =)
 

Фанат

oncle terrible
Команда форума
ну возьми, да на любом сайте посмотри, как сделано перемещение
 

SiMM

Новичок
> После каждого редактирования таблицы надо сортировать поля по полю path:
> ALTER TABLE `tree_programs` ORDER BY `path`
А зачем?
 

Safary

Новичок
вот на юкозе вообще отстой. там раздел и категория и всё. Можно только категорию перемещать в другой раздел.
Можешь дать пример сайта?
 

Фанат

oncle terrible
Команда форума
меня устраивает, как сделано перемещение темы в другой форум на этом форуме.
тебя, скорее всего, опять что-то не устроит.
 

Safary

Новичок
SiMM,
это чтобы по порядку все дети и родители было, к примеру внес я в таблицу в таком порядке данные:

01020101___photoshop
010202_____3д-графика
010201_____графика
01_________программы
0102_______мультимедиа
01020201___3dsmax

по идее дерево должно быть таким:

программы
>>>>>мультимедиа
>>>>>>>>>>графика
>>>>>>>>>>>>>>>>>photoshop
>>>>>>>>>>3д-графика
>>>>>>>>>>>>>>>>>3dsmax

вот ALTER TABLE расставит всё в таком порядке, в котором нужно(т.е. каждый ребенок под своим родителем.):

01_________программы
0102_______мультимедиа
010201_____графика
01020101___photoshop
010202_____3д-графика
01020201___3dsmax

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

Safary

Новичок
*****, да я придирчивый, люблю максимально круто всё делать. Эээ. Я не вижу функции перемещения темы, разве у простых смертных пользователей такая есть?

-~{}~ 14.02.09 14:44:

*****, какого ещё слона?
 

Фанат

oncle terrible
Команда форума
у простых - нет.
но вбуллетин вполне можно посмотреть в работе, на офсайте, например. впрочем, там ничего особенного, обычный селект в форме
слона с альтер табле.
 

Safary

Новичок
а ну понятно.
В общем вот так:

Переместить категорию "мультимедиа": а тут селекст с такими значениями:
____________программы
____________графика
____________3д-графика

Да? вот так?
А как менять местами в одной категории?
К примеру в "программы" содержится две категории "графика" и "видео" и выводится такое дерево:

программы
>>>>>графика
>>>>>видео

а я хочу чтоб было так:

программы
>>>>>видео
>>>>>графика
 

Фанат

oncle terrible
Команда форума
менять местами - это не перемещение, а сортировка.
к деревьям отношения не имеет, хотя такое дерево может использоваться.
выводишь все элементы одной категории и сортируешь. опять как угодно. стрелочками вверх-вниз, например
 

Safary

Новичок
Автор оригинала: *****
менять местами - это не перемещение, а сортировка.
к деревьям отношения не имеет, хотя такое дерево может использоваться.
выводишь все элементы одной категории и сортируешь. опять как угодно. стрелочками вверх-вниз, например
Спасибо фанат, так и сделаю. До яваскрипт, аякс, дхтмл и прочих вещей пока что далеко, а в php уже хорошо разбираюсь =)

-~{}~ 21.02.09 16:15:

Такс... ещё вопрос, вот делаю добавление и не разберусь немного....
 

Safary

Новичок
В общем добавил кнопки "добавление категории" в дерево.
тоесть у каждой категории есть кнопка чтобы добавить в эту категорию новую категорию....

эта кнопка передает такие параметры - ?action=add&path=0101
path - это имя категории, в которую надо добавить категорию....

скрипт, добавляющий категорию должен выглядеть так:
==============================================
PHP:
$new_category_id='01';
$new_category_path=$_GET['path'].$new_category;
теперь тут должна быть проверка существует ли категория 010101 в базе и если нет - то создаем такую...
Если существует - то делаем инкримент $new_category_id и проверяем существует ли такой path - 010102 и если нет то создаем, если существует - то опять инкримент и проверка...

Этот способ лучший? Если нет - то как по-другому сделать?

И ещё... Подскажите как проверить существует ли значение в базе... Я к примеру так пытался проверить, но не работает:

PHP:
$query="SELECT id,path,level,name FROM tree_programs WHERE path=".$new_category_path;
$query=mysql_query($q);
if($query) {
//существует, значит снова инкримент и опять проверяем
} else {
//не существует, добавляем категорию....
}
-~{}~ 21.02.09 16:26:

тоесть мне надо проверить существует ли категория 010101 в базе, если существует - то проверяем существует ли 010102 в базе, если существует - то проверяем существует ли 010103 в базе и оппа! не существует, добавляем.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
тоесть мне надо проверить существует ли категория 010101 в базе, если существует - то проверяем существует ли 010102 в базе, если существует - то проверяем существует ли 010103 в базе и оппа! не существует, добавляем.
теперь представим, что в категории хотя бы 10000 записей )
 

Фанат

oncle terrible
Команда форума
бред какой-то.
особенно если вспомнить заявления про "мой способ", "я и так умнее всех" и "ничего нового в факе я не прочел"
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху