Как сохранить порядок jQuery UI Sortable?

Сохранить сортировку после перетаскивания элементов UI Sortable можно несколькими способами:

Список выводится из базы данных отсортированный по полю `sort`. В каждом элементе списка находится input[type=hidden] с названием sort[] и содержащий id записи.

После отправки формы, скрипт в цикле переберёт массив $_POST['sort'] и обновит порядок записей.

<?php
$dbh = new PDO('mysql:dbname=db_name;host=localhost', 'логин', 'пароль');

// Сохранение сортировки
if (!empty($_POST['sort'])) {
	foreach ($_POST['sort'] as $i => $row) {
		$sth = $dbh->prepare("UPDATE `table` SET `sort` = :sort WHERE `id` = :id");
		$sth->execute(array('sort' => ++$i, 'id' => intval($row)));
	}
}

$sth = $dbh->prepare("SELECT * FROM `table` ORDER BY `sort`");
$sth->execute();
$array = $sth->fetchAll(PDO::FETCH_ASSOC);
?>

<form action="" method="post">
	<ul class="sortable-ul">
		<?php foreach ($array as $row): ?>
		<li>
			<?php echo $row['name']; ?>
			<input type="hidden" name="sort[]" value="<?php echo $row['id']; ?>">
		</li>
		<?php endforeach; ?>
	</ul>
	
	<button type="submit">Сохранить порядок</button>
</form>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>

<script>
$('.sortable-ul').sortable();
</script>
HTML

Метод похож на вариант с формой, но работает без перезагрузки страницы. После изменения порядка вызывается метод stop, в котором все input hidden отправляются через POST AJAX на save.php.

<?php
$dbh = new PDO('mysql:dbname=db_name;host=localhost', 'логин', 'пароль');
$sth = $dbh->prepare("SELECT * FROM `table` ORDER BY `sort`");
$sth->execute();
$array = $sth->fetchAll(PDO::FETCH_ASSOC);
?>

<ul class="sortable-ul">
	<?php foreach ($array as $row): ?>
	<li>
		<?php echo $row['name']; ?>
		<input type="hidden" name="sort[]" value="<?php echo $row['id']; ?>">
	</li>
	<?php endforeach; ?>
</ul>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>

<script>
$('.sortable-ul').sortable({
	stop: function() {
		$.ajax({
			url: '/save.php',
			method: 'post',
			data: $('.sortable-ul input').serialize()
		});
	}
});
</script>
HTML

Код файла save.php

<?php
$dbh = new PDO('mysql:dbname=db_name;host=localhost', 'логин', 'пароль');

if (!empty($_POST['sort'])) {
	foreach ($_POST['sort'] as $i => $row) {
		$sth = $dbh->prepare("UPDATE `table` SET `sort` = :sort WHERE `id` = :id");
		$sth->execute(array('sort' => ++$i, 'id' => intval($row)));
	}
}
PHP

У каждого <li> добавлен атрибут data-id с порядковым номером. После перетаскивания значения из data-id собираются в массив и сохраняется в cookies в виде строки JSON, а при обновлении страницы порядок восстанавливается из них.

Для упрощения работы с cookie используется плагин jQuery Cookie.

<ul class="sortable-ul">
	<li data-id="1">Строка 1</li>
	<li data-id="2">Строка 2</li>
	<li data-id="3">Строка 3</li>
	<li data-id="4">Строка 4</li>
	<li data-id="5">Строка 5</li>
	<li data-id="6">Строка 6</li>
</ul>


<script src="/jquery/2.1.1/jquery.min.js"></script>
<script src="/jqueryui/1.12.1/jquery-ui.min.js"></script>
<script src="/jquery.cookie.min.js"></script>

<script>
// Если есть запись в cookie, то восстанавливаем порядок.
if ($.cookie('sort')) { 	
	$.each(JSON.parse($.cookie('sort')), function(i, row){
		$('.sortable-ul').append($('.sortable-ul li[data-id=' + row + ']'));
	});
}

$('.sortable-ul').sortable({
	stop: function() {
		// Собираем все data-id в массив.
		var sort = [];
		$('.sortable-ul li').each(function(){
			sort.push($(this).data('id'));
		});

		// И сохраняем его в cookie в виде строки JSON.	
		$.cookie('sort', JSON.stringify(sort));
	}
});
</script>
HTML
23.10.2019
5097
Следующая запись Аккордеон jQuery UI

Комментарии 2

tyaplyap tyaplyap
18 мая 2021 в 09:52
0
Как можно объединить перетаскивание строк в таблице с сохранением через AJAX?
Людмила Саватеева Людмила Саватеева
8 августа 2021 в 23:48
0
Спасибо!!! Это очень ценная информация! Все понятно и четко работает!
Сделали все тоже самое для таблицы. Input в tr добавили а класс sortable-ul в tbody.
Еще раз спасибо!

, чтобы добавить комментарий.

Другие публикации

Разрешить AJAX с другого домена
Если отправить кроссдоменный AJAX запрос, возникает ошибка...
4503
+2
Загрузка файлов через AJAX с помощью jQuery Form Plugin
Пример загрузки изображений через AJAX с помощью плагина jQuery Form Plugin.
14131
+3
Аккордеон jQuery UI
jQuery UI Accordion функциональный плагин аккордеона. Рассмотрим примеры использования.
13741
+4
jQuery UI – многоуровневый аккордеон с сортировкой
Пример как сделать многоуровневый аккордеон и добавить возможность перетаскивать элементы с помощью плагина jQuery UI...
3993
+2
Ссылка в заголовке UI Accordion
Итак, есть аккордеон, все вкладки закрыты, если в заголовок вставить ссылку на другую страницу, то она по своему...
1902
+1
Автоматическое сжатие и оптимизация картинок на сайте
Изображения нужно сжимать для ускорения скорости загрузки сайта, но как это сделать? На многих хостингах нет...
15906
+8