Использование MooTools 1.2 для Drag, Drop, Sort, Save с примером
Мои клиенты любят контролировать содержимое своего сайта, поэтому я создаю функционал для этого. Для лучшего удобства администрирования я использую функции Drag and Drop Menu, с возможностью записи в базу данных. Данная функция помогает сортировать список. Это очень удобно и экономит время, так как не требуется перегружать полностью страницу.
Вот один из способов реализовать данную функцию с помощью JavaScript библиотеки MooTools.
The MySQL Table
id |
title |
sort_order |
1 |
Article 1 |
1 |
2 |
Article 2 |
2 |
3 |
Article 3 |
3 |
4 |
Article 4 |
4 |
5 |
Article 5 |
5 |
6 |
Article 6 |
6 |
The PHP / XHTML
<?php
<div id="message-box"><?php echo $message; ?> Waiting for sortation submission...</div>
<form id="dd-form" action="<?php echo $_SERVER['REQUEST_URI']; ?>" method="post">
<p><input type="checkbox" value="1" name="auto_submit" id="auto_submit" <?php if($_POST['auto_submit']) { echo 'checked="checked"'; } ?> /> <label for="auto_submit">Automatically submit on drop event</label></p>
<ul id="sortable-list">
<?php
$sort_order = array();
while($item = mysql_fetch_assoc($result))
{
echo '<li class="sortme" alt="',$item['id'],'">',$item['title'],'</li>';
$sort_order[] = $item['sort_order'];
}
?>
</ul>
<br />
<input type="hidden" name="sort_order" id="sort_order" value="<?php echo implode($sort_order,'|'); ?>" />
<input type="submit" name="do_submit" value="Submit Sortation" class="button" />
</form>
<?php } else { ?>
<p>Sorry! There are no items in the system.</p>
<?php } ?>
The CSS
#sortable-list {
padding:0;
}
li.sortme {
padding:4px 8px;
color:#000;
cursor:move;
list-style:none;
width:500px;
background:#ddd;
margin:10px 0;
border:1px solid #999;
}
#message-box {
background:#fffea1;
border:2px solid #fc0;
padding:4px 8px;
margin:0 0 14px 0;
width:500px;
}
The MooTools JavaScript
/* when the DOM is ready */
/* create sortables */
var sb = new Sortables('sortable-list', {
/* set options */
clone:true,
revert: true,
/* initialization stuff here */
initialize: function() {
},
/* once an item is selected */
onStart: function(el) {
el.setStyle('background','#add8e6');
},
/* when a drag is complete */
onComplete: function(el) {
el.setStyle('background','#ddd');
//build a string of the order
var sort_order = '';
$$('#sortable-list li').each(function(li) { sort_order = sort_order + li.get('alt') + '|'; });
$('sort_order').value = sort_order;
//autosubmit if the checkbox says to
if($('auto_submit').checked) {
//do an ajax request
var req = new Request({
url:'<!--?php echo $_SERVER['PHP_SELF']; ?-->',
method:'post',
autoCancel:true,
data:'sort_order=' + sort_order + '&ajax=' + $('auto_submit').checked + '&do_submit=1&byajax=1',
onRequest: function() {
$('message-box').set('text','Updating the sort order in the database.');
},
onSuccess: function() {
$('message-box').set('text','Database has been updated.');
}
}).send();
}
}
});
});
The “Header” PHP / MySQL
/* on form submission */
if(isset($_POST['do_submit']))
{
/* split the value of the sortation */
$ids = explode('|',$_POST['sort_order']);
/* run the update query for each id */
foreach($ids as $index=>$id)
{
if($id != '')
{
$query = 'UPDATE test_table SET sort_order = '.$index.' WHERE id = '.$id;
$result = mysql_query($query,$connection) or die(mysql_error().': '.$query);
}
}
/* now what? */
if($_POST['byajax']) { die(); } else { $message = 'Sortation has been saved.'; }
}
Я считаю, что на сегодняшний день такой способ сортировки является самым быстрым, и современным.
Переведено из источника:
http://davidwalsh.name/mootools-drag-drop