jQuery

индекс
283,92

Сортировка строк таблицы методом drag'n'drop

В небольшой задаче сегодня нужно было осуществить сортировку таблиц. До этого решения были в лоб: поля ввода куда пользователь вводил порядковый номер строки, стрелочки «вниз-вверх». Всё бы ничего, но вот в сегодняшней задаче одно из условий требовало обновления кэша (строки таблиц) при каждом обращении к сортировке таблицы (изменил порядковый номер строки — обновляй кэш), поэтому «лобовые» методы не подошли. Да и пользователи системы часто жаловались на неудобства «лобных» методов сортировки.

«Погуглив», нашёл, на мой взгляд, отличное решение для jquery. Итак, плагин TableDnD.

Подключаем плагин как обычно. Инициализируем:

$(document).ready(function() {
$(признак-таблицы).tableDnD(); // инициализация плагина
});


Собственно всё. У плагина есть несколько функций:
onDragStyle — стиль строки при перетаскивании

onDropStyle — стиль строки при «дропе»

onDragClass — как бы замена двух функций выше, стиль меняется при перетаскивании и удаляется при «дропе» и строка приобретает изначальный стиль

onDrop — возможность вызвать свою функцию при «дропе»

onDragStart — возможность вызвать свою функцию в начале перетаскивания

scrollAmount — пока не понял что это.

Простой пример:

$(document).ready(function() {
$("признак-таблицы").tableDnD(); // инициализация плагина
$("признак-таблицы").tableDnD({
onDragClass: "DuringDragStyle" // при перетаскивании строка получит "красивости" класса DuringDragStyle
});
});

После этого строки таблицы можно «таскать» вверх или вниз в пределах таблицы. Таблиц на странице может быть сколько угодно. Особенность плагина в том что он не использует ui.draggable.js и иже с ним.

Более подробно можно почитать у авторов плагина (англ.).

Скачать плагин — 6кб
+12
28 сентября 2009, 14:59
163

комментарии (22)

0
clops #
В мемориз
0
tnz #
Он еще ошибками сыпать начинает, когда пытаешься строку перенести в thead. Решение там в каментах есть.
и у меня так и не получилось зафиксировать одну из строк, добавив нужный класс.
0
iDrum #
для thead всем строкам (имено tr а не td) нужно присвоить класс class=«noDrop». Для того что бы строка была недвижима нужно присвоить tr класс class=«noDrag».
jquery 1.3.2
IE6
IE8
Firefox 3.5.1
Opera 9.6

работает
+1
alexsrdk #
В функцию makeDraggable (начинается со 122й строки) можно добавить

$('thead tr', table).addClass('nodrop');

и забыть о проблеме.
0
Cartman63 #
Отличный plugin, применил его в своей CMS для управления пунктами меню, и много где еще планирую сделать. Текстовое поле weight нынче не актуально
0
megadoizer #
а update в базу делаете отдельным запросом на строку? или одним махом с похожим updatom?

UPDATE news SET
title = CASE
WHEN news_id = 1 THEN 'aa'
WHEN news_id = 2 THEN 'bb' END
WHERE news_id IN (1, 2)

(с) гдето на хабре было )
+3
iDrum #
почти так, сохраняю порядок вот так:
1. во время «перетаскивания» показываю (OnDrag: ShowSaveOrderForm() ) форму (id=saveOrderForm) со скрытым полем id=«vorders» и кнопкой «сохранить» с событием Onclick = «javascript:saveOrder()», функция saveOrder присваивает скрытому полю сериалайз строк таблицы (это фукнция из плагина TableDnD) и сабмитит форму.

function saveOrder()
{
$("#vorders").val( $(id_таблицы).tableDnDSerialize() );
$(".saveOrderForm").submit();
}


ну и в php
function vorder()
{
if(isset($_POST['vorders']))
{
$tmp = array(); // промежуточный массив
$idList = array(); // здесь будет массив из id строк, id строки - это id раздела сущности в бд
$valueList = array(); // здесь будет массив из новых порядковых номеров

// пилим сериалайз, его можно увидеть alert($(признак_таблицы).tableDnDSerialize())
$vorders = explode('&', $_POST['vorders']);

foreach($vorders as $key=>$val)
{
// нужно допилить сериалайз, на выходе будет массив array(order=>id)
list(, $tmp[] ) = explode('=', $val);
}
$idList = implode(',', array_values($tmp)); // готовим список id вида 1,2,3,4
$valueList = implode(',', array_keys($tmp)); // готовим список "порядков" вида 3,1,2,4
$this->db->query('UPDATE cat_sections SET vorder = ELT(FIELD(id, '.$idList.'), '.$valueList.') WHERE id IN ('.$idList.')');
show_redirect('Порядок сохранён.');
}
else
{
show_redirect('Порядок не сохранён.');
}
}
–1
Cartman63 #
Немного проще все

function droppagesrow(){
preg_match_all("/=(\d+)/",$_REQUEST[«params»],$a);
foreach($a[1] as $pos=>$id){
mysql_query(«UPDATE pages SET position = ».($pos+1)." WHERE id = '$id'");
}
}
0
dfuse #
Нда? Разве? А если записей 1000 — 1000 мелких запросиков будет? ;)

INSERT INTO `table` (`id`, `pos`) VALUES 
(1, 0),
(1, 1),
(1, 2)
ON DUPLICATE KEY UPDATE `pos`=VALUES(`pos`);


+1
dab512 #
jquery ui sortable
–1
iDrum #
слишком громоздкая штука из-за своей универсальности и «многозадачности»
0
aps #
Уй от jquery хорош, но уж очень он тяжелый. И к таблицам вроде не очень пригоден — нужно допиливать.

Хотя и 6К, которые предлагает автор, для такого плагина слишком много.
0
Fredy314 #
Для более простых задач типа сортировки по возрастанию/алфавиту есть плагин jquery.tablesorter, его даже можно прикрутить к уже существующим таблицам не добавив несколько строчек в шаблон.
0
iDrum #
Насколько jquery.tablesorter это client-side сортировка по уже полученным данным, то есть если вывести ячейку с порядковым номером то отсортировать можно будет только ASC или DESC и всё. так что не совсем подходит
0
piumosso #
Что-то мне это напомнило шикарную реализацию сортировки в друпале. Только там еще решена проблема иерархии элементов.
0
Jameson #
Не покажете пример?
0
piumosso #
скачайте друпал и посмотрите)))
–1
Jameson #
Ах, ну да — как-то не догадался, что как только его поставишь и залогинишься, так сразу увидишь сортировку в Друпале :)
–1
piumosso #
а в чём проблема? Вы не можете догадаться, что именно может сортироваться в CMS?
0
Jameson #
Сортироваться в CMS может все, что угодно — от пунктов главного меню до виджетов на странице 18 уровня вложенности.

К чему эти передергивания? Просто бы сказали, что распространять свою мысль вам настолько лень, что даже конкретизировать, о сортировке в каком именно разделе вы упомянули, неохота. Обычное дело.
0
aleksandro #
Пригодится, спасибо.
0
alexsrdk #
Спасибо, раньше не встречал этот плагин.
Понравилось, что в отличии от многих DnD плагинов перетаскиваемый объект не вырывается из контекста и остается в пределах таблицы. Аккуратно смотрится за счет этого, будем использовать.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.