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

Форум PHP

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

 

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

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

тема: Управление меню
 
 автор: sirop   (11.07.2006 в 02:35)   письмо автору
 
 

Может кто подскажет, как сделать управление пунктами меню ( "передвинуть вверх", "передвинуть вниз" ), на данные какого поля при этом ориентироваться?
Само меню находится в базе MySql

   
 
 автор: Lelik   (11.07.2006 в 02:56)   письмо автору
 
   для: sirop   (11.07.2006 в 02:35)
 

Можно сделать самому функцию: то-есть каждый пункт меню по-умолчанию будет получать номера по счёту (от 1 и до последнего) и при нажатии на ссылку, например "передвинуть вверх" будет получать $pos-1($pos - это позиция пункта меню до изменения), а пункт меню находящийся над передвегаемым $pos+1. Или вводить в поля для изменения текста номера пунктов меню и вручную устанавливать номер пункта меню по принципу все у чего номер равен или ниже позиции изменяемого пункта меню получет значение $pos+1. Также ещё эту задачу можно решить с помощью функции mysql_insert_id(), только в этом способе я сам ещё не разобраля, а кто уже разобрался то про этот метод можно по-подробнее

   
 
 автор: Loki   (11.07.2006 в 11:14)   письмо автору
 
   для: sirop   (11.07.2006 в 02:35)
 

Завести еще один сполбец, где будет указан порядок сортировки меню. При сдвиге меню в какую-то сторону менять местами значения соседних строк.

   
 
 автор: Trianon   (11.07.2006 в 11:29)   письмо автору
 
   для: Loki   (11.07.2006 в 11:14)
 

вот я тут сижу и думаю...
Допустим, меню хранится в таблице, в которой имеется поле pos
Как написать скрипт, который бы за минимум запросов перемещал строки c указаным $pid, со значиениями pos от $from по $to так, чтобы они располагались перед строкой с pos $before, либо в самый хвост, если $before > pos любой из имеющихся строк.

   
 
 автор: Loki   (11.07.2006 в 13:21)   письмо автору
 
   для: Trianon   (11.07.2006 в 11:29)
 

Сходу на ум приходит только "метод пузырька"... То есть получается три запроса: убеждаемся что соседняя строчка существует и получаем ее pos, после чего изменяем обе строки.

   
 
 автор: sirop   (11.07.2006 в 13:31)   письмо автору
 
   для: sirop   (11.07.2006 в 02:35)
 

Я перепробовал несколько вариантов перемещения пунктов меню. Вариант, который предложил Lelik не подходит потому, что... например, вводим 7 пунктов меню, затем удалим 4,5, 6 пункты. В поле таблицы образовалась "брешь". Теперь пункты меню следуют так: 1,2,3,7. Теперь, если последний пункт передвинуть вверх, то после одной попытки он станет номером 6, потом 5 и т.д., пока не уберёться та "брешь". Нужно нажать несколько раз, чтобы всё-таки передвинуть его на верхгнюю позицию.
Вручную менять можно, но хотелось бы автоматизировать как-то процесс одним нажатием кнопки.
С помощью функции mysql_insert_id() тоже сомнительно.

> Loki
>Завести еще один сполбец, где будет указан порядок сортировки меню. При сдвиге меню в какую-то сторону менять местами значения соседних строк.

Наверное, это то же самое.
Пока вижу только один способ, как указал Trianon : делать UPDATE для каждого пункта меню, где в столбце сортировки будет меняться порядок следования всех пунктов, чтобы не было "брешей" в порядке следования.
Это не лучший способ. Может есть вариант лучше?

   
 
 автор: Loki   (11.07.2006 в 15:25)   письмо автору
 
   для: sirop   (11.07.2006 в 13:31)
 

>Наверное, это то же самое.
Это не тоже самое. Читайте внимательнее.

   
 
 автор: sirop   (11.07.2006 в 18:47)   письмо автору
 
   для: Loki   (11.07.2006 в 15:25)
 

>>Наверное, это то же самое.
>Это не тоже самое. Читайте внимательнее.

Loki, прошу прощения, скорее всего я действительно не могу разобраться, но приведу пример:
по полю pos будем сортировать пункты меню.
1 меню_1
2 меню_2
3 меню_3
4 меню_4
5 меню_5
6 меню_6

Если сейчас передвигать пункты меню, то никаких сложностей не возникает.
Теперь удалим меню_5, меню_2 и меню_4. Поле pos теперь имеет такой вид:
1 меню_1
3 меню_3
6 меню_6

У нас образовалась дыра в порядке следования в поле pos.
Как избежать этого?

   
 
 автор: Loki   (11.07.2006 в 19:44)   письмо автору
 
   для: sirop   (11.07.2006 в 18:47)
 


id  name      pos
1   меню_1       1
3   меню_3       3
6   меню_6       6

Теперь, если нам надо поднять меню_6 на позицию выше, то мы попросту меняем значение pos с соседней строчкой:

id  name      pos
1   меню_1       1
3   меню_3       6
6   меню_6       3

И всех делов.

   
 
 автор: Lelik   (11.07.2006 в 18:50)   письмо автору
 
   для: sirop   (11.07.2006 в 13:31)
 

>Я перепробовал несколько вариантов перемещения пунктов меню.
>Вариант, который предложил Lelik не подходит потому,
>что... например, вводим 7 пунктов меню, затем удалим 4,5, 6
>пункты. В поле таблицы образовалась "брешь". Теперь пункты
>меню следуют так: 1,2,3,7. Теперь, если последний пункт
>передвинуть вверх, то после одной попытки он станет номером
>6, потом 5 и т.д., пока не уберёться та "брешь". Нужно
>нажать несколько раз, чтобы всё-таки передвинуть его на
>верхгнюю позицию.
>Вручную менять можно, но хотелось бы автоматизировать как-то
>процесс одним нажатием кнопки.
>С помощью функции mysql_insert_id() тоже сомнительно.
Ну тогда при удалении из БД пунктов 4, 5, 6 и т. д. скриптом-обработчиком удаления данных пунктов меню UPDATE значения нижеидущих, после удаляемых, пунктов меню.
Например удаляем из some_table:
Сначала обновляем все

<?php
...
$query1 "SELECT * FROM some_table WHERE id=".$_POST['id'];(или $_GET['id']);
$result mysql_query($query1);
if(
$result$pos mysql_fetch_array($result);
$query2 "UPDATE some_table SET pos+1 WHERE id!=$pos['id'] AND pos>$pos['pos']";
...
?>

Если все предыдущее с успехом происходит
Тогда удаляем

<?php
...
$query3 "DELETE FROM some_table WHERE id = ".$_POST['id'];(или $_GET['id'])
...
?>

   
 
 автор: sirop   (11.07.2006 в 19:58)   письмо автору
 
   для: sirop   (11.07.2006 в 02:35)
 

Действительно, всё оказалось проще, чем я думал :)
Спасибо за помощь и предложенные варианты!

   
Rambler's Top100
вверх

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