我尝试为我的类别设置可排序功能,并且我使用JQuery UI
category_id
为空,则表示该类别为父级。
(就我而言,我只使用category_id
代替parent_id
不同的命名)Parent->child 1->child 1
childs
更新category_id
列
404
错误category_id
@foreach($Categorys as $cat)
//parent (deep 0)
<li class="parent" id="{{$cat->id}}">
{{$cat->title}}
//first child (deep 1)
@if(count($cat->childs))
@foreach($cat->childs as $child)
<li style="margin-left:20px !important;" class="firstchild" id="{{$child->id}}">
{{$child->title}}
//first child child (deep 2)
@if(count($child->childs))
@foreach($child->childs as $childdd)
<li style="margin-left:40px !important;" class="secondchild" id="{{$childdd->id}}">
{{$childdd->title}}
</li>
@endforeach
@endif
</li>
@endforeach
@endif
</li>
@endforeach
Ajax
$(function() {
$('.mytest').sortable({
stop: function() {
$.map($(this).find('li'), function(el) {
var itemID = el.id;
var itemIndex = $(el).index();
if (itemID) {
$.ajax({
url: '{{ url('
categorysort ') }}/' + encodeURI(itemID),
type: 'POST',
dataType: 'json',
data: {
itemID: itemID,
itemIndex: itemIndex
},
});
} else {
console.log(data);
}
});
}
});
});
route
Route::post('/categorysort/{id}','CategoryController@UpdatecategoryparentByAjax')->name('categorysort');
controller
public function UpdatecategoryparentByAjax(Request $request, $id)
{
$categories = Category::orderby('id', 'desc')->get();
$itemID = $request->input('itemID');
$itemIndex = $request->input('itemIndex');
foreach ($categories as $category) {
$category->where('id', $itemId)->update([
'category_id' => $itemIndex,
]);
}
}
PS:我发现我
category_id
中的li's
数据丢失了 之所以我没有说这是因为我不知道该如何使用 确切地说,就像我之前在我的问题中提到的那样,我的功能并没有 支持(所以我需要你的帮助)。
screenshot
答案 0 :(得分:1)
可能是因为你没有保护agaisnt csrf,这在执行帖子请求时是强制性的,因为laravel docs解释你可以通过将它添加到你的html来解决:
<meta name="csrf-token" content="{{ csrf_token() }}">
然后在你的ajax中,你只需要将它作为标题附加。
$.ajax({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
},
url: '/categorysort/'+ itemID ,
type: 'POST',
dataType: 'json',
data: {itemID: itemID, itemIndex: itemIndex},
});
此外,你只收到1个id,所以我想你要做的就是根据父级进行排序,因此你应该只选择父级的li
,这样你的控制器就会收到1个id而不是2,因为你现在正在做的是/categorysort/{parentId}/{childId}
,你需要的是/categorysort/{id}
,所以不要选择所有类别,只需选择顶级父类别:
$.map($(this).find('.parent'), function(el)
答案 1 :(得分:1)
看到您对encodeURI(itemID)
的评论后,我知道您的问题是route.php
。
我在网络上收到404错误
您需要使用optional parameters更新路线:
Route::post(
// Add {second_id?}. This is an "optional parameter".
'categorysort/{first_id}/{second_id?}',
'CategoryController@UpdatecategoryparentByAjax'
)->name('categorysort');
所以,您可以访问:
mydomain.test/categorysort/1
mydomain.test/categorysort/1/2
如果您需要第3个id
,请添加更多可选参数,如下所示:
Route::post(
'categorysort/{first_id}/{second_id?}/{third_id?}',
'CategoryController@UpdatecategoryparentByAjax'
)->name('categorysort');
所以,您可以访问:
mydomain.test/categorysort/1
mydomain.test/categorysort/1/2
mydomain.test/categorysort/1/2/3
如果您想让first_id
做同样的事情,只需在?
first_id
之后添加{first_id?}
。
我的函数不支持null category_id
更新路线后,您需要致电:
public function UpdatecategoryparentByAjax(Request $request, $first_id, $second_id, $third_id)
{
// $first_id access your 1st ID
// $second_id access your 2nd ID
// $third_id access your 3rd ID
// Do some logic here..
}