【发布时间】:2017-11-10 21:01:43
【问题描述】:
更新 我已经根据我得到的答案稍微改变了问题
在用户通过 JQuery 的可排序库操作表格后,我正在尝试保存行的顺序。
<div class="nametag-layout">
<table class="table table-striped pagin-table table-bordered">
<thead>
<tr>
<td>Duration</td>
<td>Intent</td>
<td>Module</td>
<td>Outputs</td>
<td>Inputs</td>
<td>Logistics</td>
</tr>
</thead>
<tbody>
@foreach($mods as $key => $value)
<tr class="table-tr draggable" data-id="{!!$value->id!!}">
<td>{{ $value->mod_duration }}</td>
<td>{{ $value->mod_intent }}</td>
<td>{{ $value->mod_module }}</td>
<td>{{ $value->mod_output }}</td>
<td>{{ $value->mod_input }}</td>
<td>{{ $value->mod_logistics }}</td>
<td>
<a class="btn btn-small btn-info" style="margin:auto; display:block;" href="{{ URL::to('mods/' . $value->id . '/edit') }}">Edit</a>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
在表格被操作之后,一个 js 函数获取行的新顺序并通过调用传递它。
$( "tbody" ).sortable({
stop: function (event, ui) {
var ids = new Array();
$('tr', this).each(function () {
ids.push($(this).data('id'));
});
$.get(window.location.href.split('?')[0] + "/sort", {ids: ids});
}
});
我的控制器中的排序函数获取这些值并解析它们,然后将其保存到数据库中,以便保存新的顺序。
public function sort()
{
$ids = request()->get('ids');
if ($ids != null) {
foreach ($ids as $i => $id) {
$value = Mod::find($id);
$value->sort = $i;
$value->save();
}
}
}
每次我刷新页面时,它都不会保存我将行移动到的顺序。检查 chrome 检查器并检查 XHR 过滤器显示,每次移动一行时,排序功能都会触发,但每次触发时,都会发生“VerifyCsrfToken 中的 TokenMismatchException”错误。我假设 js 函数实际上并没有将值传递给控制器,或者我搞砸了调用。
我还在“VerifyCsrfToken.php”中的 $except 参数中添加了“/sort”,以临时解决我遇到的 csrf 问题。
我的路线是这样的:
Route::get('/sort',array('as'=>'strawdog.sort','uses'=>'StrawdogController@sort'));
当我完成所有这些后,ajax 调用正在将数据发送到控制器,在使用 chrome 检查器上的 XHR 过滤器进行检查之后,但是每当刷新行时,它会返回到行的原始顺序而不是被操纵的秩序。
基本上,我做错了什么?
我尝试过的事情:
我尝试更改我的 js 函数以匹配控制器(post/get):
$.post(window.location.href.split('?')[0] + "/sort", {ids: ids});
public function sort()
{
$ids = request()->post('ids');
...
将两者都更改为“get”参数只会导致它调用我编写的另一个函数。将两者都更改为“post”参数只会再次返回“TokenMismatchException”错误。
我尝试了另一个选项,将 js 函数更改为“get”:
$.get(window.location.href.split('?')[0] + "/sort", {ids: ids});
还有要获取的函数:
$ids = request()->get('ids');
并删除了与get参数冲突的函数。然后我编写了一个显示函数来处理重定向到'/sort'。
public function show()
{
return redirect('/sort');
}
返回 chrome 检查器并检查 XHR 过滤器表明它正在传递值,但排序函数返回“RouteCollection.php 第 179 行中的 NotFoundHttpException”错误。
作为参考,我的路线如下所示: Route::get('strawdog/sort',array('as'=>'strawdog.sort','uses'=>'StrawdogController@sort'));
【问题讨论】:
-
使用
$.post()阅读post..$.get()阅读get..所以使用$.get()和get('ids')或$.post()和post('ids') -
更改为:$.post(window.location.href.split('?')[0] + "/sort", {ids: ids});匹配控制器只返回相同的错误。将我的控制器更改为 $.get 会导致它调用另一个函数而不是排序函数。