如果用户删除Laravel中当前页面的最后一项,如何重定向到上一页?

时间:2016-12-24 14:24:33

标签: php laravel pagination

我允许用户从分页内容中删除项目。删除项目后,用户请求重定向它们。然而,我注意到这是错误的,因为如果页面只包含一个项目并且用户将其删除,则会将它们重定向到现在没有记录的同一页面。我在每个页面上有11个项目并使用默认的Laravel分页。如果删除最后一个或唯一的项目后当前页面为空白,我如何强制执行将用户重定向到上一页的机制?

4 个答案:

答案 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');