PHP в деталях

       

Ручная сортировка в веб-интерфейсе


DL
30.5.2002

Для новостного сайта или каталога чаще всего применяется структура базы данных с отдельной таблицей рубрик. Это удобно и просто: автоматически считается количество статей (сайтов) в рубриках, рубрики легко редактируются, создаются или удаляются. Идилию нарушает часто возникающая необходимость сортировки списка рубрик в заданном порядке.

Приходится либо писать этот список в HTML вручную, либо создавать в таблице в базе данных дополнительное поле для сортировки, в которое нужно писать числа опять же вручную. Это делается либо через интерфейс управления базой данных, либо дополнительное текстовое поле делается в форме редактирования рубрики. Это, конечно, неудобно для пользователя, а тем более если пользователей, которым иногда требуется менять порядок сортировки, несколько.

Решения для данной задачи есть. Из того, что я видел, это [] фирмы []. Однако он требует настройки ActiveX или VB Script и работает только в IE 6.0.

На самом деле, можно обойтись меньшими жертвами, используя простой JavaScript, который будет работать и в IE 5.0, и в Опере 5.12.

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

Ещё один пример потенциального использования. На ныне почившем сайте [] был конкурс "10 слов, которые потрясли мир". Надо было в нормальном предложении, состоящем из 10 слов так переставить их, чтобы получилось смешно. Реализовано это было неважно: пользователю приходилось вводить в текстовое поле номера слов, причём нумерация шла с 0(!), что вызывало большие затруднения.


Рисуем вот такую форму:

рот



командира

отдающего

приказ

должен

быть

открыт

на

ширину

приклада

( форма работает, можете поиграться со списком и посмотреть результат, нажав кнопку "отправить")

При нажатии кнопки "Отправить" запускается скрипт, который записывает в спрятанную переменную id_set значения из списка через запятую. Именно переменную $id_set разбирает получающий данные скрипт.

В демонстрационном скрипте разбирается и проверяются все значения. Но для закрытого механизма администрирования этого не нужно.

В MySQL есть очень полезная функция FIND_IN_SET. Возвращает номер значения в ряде. Вот пример её использования:

mysql> SELECT FIND_IN_SET('b','a,b,c,d'); -> 2

mysql> SELECT FIND_IN_SET('e','a,b,c,d'); -> NULL

Таким образом можно записать в поле sort_order результат выполнения функции FIND_IN_SET(id,'id1,id2,id3,...'). При этом если в списке не окажется какого-то идентификатора, функция вернёт пустое значение (NULL). При сортировке значения NULL окажутся вверху. Чтобы этого избежать, добавляем функцию IFNULL, которая будет заменять NULL на количество id в строке + 1. Получаем простой скрипт:

if (strlen(trim($id_set))>0) {

    $id_set = preg_replace("/,\$/", "", trim($id_set));

    mysql_query("UPDATE heading SET sort_order=IFNULL(FIND_IN_SET(id, '{$id_set}'),". (substr_count($id_set, ",") + 2). ")");

форма, которая приведена здесь, работает в IE 5.0 и выше, а так же в Опере 5.12 и более новых. На NN и Mozilla не проверялось.


Содержание раздела