首页 文章

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

提问于
浏览
4

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

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('');
}

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

7 回答

  • 2

    我发现这个问题的有效解决方案是 edit the pagination template .

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

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

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

    <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>
    

    更新:

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

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

    更新2:

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

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

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

  • 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

    你可以扩展 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

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

    export your pagination views之后,进行以下两项修改:

    MODIFICATION 1

    替换这个:

    {{ $paginator->previousPageUrl() }}

    有了这个:

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

    MODIFICATION 2

    替换这个:

    {{ $url }}

    有了这个:

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

相关问题