![]() |
Задавайте вопросы, мы ответим
Вы не зашли.
Здравствуйте, у меня такой вопрос
Создано дерево (меню)
id | parent_id | name
-----------------------------
1 0 Меню 1
2 1 Меню 1.1
3 0 Меню 2
4 2 Меню 2.1
5 2 Меню 2.2
6 5 Меню 2.2.1
7 0 Меню 3
8 0 Меню 4
9 0 Меню 5
Вопрос в том, как правильно создать запрос, чтобы передвигать меню на +/- 1 уровень.
Спасибо огромное за помощь.
Неактивен

Думаю, это лучше делать в логике приложения. Простейшие случаи можно, конечно,
попробовать написать и запросами, но наверняка нужно будет что-то сложнее.
«-1»: найти родителя родителя
UPDATE menu m SET parent_id = (SELECT parent_id FROM menu WHERE id = m.parent_id) WHERE id = $id
С «+1» сложнее — придумайте алгоритм выбора родителя.
Неактивен
paulus написал:
Думаю, это лучше делать в логике приложения. Простейшие случаи можно, конечно,
попробовать написать и запросами, но наверняка нужно будет что-то сложнее.
«-1»: найти родителя родителя
UPDATE menu m SET parent_id = (SELECT parent_id FROM menu WHERE id = m.parent_id) WHERE id = $id
С «+1» сложнее — придумайте алгоритм выбора родителя.
Я так понимаю что,
id parent_id name
---------------------
1 0 Главная
2 1 О нас
3 1 Контакты
4 0 Форум
Я так пониаю что если я затрону ряд 1 0 Главная и поменяю id то всё меню наруштися так как функция которая отображает меню содержит уже указаные переменные которые определяют с каково уровня показывать..
http://mycms.boris-k.net/ - вот что я делаю
http://mycms.boris-k.net/admin/ - вот что я делаю
function getPages($parent_id=0,$level=0)
{
$result=mysql_query("SELECT * FROM tbl_pages WHERE parent_id=$parent_id ORDER BY id ASC");
$meny = array();
while($row=mysql_fetch_assoc($result) )
{
$meny[] = array(
'name' => $row['name'],
'id' => $row['id'],
'link' => $row['link'],
'level' => str_repeat('- ',$level)
);
$meny = array_merge($meny, getPages($row['id'], $level + 1));
}
return $meny;
}Вот ещё 1 функция на перемещение childov не уверен ещё не пробывал неуспел
function changeOrder($currentOrderNum, $newOrderNum) {
$TableName = "";
$orderField = "";
if($newOrderNum < $currentOrderNum) {
$update1 = mysql_query("UPDATE $TableName SET $orderField = $orderField+1 WHERE $orderField >= '$newOrderNum' AND $orderField < '$currentOrderNum'") or die(mysql_error());
} else {
$update1 = mysql_query("UPDATE $TableName SET $orderField = $orderField-1 WHERE $orderField <= '$newOrderNum' AND $orderField > '$currentOrderNum'") or die(mysql_error());
}
}Отредактированно Борис (27.04.2009 15:52:01)
Неактивен
Пожалуйста направте..
Неактивен

Ну, например, так:
«найти брата»:
SELECT id FROM tablename
WHERE parent_id = (SELECT parent_id FROM tablename WHERE id = $id) AND id != $id
«+1»
UPDATE tablename SET parent_id = («найти брата») WHERE id = $id
И все-таки, алгоритм надо придумать ![]()
Неактивен
Спасибо получилось!
http://mycms.boris-k.net/
http://mycms.boris-k.net/admin/
Неактивен