jQuery UI Sortable, 데이터베이스에 순서 쓰기


125

jQuery UI sortable기능을 사용하여 사용자가 주문을 설정 한 다음 변경시 데이터베이스에 기록하고 업데이트 할 수 있도록 하고 싶습니다 . 누군가 이것이 어떻게 수행되는지에 대한 예를 쓸 수 있습니까?


4
toArray정렬 된 ID 문자열을 제공하는 것이 도움이 될 것 같습니다. api.jqueryui.com/sortable/#method-toArray
MahanGM

1
문제를 해결 했습니까?
Knelis 2013 년

1
이것은 당신에게 도움이 될 수 있습니다 codingbin.com/reorder-with-php-mysql-and-jquery-sortable
MKD

어떤면에서 이와 같은 질문은 SO에서 가장 좋은 질문입니다. 그러나이 질문은 2020
뭉개

답변:


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를 사용하면 POSTed 배열을 반복하고 그에 따라 요소의 위치를 ​​업데이트 할 수 있습니다. .

예를 들어, 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({...
타일란

12
설명서에 직렬화 옵션을 사용하려면 id를 name_number 형식으로 정의해야 합니다.
parisssss

5
문서별로 다음과 같은 다른 문자 를 사용할 수도 있습니다. 밑줄, 등호 또는 하이픈을 사용하여 집합과 숫자를 구분할 수 있습니다. 예를 들어 "foo = 1", "foo-1", "foo_1"은 모두 "foo [] = 1"로 직렬화됩니다.
lhoess 2014 년

2
여러 데이터 변수를 전달하는 경우 작동하지 않는 것 같습니다.
PBwebD 2015 년

1
이것은 당신에게 도움이 될 수 있습니다 codingbin.com/reorder-with-php-mysql-and-jquery-sortable
MKD

11

이것이 도움이 될 것이라고 생각했습니다. A) 각 정렬 후 서버로 다시 보내는 동안 페이로드를 최소로 유지하도록 설계되었습니다. (매번 모든 요소를 ​​보내거나 서버가 빠질 수있는 많은 요소를 반복하는 대신) B) 요소의 ID / 이름을 손상시키지 않고 사용자 지정 ID를 다시 보내야했습니다. 이 코드는 asp.net 서버에서 목록을 가져온 다음 정렬시 정렬 된 요소의 db ID와 드롭 된 요소의 db ID 만 다시 전송됩니다. 이 두 값을 기반으로 서버는 새 위치를 쉽게 식별 할 수 있습니다.

<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 2015-06-16

1
2 년 후! 바빴어?
ggdx

이동 된 항목이 목록의 첫 번째 항목으로 삭제되면 어떻게됩니까?
Edson Horacio Junior

1
항목이 삭제되면 "next to"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.