如何从laravel分页的第一页删除查询字符串页面?

问题描述 投票:6回答:8

我正在使用分页,如下所示:

public function index()
    {
        $jobs = Job::paginate(5);
        return view('job.index', compact('jobs'));
    }

在视图中:

{{ $jobs->links() }}

生成两个典型页面存在问题:/job/job?page=1这两个页面具有相同的内容。

我想做任何从分页的第一页删除查询字符串page的事情。

我尝试过以下方法:

if ($jobs->onFirstPage()){
  $jobs->setPageName('');
} 

但这会破坏分页,即页面链接无法正确加载,并且查询字符串值仍然适用于所有页面。

php laravel laravel-5 pagination laravel-5.4
8个回答
3
投票

我发现这个问题的有效解决方案是编辑分页模板。

首先使用项目根目录中的以下命令从供应商发布分页模板:

php artisan vendor:publish --tag=laravel-pagination

现在应该找到resources/views/vendor/pagination/default.blade.php的文件,并且可以使用str_replace()为每个页面的URL和后退导航按钮编辑如下所示:

<li><a href="{{str_replace('?page=1','',$paginator->previousPageUrl())}}" title="{{__('Previous')}}" rel="prev">{{$foxPrev}}</a></li>

 <li><a href="{{str_replace('?page=1','',$url)}}">{{ $page }}</a></li>

Update:

使用?page=10发现了一个错误,所以我们不应该使用str_replace,而应使用preg_replace,如下所示:

<li><a href="{{preg_replace('/\?page=[1]$/','',$url)}}">{{ $page }}</a></li>

Update 2:

如果使用除page之外的页码参数的任何自定义名称,我们可以使用pazzator getter作为$pageName属性,如下面的分页模板:

<li><a href="{{preg_replace('/\?'.$paginator->getPageName().'=[1]$/','',$url)}}">{{ $page }}</a></li>

要了解有关如何在同一页面上使用多个分页或如何从视图自定义页码参数$pageName的更多信息,请查看this answer


2
投票

你可以扩展LengthAwarePaginator方法url($ page)

/**
 * Get the URL for a given page number.
 *
 * @param  int  $page
 * @return string
 */
public function url($page)
{
    if ($page <= 0) {
        $page = 1;
    }

    // If we have any extra query string key / value pairs that need to be added
    // onto the URL, we will put them in query string form and then attach it
    // to the URL. This allows for extra information like sortings storage.
    $parameters = ($page > 1) ? [$this->pageName => $page] : [];

    if (count($this->query) > 0) {
        $parameters = array_merge($this->query, $parameters);
    }

    return rtrim($this->path
        .(Str::contains($this->path, '?') ? '&' : '?')
        .http_build_query($parameters, '', '&')
        .$this->buildFragment(), '?');
}

0
投票

如果你关心SEO,添加规范标签

我什么都不知道......

if($pageNum==1){
    return redirect()->to($path);
}

$ pageNum id获取请求或自己的类

$ path =“/ jobs”


0
投票

在您的路线中,为通往您的功能的路线命名:

Route::get('/yourRoute','YourController@foo')->name('yourRouteName');

然后,在控制器的函数中,使用:

public function foo() {
    if( request()->page=='1' )
    {
            return redirect()->route('yourRouteName',[$id]);
    }
     else {
            // Your function content
    }
}

0
投票

我想你可以试试这个:

{{ $jobs->links() }}

{{ $jobs->nextPageUrl() }}

希望这对你有用!


0
投票

您可以像这样修改视图:

@if ($page==1)
   <a href="{{ str_replace('?page=1', '', $url) }}">{{ $page }}</a>
@else
   <a href="{{ $url }}">{{ $page }}</a>
@endif

0
投票

我找到了以下工作,并考虑到page=10问题:

在你export your pagination views之后,做出以下2个修改:

修改1

替换这个:

{{ $paginator->previousPageUrl() }}

有了这个:

{{ preg_replace('/(?:(&|\\?)page=[1])(?!\\d)/ui','', $paginator->previousPageUrl()) }}

修改2

替换这个:

{{ $url }}

有了这个:

{{ preg_replace('/(?:(&|\\?)page=[1])(?!\\d)/ui','', $url ) }}


0
投票

我这样做了:

{{ $posts->currentPage() == 2 ? route('home') : $posts->previousPageUrl() }}
© www.soinside.com 2019 - 2024. All rights reserved.