jQuery UI Sıralanabilir, ardından sırayı bir veritabanına yaz


125

JQuery UI sortableişlevini, kullanıcıların bir sipariş ayarlamasına ve daha sonra değiştirildiğinde, veritabanına yazmasına ve güncellemesine izin vermek için kullanmak istiyorum . Birisi bunun nasıl yapılacağına dair bir örnek yazabilir mi?


4
toArraybir dizi sıralı kimlik verir, bence yardımcı olabilir. api.jqueryui.com/sortable/#method-toArray
MahanGM

1
Sorununu çözdün mü?
Knelis


Bazı yönlerden bunun gibi sorular SO'da en iyisidir. Ancak bu soru 2020'de
çözülecektir

Yanıtlar:


223

JQuery UI sortableözelliği, bunu yapmak için bir serializeyöntem içerir . Gerçekten çok basit. Bir öğenin konumu değişir değişmez verileri belirtilen URL'ye gönderen hızlı bir örneği burada bulabilirsiniz.

$('#element').sortable({
    axis: 'y',
    update: function (event, ui) {
        var data = $(this).sortable('serialize');

        // POST to server using $.post or $.ajax
        $.ajax({
            data: data,
            type: 'POST',
            url: '/your/url/here'
        });
    }
});

Bunun yaptığı şey, öğeleri kullanarak bir dizi öğe oluşturmasıdır id. Bu yüzden genellikle şöyle bir şey yaparım:

<ul id="sortable">
   <li id="item-1"></li>
   <li id="item-2"></li>
   ...
</ul>

serializeSeçeneği kullandığınızda, şuna benzer bir POST sorgu dizisi oluşturacaktır: item[]=1&item[]=2vb. Dolayısıyla, örneğin idöznitelikte veritabanı kimliklerinizi kullanırsanız , POSTed dizisi boyunca basitçe yineleme yapabilir ve öğelerin konumlarını buna göre güncelleyebilirsiniz. .

Örneğin, PHP'de:

$i = 0;

foreach ($_POST['item'] as $value) {
    // Execute statement:
    // UPDATE [Table] SET [Position] = $i WHERE [EntityId] = $value
    $i++;
}

JsFiddle ile ilgili örnek.


7
Kimlikleri otomatik olarak oluşturmak için kullanabilirsiniz$("#element").children().uniqueId().end().sortable({...
Taylan

12
belgeler serileştirme seçeneğini kullanmak için id'yi ad_sayı biçimi olarak tanımlamanız gerektiğini söylüyor .
parisssss

5
Belgelere göre bu diğer karakterleri de kullanabilirsiniz: Kümeyi ve sayıyı ayırmak için bir alt çizgi, eşittir işareti veya kısa çizgi kullanabilirsiniz. Örneğin "foo = 1", "foo-1" ve "foo_1" tümü "foo [] = 1" olarak serileştirilir.
2014

2
Birden çok veri değişkenini geçiriyorsam, bunu çalıştıracak gibi görünmüyorum.
PBwebD


11

Bunun da yardımcı olabileceğini düşündüm. A) Her sıralamadan sonra sunucuya geri gönderirken yükü minimumda tutacak şekilde tasarlanmıştır. (her seferinde tüm öğeleri göndermek veya sunucunun atabileceği birçok öğeyi yinelemek yerine) B) Öğenin kimliği / adından ödün vermeden özel kimliği geri göndermem gerekiyordu. Bu kod, listeyi asp.net sunucusundan alacak ve ardından yalnızca 2 değer sıralandığında geri gönderilecektir: Sıralanan öğenin db kimliği ve yanında bırakıldığı öğenin db kimliği. Bu 2 değere dayanarak, sunucu yeni konumu kolayca belirleyebilir.

<div id="planlist" style="width:1000px">
    <ul style="width:1000px">
       <li plid="listId1"><a href="#pl-1">List 1</a></li>
       <li plid="listId2"><a href="#pl-2">List 1</a></li>
       <li plid="listId3"><a href="#pl-3">List 1</a></li>
       <li plid="listId4"><a href="#pl-4">List 1</a></li>
    </ul>
    <div id="pl-1"></div>
    <div id="pl-2"></div>
    <div id="pl-3"></div>
    <div id="pl-4"></div>
