jQuery UI sortable - sorting images

后端 未结 2 1690
感情败类
感情败类 2021-02-06 18:55

I\'ve just implemented the jQuery UI sortable plugin for a set of images. The markup I have is as follows:

相关标签:
2条回答
  • 2021-02-06 19:20

    I've just done this. Here's how I did it:

    Surround the #images element with a form, action pointing to your ajax script. Alongside each image, have a hidden input field eg:

    When you re-order the images, capture the jQuery sortable update and stop events, similar to this:

    $("#images").sortable({
    
      // configuration
      delay: 100,
      items: 'li',
      update: function(event, ui) {
    
        // Update order indexes
        updateOrderIndexes();
      },
      stop: function(event, ui) {
    
        // fire off the update method
        postUpdateOrder();
      }
    });
    
    function updateOrderIndexes()
    {
      // Update the order index on each item
      var orderIndex = 1;
      $("#images li").each( function() {
    
        $(this).find("input[type=hidden]:first").val(orderIndex);
        orderIndex++;
      })    
    }
    

    In the postUpdateOrder() function which you'll need to write, you can use jQuery's $.post function to carry out an AJAX post request back to the server. Each field will then be available in your PHP script's $_POST array, named as per the ID, with a value of the new index. Validate as appropriate, save the new values, and send an OK/error back to the browser.

    Update based on your edit requirement of not enclosing it in a form, you could still do this by eg adding a class to all your order-related input fields, putting the AJAX url into your Javascript somewhere eg var myRoute = '/some/path/to/script.php' and construct the data to send to the server yourself based on $("input.myclass").each()-style code with jQuery. Essentially all I use the input fields for is data storage client-side - you can accomplish this however you want.

    Just to clarify as well, you don't need to have a submit button etc for a form, it just makes it easier to serialize the data to send to your AJAX script - this is fired automatically when you stop dragging an item if you use the above code.

    0 讨论(0)
  • 2021-02-06 19:23

    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.

    0 讨论(0)
提交回复
热议问题