我允许用户从分页内容中删除项目。删除项目后,用户请求重定向它们。然而,我注意到这是错误的,因为如果页面只包含一个项目并且用户将其删除,则会将它们重定向到现在没有记录的同一页面。我在每个页面上有11个项目并使用默认的Laravel分页。如果删除最后一个或唯一的项目后当前页面为空白,我如何强制执行将用户重定向到上一页的机制?
答案 0 :(得分:2)
您可以尝试在控制器中进行简单检查并手动重定向用户。代码只显示了这个想法:
$result = Model::paginate(10);
if (count($result) === 0) {
$lastPage = $result->lastPage(); // Get last page with results.
$url = route('my-route').'?page='.$lastPage; // Manually build URL.
return redirect($url);
}
return redirect()->back();
答案 1 :(得分:1)
您可以查看否。结果,如果小于1,那么您可以重定向到previousPageUrl
:
if ($results->count()) {
if (! is_null($results->previousPageUrl())) {
return redirect()->to($results->previousPageUrl());
}
}
答案 2 :(得分:0)
我通过在删除功能上执行Redirect::back()
来解决它。这导致了paginator函数,其中l执行了以下操作:
//if an item was deleted by the user and it was the only on that page the number of
//items will be zero due the page argument on the url. To solve this we need to
//redirect to the previous page. This is an internal redirect so we just get the
//current arguments and reduce the page number by 1. If the page argument is not
//available it means that we are on the first page. This way we either land on the
//first page or a previous page that has items
$input = Input::all();
if( (count($pages) == 0) && ( array_key_exists('page', $input) ) ){
if($input['page'] < 2){
//we are headed for the first page
unset($input['page']);
return redirect()->action('MyController@showItems', $input);
}
else{
//we are headed for the previous page -- recursive
$input['page'] -= 1;
return redirect()->action('MyController@showItems', $input);
}
}
答案 3 :(得分:0)
要在控制器方法destroy()
中实现这种逻辑,我们需要知道当前的页码和项目计数(在删除此项目之前)。
通过 DELETE
链接传递这两条信息,然后使用Request
input
方法检索它们。
您认为:
<form action="{{'/items/'.$item->id.'?current_page='.$items->currentPage().'&items_count='.$items->count()}}" method="POST">
@method('DELETE')
@csrf
<button>Delete</button>
</form>
在您的控制器中:
public function destroy(Item $item, Request $request)
{
$item->delete();
$itemsCount = $request->input('items_count');
$currentPage = $request->input('current_page');
$url = $itemsCount > 1 ? '/items/?page='.$currentPage : '/items/?page='.($currentPage - 1);
return redirect($url);
}
如果是最后一页(1),则页码变为0,仍将返回正确的响应(空项目列表)。
对于路由,请使用两个参数来实现路由,并以控制器的destroy方法作为回调。 如果您有资源控制器,则此路由必须位于后者的路由之前。
web.php
Route::DELETE('/items/{item_id}?current_page={number}&items_count={count}', 'ItemController@destroy');
Route::resource('/items', 'ItemController');