</div>
<script type="text/javascript" language="javascript">
    $(function () {
        var tabs = $("#planlist").tabs();
        tabs.find(".ui-tabs-nav").sortable({
            axis: "x",
            stop: function () {
                tabs.tabs("refresh");
            },
            update: function (event, ui) {
                //db id of the item sorted
                alert(ui.item.attr('plid'));
                //db id of the item next to which the dragged item was dropped
                alert(ui.item.prev().attr('plid'));

                //make ajax call
            }
        });
    });
</script>

4
ASP etiketleri, onlara aşina olmayanlar için kafa karıştırıcı olabilir ve bu tamamen bir jQuery / HTML sorunudur.
ggdx

1
İki yıl sonra! Meşgul müsün?
ggdx

Taşınan öğe listenin ilk öğesi olarak bırakılırsa ne olur?
Edson Horacio Junior

1
herhangi bir öğe düşerse, üzerinde işlem yapılan öğenin "yanındaki" id = 0, action = del ve plid = id, aksi takdirde action = sort ve 2 parametresi vardır, öğe sıralanır ve yanına bırakılır . bu, sunucunun işlemlerin geri kalanını gerçekleştirmek için kullanabileceği minimum bilgidir. denenir ve test edilir. Hatta aynı kalıbı kullanarak ekleyip eklemem bile var - sadece aksiyon oyunu ve diğer 2 parametre.
Kalpesh Popat

9

Şanslısın, CMS'imde aynısını kullanıyorum

Siparişi saklamak istediğinizde JavaScript yöntemini çağırmanız yeterlidir saveOrder(). POSTSaveorder.php için bir AJAX isteğinde bulunacaktır, ancak elbette bunu her zaman normal bir form olarak gönderebilirsiniz.

<script type="text/javascript">
function saveOrder() {
    var articleorder="";
    $("#sortable li").each(function(i) {
        if (articleorder=='')
            articleorder = $(this).attr('data-article-id');
        else
            articleorder += "," + $(this).attr('data-article-id');
    });
            //articleorder now contains a comma separated list of the ID's of the articles in the correct order.
    $.post('/saveorder.php', { order: articleorder })
        .success(function(data) {
            alert('saved');
        })
        .error(function(data) { 
            alert('Error: ' + data); 
        }); 
}
</script>
<ul id="sortable">
<?php
//my way to get all the articles, but you should of course use your own method.
$articles = Page::Articles();
foreach($articles as $article) {
    ?>
    <li data-article-id='<?=$article->Id()?>'><?=$article->Title()?></li>
    <?
}               
?>   
</ul>
   <input type='button' value='Save order' onclick='saveOrder();'/>

Saveorder.php içerisinde; Tüm doğrulama ve kontrolleri kaldırdığımı unutmayın.

<?php
$orderlist = explode(',', $_POST['order']);
foreach ($orderlist as $k=>$order) {
  echo 'Id for position ' . $k . ' = ' . $order . '<br>';
}     
?>

7

Bu benim örneğim.

https://github.com/luisnicg/jQuery-Sortable-and-PHP

Güncelleme etkinliğinde siparişi yakalamanız gerekiyor

    $( "#sortable" ).sortable({
    placeholder: "ui-state-highlight",
    update: function( event, ui ) {
        var sorted = $( "#sortable" ).sortable( "serialize", { key: "sort" } );
        $.post( "form/order.php",{ 'choices[]': sorted});
    }
});

0

JsFiddle üzerinde kabul edilen yanıtı ve ilgili örneği takip ederek satırları değiştirebilirim. Ancak bilinmeyen bazı nedenlerden dolayı, "durdur veya değiştir" eylemlerinden sonra kimlikleri alamadım. Ancak JQuery UI sayfasında yayınlanan örnek benim için iyi çalışıyor. Bu bağlantıyı buradan kontrol edebilirsiniz .


0

Bu çözümü deneyin: http://phppot.com/php/sorting-mysql-row-order-using-jquery/ burada yeni sipariş bazı HMTL öğelerinde kaydedilir. Daha sonra formu bu verilerle birlikte bazı PHP betiğine gönderir ve for döngüsü ile yinelersiniz.

Not: Her yinelemede güncellenen (zaman damgası olan) INT (11) türünde başka bir db alanı eklemek zorunda kaldım - bu, komut dosyasının en son hangi satırın güncellendiğini bilmesine hizmet eder, aksi takdirde karıştırılmış sonuçlarla sonuçlanırsınız.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.