jQuery UI Sortable、次に注文をデータベースに書き込みます


125

jQuery UI sortable関数を使用して、ユーザーが注文を設定し、変更時にデータベースに書き込み、更新できるようにしたいと考えています。これがどのように行われるかについて誰かが例を書くことはできますか?


4
toArrayソートされたIDの文字列を提供しますが、役立つと思います。api.jqueryui.com/sortable/#method-toArray
MahanGM

1
問題を解決しましたか?
Knelis 2013年

1
MKD

いくつかの点で、このような質問はSOで最高の質問です。しかし、この質問は、2020年に押しつぶされることになる
Parapluie

回答:


223

jQuery UI sortable機能には、これを行うためのserializeメソッドが含まれています。とても簡単です。要素の位置が変わるとすぐに、指定されたURLにデータを送信する簡単な例を次に示します。

$('#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'
        });
    }
});

これは、要素を使用して要素の配列を作成することidです。だから、私は通常次のようなことをします:

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

このserializeオプションを使用すると、次のようなPOSTクエリ文字列が作成されますitem[]=1&item[]=2。たとえば、id属性のデータベースIDを使用する場合は、POSTされた配列を繰り返し処理し、それに応じて要素の位置を更新できます。 。

たとえば、PHPの場合:

$i = 0;

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

jsFiddleの例。


7
IDを自動的に生成するには、次を使用できます$("#element").children().uniqueId().end().sortable({...
Taylan

12
ドキュメントには、serializeオプションを使用する場合、idをname_number形式として定義する必要があると記載されています。
パリス14年

5
ドキュメントごとにこれらの他の文字を使用することもできます。セットと番号を区切るには、アンダースコア、等号、またはハイフンを使用できます。たとえば、「foo = 1」、「foo-1」、および「foo_1」はすべて「foo [] = 1」にシリアル化されます。
lhoess 14年

2
複数のデータ変数を渡した場合、これが機能しないようです。
PBwebD 2015年

1
MKD

11

これも役立つかもしれないと思った。A)各ソート後にサーバーに送り返す間、ペイロードを最小限に抑えるように設計されています。(毎回すべての要素を送信したり、サーバーがチャックする可能性のある多くの要素を繰り返し処理する代わりに)B)要素のID /名前を損なうことなくカスタムIDを送り返す必要がありました。このコードはasp.netサーバーからリストを取得し、ソート時に2つの値のみが返されます。ソートされた要素のdb idと、その要素がドロップされた要素のdb idです。これらの2つの値に基づいて、サーバーは新しい位置を簡単に識別できます。

<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タグは、使い慣れていないユーザーを混乱させる可能性があり、これは純粋にjQuery / HTMLの問題です。
ggdx

1
二年後!忙しいですか?
ggdx 2017年

移動したアイテムがリストの最初のアイテムとしてドロップされるとどうなりますか?
Edson Horacio Junior

1
ドロップされたアイテムがある場合、アクションの対象となるアイテムの「次へ」id = 0、action = del、plid = id、それ以外の場合はaction = sortで、2つのパラメーターがあり、アイテムが並べ替えられ、次にドロップされます。これは、サーバーが残りの操作を実行するために使用できる最小限の情報です。試してみてパターンをテスト。同じパターンを使用して追加と挿入を行うことさえできます-アクションのプレイと他の2つのパラメーターだけです。
Kalpesh Popat

9

あなたは運がいいです、私は私のCMSで正確なものを使用します

注文を保存する場合は、JavaScriptメソッドを呼び出しますsaveOrder()POSTsaveorder.phpにAJAX リクエストを送信しますが、もちろん、通常のフォームとして投稿することもできます。

<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; 確認とチェックはすべて削除したことに注意してください。

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

7

これは私の例です。

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

更新イベントで注文をキャッチする必要があります

    $( "#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で受け入れられた回答と関連する例に従って行を変更できます。しかし、いくつかの未知の理由により、「停止または変更」アクションの後でIDを取得できませんでした。しかし、JQuery UIページに投稿された例は私には問題なく機能します。このリンクはここで確認できます。


0

次の解決策を試してください:http : //phppot.com/php/sorting-mysql-row-order-using-jquery/ここで、新しい順序がいくつかのHMTL要素に保存されます。次に、このデータを含むフォームをいくつかのPHPスクリプトに送信し、forループで反復します。

注:各反復で更新(タイムスタンプ)されるタイプINT(11)の別のdbフィールドを追加する必要がありました。これは、スクリプトが最近更新された行を知るために役立ちます。そうしないと、結果がスクランブルされます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.