jQuery:sortable('serialize')가 반환하는 목록을 어떻게 처리하나요?
-
19-08-2019 - |
문제
jQuery를 사용하면 다음과 같이 '직렬화'를 사용하여 정렬 가능한 목록의 위치를 검색합니다.
var order = $('ul').sortable('serialize');
그러면 변수 'order'는 다음을 받습니다:
id[]=2&id[]=3&id[]=1&id[]=4&id[]=5
이제 Ajax 호출에서 이 데이터를 어떻게 사용할 수 있습니까?
이것이 제가 계획한 방법이지만 보기 흉하고 매개변수 이름 'id'를 변경할 수 없습니다.
$.post('ajax.php?'+order,{action:'updateOrder'});
어쩌면 직렬화를 해제한 다음 'order' 변수를 내포하여 하나의 매개변수에만 할당해야 할까요?
서버 측 코드에는 문제가 없지만 jQuery 클라이언트 사이트 코드에는 문제가 있습니다.문제는 스크립트에서 'order' 변수를 어디에 배치해야 하느냐는 것입니다.
제가 제시한 예에서는 이를 쿼리 문자열로 추가했습니다.
'ajax.php?'+order
하지만 액션 매개변수처럼 매개변수로 전달하고 싶습니다.다음은 작동하지 않으며 구문 오류를 반환합니다.
$.post('ajax.php?'+order,{action:'updateOrder',order});
해결책
그것을 발견!옵션을 추가해야 했어요 key:'string'
변수 이름을 'id' 대신 'string'으로 변경합니다.
var order = $('#projects ul').sortable('serialize',{key:'string'});
$.post('ajax.php',order+'&action=updateOrder');
다른 팁
사용하지 않는 것이 가장 좋은 방법이라고 생각합니다 sortable('serialize')
하지만 jQuery를 사용하면 다음과 같이 정렬된 ID를 간단히 반복할 수 있습니다.
order = [];
$('ul').children('li').each(function(idx, elm) {
order.push(elm.id.split('_')[1])
});
$.get('ajax.php', {action: 'updateOrder', 'order[]': order});
이는 직렬화된 정렬 가능 항목을 URL(또는 매개변수)에 명시적으로 추가하는 것보다 이점이 있습니다. order[]
매개변수가 없으면 전혀 li
목록에 있습니다.(이 문제가 발생했을 때 나는 sortable(connectWith: 'ul')
따라서 사용자는 모든 항목을 드래그하는 것이 전적으로 가능했습니다. li
하나의 목록에서).대조적으로 직렬화된 정렬 가능 항목을 추가하면 원치 않는 '&'가 남게 됩니다.
뉴스 항목을 주문하고 페이지에서 이를 PHP 코드 "?id[]=2&id[]=3&id[]=1&id[]=4&id[]=5"로 보냈다고 가정해 보겠습니다.
$_POST['id'] # would be [2,3,1,4,5]
// Now we need to update the position field of these items
foreach($_POST['id'] as $i=>$id ):
// For our first record, $i is 0, and $id is 2.
$post = Post::get($id); # Do you own database access here
$post->position = $i; # Set the position to its location in the array
$post->save(); # Save the record
endforeach
var order = $('#projects ul').sortable('toArray'});
이것도 효과가 있을 수 있어요 ;)
가장 좋은 방법은 var를 사용하는 것입니다. order = $('ul').sortable('serialize');
기능은 다음 링크에 나와 있습니다.
PHP 파일에서 순서가 지정된 목록 데이터를 가져오는 데 필요한 것은 다음 코드뿐입니다.
foreach( $_POST['id'] as $order => $order_nb )
{
...
}
"key" 매개변수와 관련하여 배열을 얻기 위해 대괄호를 사용했습니다.
var data = $('#cms-form').serialize();
data += '&' + $('.ui-tabs-nav').sortable('serialize', {key:'nav_order[]'});
해결책
나는 sortable('serialize')을 조작하여 나만의 솔루션을 만들었습니다.jquery 함수를 사용하여 단순화한 다음 데이터베이스의 목록 순서를 업데이트하기 위해 PHP URL에 게시했습니다.내 코드를 살펴보세요.
$( "#covercast_sortable" ).sortable({
update : function () {
var order = $('#covercast_sortable').sortable('serialize',{key:'string'});
// order var gives something like string=3&string=2&string=1
var ar = order.split('&');
var i = 0;
var str = '';
for(i;i<ar.length;i++){
if(str != "") { str += ','; }
// slice is used to remove 'sting=' from every value of var ar
str += ar[i].slice(7);
}
// here value of str is 3,2,1 with respect to order variable
$.ajax({
type: "POST",
url: 'myURL.php',
data: 'order=' + str,
cache: false,
success: function (data) {
console.log(data);
}
});
}
});
건배
데이터가
$data = 'album[]=stat&sort[]=157204&sort[]=157205&sort[]=157206&sort[]=157208&sort[]=157207&sort[]=157209&sort[]=157210&sort[]=157211&sort[]=157212&sort[]=157213';
그리고 당신은 PHP에서 배열로 정렬을 원합니다
사용 구문 분석_str()
parse_str($data, $output);
print_r($output);
출력 : 배열 ([앨범] => 배열 ([0] => stat)
[sort] => Array
(
[0] => 157204
[1] => 157205
[2] => 157206
[3] => 157208
[4] => 157207
[5] => 157209
[6] => 157210
[7] => 157211
[8] => 157212
[9] => 157213
)
)