I've just implemented the jQuery UI sortable plugin for a set of images. The markup I have is as follows:
<ul id="images" class="ui-sortable">
<li id="7884029"><img src="/images/member/4698568/7884029_t.jpg" alt="" /></li>
<li id="7379458"><img src="/images/member/4698568/7379458_t.jpg" alt="" /></li>
<li id="1704208"><img src="/images/member/4698568/1704208_t.jpg" alt="" /></li>
<li id="1750715"><img src="/images/member/4698568/1750715_t.jpg" alt="" /></li>
<li id="4364912"><img src="/images/member/4698568/4364912_t.png" alt="" /></li>
</ul>
<script type="text/javascript">
/*<![CDATA[*/
jQuery(function($) {
jQuery('#images').sortable({'delay':'100'});
});
/*]]>*/
</script>
The LI id is the 'name' column in the DB table - I prefer not to display the ID column.
Now my question is how do I capture the sorting? I understand this would be an AJAX request but I have no idea how to do it. I have set up a sort_order column in my DB table and I am using PHP as my scripting language. I could do with a code example.
EDIT:
Ideally I prefer if the sort order is applied upon moving an item, i.e. I do not want to enclose it all in a form.
Basically, do this:
First, change your items' id format to the underscored format expected by sortable:
<li id="image_7884029"><img ...
<li id="image_7379458"><img ...
Then, use sortable's serialize method in its stop event:
... // Within your sortable() setup, add the stop event handler:
stop:function(event, ui) {
$.ajax({
type: "POST",
url: path/to/your/ajax/reorder.php,
data: $("#images").sortable("serialize")
});
}
...
When you use $("#images").sortable("serialize"), sortable's serialize method will go through the children of #images, i.e. all your li elements, and turn all the ids it finds (image_7884029, image_7379458, etc.) into a list of items like image[]=7884029&image[]=7379458..., in the order they now appear in the list, after sorting (because you're calling it from stop()). Basically it works similar to how an array of checkboxes gets sent when posting a form.
You can then pick this up in your server-side "reorder.php", to assign new values to your sort_order column:
$items = $_POST['image'];
if ($items) {
foreach($items as $key => $value) {
// Use whatever SQL interface you're using to do
// something like this:
// UPDATE image_table SET sort_order = $key WHERE image_id = $value
}
} else {
// show_error('No items provided for reordering.');
}
And you're done.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With