Laravel 5 中的自定义分页视图

Posted

技术标签:

【中文标题】Laravel 5 中的自定义分页视图【英文标题】:Custom pagination view in Laravel 5 【发布时间】:2015-03-30 05:12:51 【问题描述】:

Laravel 4.2 可以选择在app/config/view.php 中指定自定义视图,例如:

/*
|--------------------------------------------------------------------------
| Pagination View
|--------------------------------------------------------------------------
|
| This view will be used to render the pagination link output, and can
| be easily customized here to show any view you like. A clean view
| compatible with Twitter's Bootstrap is given to you by default.
|
*/
'pagination' => 'pagination_slider-alt'

这在 Laravel 5 中消失了,至少在 view.php 方面。

有没有办法在 Laravel 5 中复制这种行为?

【问题讨论】:

你有没有想过如何做到这一点? @ATLChris 还没有。我能够仅依靠 css 从 L4 复制我的自定义分页视图。它适用于我的情况。 @ATLChris 请看看我的回答是否对你有帮助。 【参考方案1】:

使用 Node.js 编写的其他 api 的数据进行 Laravel 自定义分页

控制器

class BlogController extends Controller

        $perPage = 20;
        $page=1;  
        if (isset($_GET["page"]))
            $page  = $_GET["page"];

       //Third party api to get records, you can put directly your url , I made a Api class to call third party api
        $records = Api::getBlogs($page, $perPage);
        $blogs =  $records['data'];
        $totalRecords = $records['totalRecords'];

       return view('blog.all',['blogs'=>$blogs,
            'pagination' =>array('totalRecords'=>$totalRecords, 'perPage'=>$perPage)
        ]);


博客视图

@foreach($blogs as $blog)
  $blog->title
@endforeach

@include('pagination.pagination', ['pagination'=>$pagination])

在视图“pagination”中创建一个新文件夹并在其中创建一个新文件“pagination.blade.php”,放置此内容

<?php 
$page=1;  
if (isset($_GET["page"]))
    $page  = $_GET["page"];

$totalPages = ceil($pagination['totalRecords'] / $pagination['perPage']); 

$count = 3;
$startPage = max(1, $page - $count);
$endPage = min( $totalPages, $page + $count);
$prev = $page - 1;
$next = $page + 1;
?>
<nav class="posts-navigation" aria-label="posts">
    <ul class="pagination">
        <li class="<?php if($page <= 1) echo 'disabled';  ?>">
            <a href="<?php if($page <= 1) echo '#';  else  echo "?page=" . $prev;  ?>" aria-label="Previous" >
            <i class="fas fa-angle-left"></i>
            </a>
        </li>
        <?php for($i = $startPage; $i <= $endPage; $i++ ): ?>
            <li class="<?php if($page == $i) echo 'active';  ?>"><a href="?page=<?= $i; ?>"><?= $i; ?></a></li>
        <?php endfor; ?>
        <li class="<?php if($page >= $totalPages)  echo 'disabled';  ?>">
            <a href="<?php if($page >= $totalPages) echo '#';  else echo "?page=". $next;  ?>" aria-label="Next">
            <i class="fas fa-angle-right"></i>
            </a>
        </li>
    </ul>
</nav>

【讨论】:

【参考方案2】:

如果您想使用 next 和 prev 自定义分页链接。 你可以在 Paginator.php 看到 里面有一些方法 我正在使用 Laravel 7

<a href=" $paginator->previousPageUrl() " < </a>
<a href=" $paginator->nextPageUrl() " > </a>

要限制项目,在控制器中使用 paginate()

$paginator = Model::paginate(int);

【讨论】:

【参考方案3】:

对于 Laravel 5.3(可能在其他 5.X 版本中),将自定义分页代码放入您的视图文件夹中。

资源/视图/分页/default.blade.php

@if ($paginator->hasPages())
    <ul class="pagination">
        -- Previous Page Link --
        @if ($paginator->onFirstPage())
            <li class="disabled"><span>&laquo;</span></li>
        @else
            <li><a href=" $paginator->previousPageUrl() " rel="prev">&laquo;</a></li>
        @endif

        -- Pagination Elements --
        @foreach ($elements as $element)
            -- "Three Dots" Separator --
            @if (is_string($element))
                <li class="disabled"><span> $element </span></li>
            @endif

            -- Array Of Links --
            @if (is_array($element))
                @foreach ($element as $page => $url)
                    @if ($page == $paginator->currentPage())
                        <li class="active"><span> $page </span></li>
                    @else
                        <li><a href=" $url "> $page </a></li>
                    @endif
                @endforeach
            @endif
        @endforeach

        -- Next Page Link --
        @if ($paginator->hasMorePages())
            <li><a href=" $paginator->nextPageUrl() " rel="next">&raquo;</a></li>
        @else
            <li class="disabled"><span>&raquo;</span></li>
        @endif
    </ul>
@endif

然后从主视图文件中调用这个分页视图文件为

 $posts->links('pagination.default') 

根据需要更新 pagination/default.blade.php

它也适用于 8.x 版本。

【讨论】:

你的是唯一的,不属于:“让我们以最讨厌和最困难的方式做简单的事情,只是为了证明我们的编码能力。” ;))) 并且 Laracast 的 Jeff Way 似乎同意你的看法......保持简单的人! (在 L5.3+ 上时) 擅长 laravel 5.8【参考方案4】:

我正在使用 Laravel 5.8。任务是使分页像下一个http://some-url/page-N 而不是http://some-url?page=N。它不能通过编辑 /resources/views/vendor/pagination/blade-name-here.blade.php 模板来完成(它可以由 php artisan vendor:publish --tag=laravel-pagination 命令)。在这里,我不得不扩展核心课程。

我的模型使用了DB实例的paginate方法,如下:

        $essays = DB::table($this->table)
        ->select('essays.*', 'categories.name', 'categories.id as category_id')
        ->join('categories', 'categories.id', '=', 'essays.category_id')
        ->where('category_id', $categoryId)
        ->where('is_published', $isPublished)
        ->orderBy('h1')
        ->paginate( // here I need to extend this method
            $perPage,
            '*',
            'page',
            $page
        );

让我们开始吧。 paginate() 方法放置在 \Illuminate\Database\Query\Builder 中并返回 Illuminate\Pagination\LengthAwarePaginator 对象。 LengthAwarePaginator扩展了Illuminate\Pagination\AbstractPaginator,有public function 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 = [$this->pageName => $page];

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

    // this part should be overwrited
    return $this->path 
        . (Str::contains($this->path, '?') ? '&' : '?')
        . Arr::query($parameters)
        . $this->buildFragment();

分步指南(我从this不错的文章中获取的部分信息):

    app 目录中创建 Extended 文件夹。 在Extended文件夹中创建3个文件CustomConnection.php、CustomLengthAwarePaginator.php、CustomQueryBuilder.php

2.1 CustomConnection.php 文件:

namespace App\Extended;

use \Illuminate\Database\mysqlConnection;

/**
 * Class CustomConnection
 * @package App\Extended
 */
class CustomConnection extends MySqlConnection 
    /**
     * Get a new query builder instance.
     *
     * @return \App\Extended\CustomQueryBuilder
     */
    public function query() 
        // Here core QueryBuilder is overwrited by CustomQueryBuilder
        return new CustomQueryBuilder(
            $this,
            $this->getQueryGrammar(),
            $this->getPostProcessor()
        );
    

2.2 CustomLengthAwarePaginator.php 文件 - 该文件包含需要覆盖的主要信息:

namespace App\Extended;

use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Arr;
use Illuminate\Support\Str;

/**
 * Class CustomLengthAwarePaginator
 * @package App\Extended
 */
class CustomLengthAwarePaginator extends LengthAwarePaginator

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

        // here the MAIN overwrited part of code BEGIN
        $parameters = [];

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

        $path =  $this->path . "/$this->pageName-$page";
        // here the MAIN overwrited part of code END

        if($parameters) 
            $path .= (Str::contains($this->path, '?') ? '&' : '?') . Arr::query($parameters);
        

        $path .= $this->buildFragment();

        return $path;
    

2.3 CustomQueryBuilder.php 文件:

namespace App\Extended;

use Illuminate\Container\Container;
use \Illuminate\Database\Query\Builder;

/**
 * Class CustomQueryBuilder
 * @package App\Extended
 */
class CustomQueryBuilder extends Builder

    /**
     * Create a new length-aware paginator instance.
     * Overwrite paginator's class, which will be used for pagination
     *
     * @param  \Illuminate\Support\Collection  $items
     * @param  int  $total
     * @param  int  $perPage
     * @param  int  $currentPage
     * @param  array  $options
     * @return \Illuminate\Pagination\LengthAwarePaginator
     */
    protected function paginator($items, $total, $perPage, $currentPage, $options)
    
        // here changed
        // CustomLengthAwarePaginator instead of LengthAwarePaginator
        return Container::getInstance()->makeWith(CustomLengthAwarePaginator::class, compact(
            'items', 'total', 'perPage', 'currentPage', 'options'
        ));
    

    /config/app.php需要更改db provider:

    'providers' => [
    
    
    // comment this line        
    // illuminate\Database\DatabaseServiceProvider::class,
    
    // and add instead:
    App\Providers\CustomDatabaseServiceProvider::class,
    

    在您的控制器(或您从 db 接收分页数据的其他地方)中,您需要更改分页设置:

    // here are paginated results
    $essaysPaginated = $essaysModel->getEssaysByCategoryIdPaginated($id, config('custom.essaysPerPage'), $page);
    // init your current page url (without pagination part)
    // like http://your-site-url/your-current-page-url
    $customUrl = "/my-current-url-here";
    // set url part to paginated results before showing to avoid 
    // pagination like http://your-site-url/your-current-page-url/page-2/page-3 in pagination buttons
    $essaysPaginated->withPath($customUrl);
    

    在视图中添加分页链接(/resources/views/your-controller/your-blade-file.blade.php),如下所示:

    <nav>
        !!$essays->onEachSide(5)->links('vendor.pagination.bootstrap-4')!!
    </nav>
    

享受吧! :) 您的自定义分页现在应该可以工作了

【讨论】:

【参考方案5】:

这是一个简单的自定义 Laravel 分页解决方案,包括服务器端和客户端代码。

假设使用 Laravel 5.2 和以下包含的视图:

@include('pagination.default', ['pager' => $data])

特点

显示上一个和下一个按钮并在不适用时禁用它们。 显示首页和末页按钮。 示例:(上一页|第一页|...|10|11|12|13|14|15|16|17|18|...|最后一页|下一页)

default.blade.php

@if ($paginator->last_page > 1)
<ul class="pagination pg-blue">
    <li class="page-item ($paginator->current_page == 1)?'disabled':''">
        <a class="page-link" tabindex="-1" href=" '/locate-vendor/' substr($paginator->prev_page_url,7) ">
            Previous
        </a>
    </li>

    <li class="page-item ($paginator->current_page == 1)?'disabled':''">
        <a class="page-link" tabindex="-1" href=" '/locate-vendor/1'">
            First
        </a>
    </li>

    @if ( $paginator->current_page > 5 )
    <li class="page-item">
        <a class="page-link" tabindex="-1">...</a>
    </li>
    @endif

    @for ($i = 1; $i <= $paginator->last_page; $i++)
        @if ( ($i > ($paginator->current_page - 5)) && ($i < ($paginator->current_page + 5)) )
        <li class="page-item ($paginator->current_page == $i)?'active':''">
            <a class="page-link" href="'/locate-vendor/'$i">$i</a>
        </li>
        @endif
    @endfor

    @if ( $paginator->current_page < ($paginator->last_page - 4) )
    <li class="page-item">
        <a class="page-link" tabindex="-1">...</a>
    </li>
    @endif

    <li class="page-item ($paginator->current_page==$paginator->last_page)?'disabled':''">
        <a class="page-link" href="'/locate-vendor/'$paginator->last_page">
            Last
        </a>
    </li>

    <li class="page-item ($paginator->current_page==$paginator->last_page)?'disabled':''">
        <a class="page-link" href="'/locate-vendor/'substr($paginator->next_page_url,7)">
            Next
        </a>
    </li>
</ul>
@endif

服务器端控制器功能

public function getVendors (Request $request)
    
        $inputs = $request->except('token');
        $perPage  = (isset($inputs['per_page']) && $inputs['per_page']>0)?$inputs['per_page']:$this->perPage;   
        $currentPage = (isset($inputs['page']) && $inputs['page']>0)?$inputs['page']:$this->page;   
        $slice_init = ($currentPage == 1)?0:(($currentPage*$perPage)-$perPage);

        $totalVendors = DB::table('client_broker')
                           ->whereIn('client_broker_type_id', [1, 2])
                           ->where('status_id', '1')
                           ->whereNotNull('client_broker_company_name')
                           ->whereNotNull('client_broker_email')
                           ->select('client_broker_id', 'client_broker_company_name','client_broker_email')
                           ->distinct()
                           ->count();

        $vendors = DB::table('client_broker')
                           ->whereIn('client_broker_type_id', [1, 2])
                           ->where('status_id', '1')
                           ->whereNotNull('client_broker_company_name')
                           ->whereNotNull('client_broker_email')
                           ->select('client_broker_id', 'client_broker_company_name','client_broker_email')
                           ->distinct()
                           ->skip($slice_init)
                           ->take($perPage)
                           ->get();

        $vendors = new LengthAwarePaginator($vendors, $totalVendors, $perPage, $currentPage);

        if ($totalVendors) 
            $response = ['status' => 1, 'totalVendors' => $totalVendors, 'pageLimit'=>$perPage, 'data' => $vendors,  'Message' => 'Vendors Details Found.'];
         else 
            $response = ['status' => 0, 'totalVendors' => 0, 'data' => [], 'pageLimit'=>'',  'Message' => 'Vendors Details not Found.'];
        
        return response()->json($response, 200);

    

【讨论】:

【参考方案6】:

也许为时已晚,但我想分享我制作的另一个自定义分页模板,它创建了第一个/下一个和最后一个/上一个链接。当用户已经在第一页/最后一页时,它也会隐藏链接。

(可选)还可以确定链接的间隔(当前页面前后的链接数)

使用示例:

 @include('pagination', ['paginator' => $users])

@include('pagination', ['paginator' => $users, 'interval' => 5])

这里是要点:https://gist.github.com/carloscarucce/33f6082d009c20f77499252b89c35dea

还有代码:

@if (isset($paginator) && $paginator->lastPage() > 1)

    <ul class="pagination">

        <?php
        $interval = isset($interval) ? abs(intval($interval)) : 3 ;
        $from = $paginator->currentPage() - $interval;
        if($from < 1)
            $from = 1;
        

        $to = $paginator->currentPage() + $interval;
        if($to > $paginator->lastPage())
            $to = $paginator->lastPage();
        
        ?>

        <!-- first/previous -->
        @if($paginator->currentPage() > 1)
            <li>
                <a href=" $paginator->url(1) " aria-label="First">
                    <span aria-hidden="true">&laquo;</span>
                </a>
            </li>

            <li>
                <a href=" $paginator->url($paginator->currentPage() - 1) " aria-label="Previous">
                    <span aria-hidden="true">&lsaquo;</span>
                </a>
            </li>
        @endif

        <!-- links -->
        @for($i = $from; $i <= $to; $i++)
            <?php 
            $isCurrentPage = $paginator->currentPage() == $i;
            ?>
            <li class=" $isCurrentPage ? 'active' : '' ">
                <a href=" !$isCurrentPage ? $paginator->url($i) : '#' ">
                     $i 
                </a>
            </li>
        @endfor

        <!-- next/last -->
        @if($paginator->currentPage() < $paginator->lastPage())
            <li>
                <a href=" $paginator->url($paginator->currentPage() + 1) " aria-label="Next">
                    <span aria-hidden="true">&rsaquo;</span>
                </a>
            </li>

            <li>
                <a href=" $paginator->url($paginator->lastpage()) " aria-label="Last">
                    <span aria-hidden="true">&raquo;</span>
                </a>
            </li>
        @endif

    </ul>

@endif

【讨论】:

【参考方案7】:

我将此代码与 k7 主题一起使用,并将此代码与他们的内置类一起使用。 您还可以根据需要将此代码与您的主题和课程一起使用..

尝试这样做。

<section class="page-paging pt-0">
  <div class="container">
    <div class="row">
      <div class="col-12">
        <nav aria-label="Page navigation example">
          @if ($view_post->lastPage() > 1)
            <ul class="pager list-inline mb-0 text-center">
              <li class=" ($view_post->currentPage() == 1) ? ' disabled' : '' p-1 list-inline-item float-sm-left">
                <a class="active page-link brd-gray px-4 py-3 font-weight-bold" href=" $view_post->url(1) ">
                  <i class="fa fa-angle-left pr-1"></i> Prev
                </a>
              </li>
              @for ($i = 1; $i <= $view_post->lastPage(); $i++)
              <li class=" p-1 list-inline-item d-none d-md-inline-block">
                <a class=" ($view_post->currentPage() == $i) ? ' active' : ''  page-link brd-gray px-4 py-3 font-weight-bold" href=" $view_post->url($i) "> $i 
                </a>
              </li>
              @endfor
              <li class=" ($view_post->currentPage() == $view_post->lastPage()) ? ' disabled' : ''  p-1 list-inline-item float-sm-right">
                <a class="active page-link brd-gray px-4 py-3 font-weight-bold" href=" $view_post->url($view_post->currentPage()+1) "> Next 
                  <i class="fa fa-angle-right pl-1"></i>
                </a>
              </li>
            </ul>
          @endif
        </nav>
      </div>
    </div>
  </div>
</section>

【讨论】:

【参考方案8】:

在 Laravel 5.4 中

我找到的最简单的方法是使用vendor:publish 命令将它们导出到您的resources/views/vendor 目录

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

然后转到resources\views\vendor\pagination\default.blade.php

并在那里进行自定义。

可以在here找到有关此的完整文档

【讨论】:

【参考方案9】:

5.5 中,links() 被替换为render(),其工作方式似乎相似。 [Official DOC]

替换

 $replies->links() 

 $replies->render("pagination::default") 

以下命令将在resources/views/vendor/pagination中生成分页模板

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

在任何视图文件(刀片文件)中,您都可以使用以下模板:

$replies-&gt;render("pagination::default") $replies-&gt;render("pagination::bootstrap-4") $replies-&gt;render("pagination::simple-bootstrap-4") $replies-&gt;render("pagination::semantic-ui")

【讨论】:

【参考方案10】:

如果你想美化你的分页的外观,我使用 bootstrap 中的类来使它更简单和容易

 @if ($students->lastPage() > 1)
        <ul class="pagination ml-auto">
            <li class=" ($students->currentPage() == 1) ? ' disabled' : ''  page-item">
                <a class=" page-link " href=" $students->url(1) " aria-label="Previous">
                    <span aria-hidden="true">&laquo;</span>
                    <span class="sr-only">Previous</span>
                </a>
            </li>
            @for ($i = 1; $i <= $students->lastPage(); $i++)
                <li class=" ($students->currentPage() == $i) ? ' active' : ''  page-item">
                    <a class=" page-link " href=" $students->url($i) "> $i </a>
                </li>
            @endfor
            <li class=" ($students->currentPage() == $students->lastPage()) ? ' disabled' : ''  page-item">
                <a href=" $students->url($students->currentPage()+1) " class="page-link" aria-label="Next">
                    <span aria-hidden="true">&raquo;</span>
                    <span class="sr-only">Next</span>
                </a>
            </li>
        </ul>
@endif

【讨论】:

【参考方案11】:

Laravel 5.3+ 中使用

$users->links('view.name')

Laravel 5.0 - 5.2 中而不是

$users->render()

使用

@include('pagination.default', ['paginator' => $users])

视图/分页/default.blade.php

@if ($paginator->lastPage() > 1)
<ul class="pagination">
    <li class=" ($paginator->currentPage() == 1) ? ' disabled' : '' ">
        <a href=" $paginator->url(1) ">Previous</a>
    </li>
    @for ($i = 1; $i <= $paginator->lastPage(); $i++)
        <li class=" ($paginator->currentPage() == $i) ? ' active' : '' ">
            <a href=" $paginator->url($i) "> $i </a>
        </li>
    @endfor
    <li class=" ($paginator->currentPage() == $paginator->lastPage()) ? ' disabled' : '' ">
        <a href=" $paginator->url($paginator->currentPage()+1) " >Next</a>
    </li>
</ul>
@endif

就是这样。


如果您有很多页面,请使用此模板:

views/pagination/limit_links.blade.php

<?php
// config
$link_limit = 7; // maximum number of links (a little bit inaccurate, but will be ok for now)
?>

@if ($paginator->lastPage() > 1)
    <ul class="pagination">
        <li class=" ($paginator->currentPage() == 1) ? ' disabled' : '' ">
            <a href=" $paginator->url(1) ">First</a>
         </li>
        @for ($i = 1; $i <= $paginator->lastPage(); $i++)
            <?php
            $half_total_links = floor($link_limit / 2);
            $from = $paginator->currentPage() - $half_total_links;
            $to = $paginator->currentPage() + $half_total_links;
            if ($paginator->currentPage() < $half_total_links) 
               $to += $half_total_links - $paginator->currentPage();
            
            if ($paginator->lastPage() - $paginator->currentPage() < $half_total_links) 
                $from -= $half_total_links - ($paginator->lastPage() - $paginator->currentPage()) - 1;
            
            ?>
            @if ($from < $i && $i < $to)
                <li class=" ($paginator->currentPage() == $i) ? ' active' : '' ">
                    <a href=" $paginator->url($i) "> $i </a>
                </li>
            @endif
        @endfor
        <li class=" ($paginator->currentPage() == $paginator->lastPage()) ? ' disabled' : '' ">
            <a href=" $paginator->url($paginator->lastPage()) ">Last</a>
        </li>
    </ul>
@endif

【讨论】:

如果有 1000 页,它会全部列出。需要限制它显示的页数。 为拥有大量页面的人添加了第二个模板 @MantasD 你怎么能附加?arg=... 在链接中有参数。在@include 之前还是之后? @include('pagination.default', ['paginator' => $users->appends(Input::except('page'))]) lifesaver - 5.4 文档页面中对此一无所知,但这非常有效【参考方案12】:

如果您想更改 url 中的页码而不是获取 /pageNo 之类的数据。前任: /2。您可以使用 jquery 更改 url 。我在 url 的 get 方法中有一些数据。

$(function () 
  $('.pagination li a').each(function () 
    var link = $(this).attr('href');
    var pageText = $(this).text();
    var activePage = parseInt($('.pagination li.active span').text());
    if (pageText.trim() == "«") 
      pageText = activePage - 1;
     else if (pageText.trim() == "»") 
      pageText = activePage + 1;
    
    link = link.replace('?', '/' + pageText + '?');
    link = link.replace('&page=' + pageText, '');
    $(this).attr('href', link);
    console.log(link);
  );
)

【讨论】:

【参考方案13】:

Laravel 5.2 为此使用了演示者。您可以创建自定义演示者或使用预定义的演示者。 Laravel 5.2 使用开箱即用的 BootstrapThreePrensenter,但使用 BootstrapFroutPresenter 或任何其他自定义演示者很容易。

public function index()

    return view('pages.guestbook',['entries'=>GuestbookEntry::paginate(25)]);

在您的刀片模板中,您可以使用以下公式:

!! $entries->render(new \Illuminate\Pagination\BootstrapFourPresenter($entries)) !!

对于创建自定义演示者,我建议观看 Codecourse's video 关于此的内容。

【讨论】:

【参考方案14】:

Laravel 5+ 中 Bootstrap 4 分页的快速 JS 修复

只需将以下脚本放在您的页面中:

    <script>
            $('.pagination li').addClass('page-item');
            $('.pagination li a').addClass('page-link');
            $('.pagination span').addClass('page-link');

    </script>

优点:节省服务器 CPU,无需在您的应用中进行调整。

【讨论】:

最简单有效的方法。唯一的问题是,如果用户没有在浏览器中启用 javascript,它就没有用了。【参考方案15】:

除了@MantasD 的答案,我还想提供全面的自定义 Laravel 分页。假设使用 Laravel 5.2 和以下包含的视图:

@include('pagination.default', ['pager' => $users])

特点

显示上一个和下一个按钮并在不适用时禁用它们 仅当上一页和下一页不同时才显示第一页和最后一页图标 生成相对链接,例如:(10、100、500 .. 等)而不是限制页面 使用辅助函数显示每个页面从 x 到 y 的结果。

default.blade.php

@if($pager->lastPage() != 1)
<ul class="pagination">

    @unless($pager->currentPage() < 3)
        <li class="paginate_button previous">
            <a href=" $pager->url(1) " title="First Page"><i class="fa fa-angle-double-left"></i></a>
        </li>
    @endunless

    <li class="paginate_button previous @unless($pager->previousPageUrl())disabled @endunless">
        <a href=" $pager->previousPageUrl() "><i class="fa fa-angle-left"></i></a>
    </li>

    @while($pager->paging++ < $pager->lastPage())
        @if (abs($pager->paging - $pager->currentPage()) >= 2)
            -- Generate relative links (eg. +10,etc) --
            @if(in_array(abs($pager->paging - $pager->currentPage()), array(10, 50, 100, 500, 1000))
            and $pager->paging != 1 and $pager->paging != $pager->lastPage())
                <li class="paginate_button @unless($pager->currentPage() != $pager->paging)active @endunless">
                    <a title="Results from  PaginationStartEnd($pager->paging, $pager->perPage(), $pager->total())['start']  to  PaginationStartEnd($pager->paging, $pager->perPage(), $pager->total())['end']  of  $pager->total() " href=" $pager->url($pager->paging) ">
                        <!-- +  $pager->paging - $pager->currentPage()  --> $pager->paging 
                    </a>
                </li>
            @endif
        @else
            <li class="paginate_button @unless($pager->currentPage() != $pager->paging)active @endunless">
                <a title="Results from  PaginationStartEnd($pager->paging, $pager->perPage(), $pager->total())['start']  to  PaginationStartEnd($pager->paging, $pager->perPage(), $pager->total())['end']  of  $pager->total() " href=" $pager->url($pager->paging) ">
                     $pager->paging 
                </a>
            </li>
        @endif
    @endwhile

    <li class="paginate_button next @unless($pager->nextPageUrl())disabled @endunless">
        <a href=" $pager->nextPageUrl() "><i class="fa fa-angle-right"></i></a>
    </li>

    @unless($pager->lastPage() - $pager->currentPage() < 2)
        <li class="paginate_button next">
            <a href=" $pager->url($pager->lastPage()) " title="Last Page"><i class="fa fa-angle-double-right"></i></a>
        </li>
    @endunless

</ul>
@endif

PaginationStartEnd 函数

if (!function_exists('PaginationStartEnd')) 
function PaginationStartEnd($currentPage, $perPage, $total)

    $pageStart = number_format( $perPage * ($currentPage - 1));
    $pageEnd = $pageStart +  $perPage;

    if ($pageEnd > $total)
        $pageEnd = $total;

    $pageStart++;

    return array('start' => number_format($pageStart), 'end' => number_format($pageEnd));


您可以根据需要更多地使用和自定义它。

注意: $pager->paging 是在控制器动作中声明的变量设置为 0

【讨论】:

我可以将$pager-&gt;paging 声明为0 的确切位置和控制器。我不明白。尝试您的代码后出现Undefined property: Illuminate\Pagination\LengthAwarePaginator::$paging 错误。 @A.B.Developer 您必须在调用分页结果时添加 $pager->paging = 0 。例如,您正在请求某种配置文件并希望在分页中获得结果: $profiles = Profile::with('contract')->withTrashed()->orderBy('birthday', 'asc')->paginate (12); $profiles->分页 = 0;返回视图('pages.profiles.list',紧凑('profiles'));使用 Laravel 5.3,您可以通过 php artisan vendor 轻松使用这些自定义:publish --tag=laravel-pagination 我尝试了您的代码,但在这种情况下,我再次收到此错误:A non well formed numeric value encountered at line return array('start' =&gt; number_format($pageStart), 'end' =&gt; number_format($pageEnd)); in PaginationStartEnd function。 我终于成功地使用了您的方法,方法是删除所有 number_format 临时函数调用。一切正常,但有没有办法限制完全显示的链接? @A.B.Developer 不确定限制链接是什么意思,但您可以根据需要自定义模板 default.blade.php。生成的相对链接可以通过更改数组中的值来限制(10、50、100、500、1000)。【参考方案16】:

如果有人需要,Laravel 5 会附带 Bootstrap 4 paginator。

首先创建一个新的服务提供者。

php artisan make:provider PaginationServiceProvider

register 方法中,将闭包传递给 Laravel 的分页器类,该类创建并返回新的演示者。

<?php


namespace App\Providers;

use Illuminate\Pagination\BootstrapFourPresenter;
use Illuminate\Pagination\Paginator;
use Illuminate\Support\ServiceProvider;

class PaginationServiceProvider extends ServiceProvider

    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    
        //
    

    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    
        Paginator::presenter(function($paginator)
        
            return new BootstrapFourPresenter($paginator);
        );
    

config/app.php注册新的提供者

'providers' => [
    //....
    App\Providers\PaginationServiceProvider::class,
]

我在Bootstrap 4 Pagination With Laravel找到了这个例子

【讨论】:

自此提交后不再使用演示者:github.com/laravel/framework/commit/… 要使其正常工作,请将 Paginator::presenter(function($paginator) return new BootstrapFourPresenter($paginator); ); 替换为 Paginator::$defaultView = 'pagination::bootstrap-4'; Paginator::$defaultSimpleView = 'pagination::bootstrap-4';【参考方案17】:

感谢 MantisD 的帖子,Bootstrap 4 运行良好。

<?php
$link_limit = 7; // maximum number of links (a little bit inaccurate, but will be ok for now)
?>

@if ($paginator->lastPage() > 1)
    <div id="news_paginate" class="dataTables_paginate paging_simple_numbers">
        <ul class="pagination">
            <li id="news_previous" class="paginate_button page-item previous  ($paginator->currentPage() == 1) ? ' disabled' : '' ">
                <a class="page-link" tabindex="0" href=" $paginator->url(1) ">Previous</a>
            </li>
            @for ($i = 1; $i <= $paginator->lastPage(); $i++)
                <?php
                    $half_total_links = floor($link_limit / 2);
                    $from = $paginator->currentPage() - $half_total_links;
                    $to = $paginator->currentPage() + $half_total_links;
                    if ($paginator->currentPage() < $half_total_links) 
                        $to += $half_total_links - $paginator->currentPage();
                    
                    if ($paginator->lastPage() - $paginator->currentPage() < $half_total_links) 
                        $from -= $half_total_links - ($paginator->lastPage() - $paginator->currentPage()) - 1;
                    
                ?>
                @if ($from < $i && $i < $to)
                    <li class="paginate_button page-item  ($paginator->currentPage() == $i) ? ' active' : '' ">
                        <a class="page-link" href=" $paginator->url($i) "> $i </a>
                    </li>
                @endif
            @endfor
            <li id="news_next" class="paginate_button page-item  ($paginator->currentPage() == $paginator->lastPage()) ? ' disabled' : '' ">
                @if($paginator->currentPage() == $paginator->lastPage())
                    <a class="page-link" tabindex="0" href=" $paginator->url($paginator->currentPage()) " >End</a>
                @else
                    <a class="page-link" tabindex="0" href=" $paginator->url($paginator->currentPage()+1) " >Next</a>
                @endif
            </li>
        </ul>
    </div>
@endif

【讨论】:

【参考方案18】:

这是 Laravel 5、Bootstrap 4 和没有 Blade 语法的一个(对于那些找到它的人 infinitely harder to read)。

使用,而不是:

!! $users->render() !!

用途:

@include('partials/pagination', ['paginator' => $users])

partials/pagination 是您的刀片模板文件,其中粘贴了以下内容。

// Number of links to show. Odd numbers work better
$linkCount = 7;
$pageCount = $paginator->lastPage();

if ($pageCount > 1)

    $currentPage = $paginator->currentPage();
    $pagesEitherWay = floor($linkCount / 2);
    $paginationhtml = '<ul class="pagination">';

    // Previous item
    $previousDisabled = $currentPage == 1 ? 'disabled' : '';
    $paginationHtml .= '<li class="page-item '.$previousDisabled.'">
                            <a class="page-link" href="'.$paginator->url($currentPage - 1).'" aria-label="Previous">
                                <span aria-hidden="true">&laquo;</span>
                                <span class="sr-only">Previous</span>
                            </a>
                        </li>';

    // Set the first and last pages
    $startPage = ($currentPage - $pagesEitherWay) < 1 ? 1 : $currentPage - $pagesEitherWay;
    $endPage = ($currentPage + $pagesEitherWay) > $pageCount ? $pageCount : ($currentPage + $pagesEitherWay);

    // Alter if the start is too close to the end of the list
    if ($startPage > $pageCount - $linkCount)
    
        $startPage = ($pageCount - $linkCount) + 1;
        $endPage = $pageCount;
    

    // Alter if the end is too close to the start of the list
    if ($endPage <= $linkCount)
    
        $startPage = 1;
        $endPage = $linkCount < $pageCount ? $linkCount : $pageCount;
    

    // Loop through and collect
    for ($i = $startPage; $i <= $endPage; $i++)
    
        $disabledClass = $i == $currentPage ? 'disabled' : '';
        $paginationHtml .= '<li class="page-item '.$disabledClass.'">
                                <a class="page-link" href="'.$paginator->url($i).'">'.$i.'</a>
                            </li>';
    

    // Next item
    $nextDisabled = $currentPage == $pageCount ? 'disabled' : '';
    $paginationHtml .= '<li class="page-item '.$nextDisabled.'">
                            <a class="page-link" href="'.$paginator->url($currentPage + 1).'" aria-label="Next">
                                <span aria-hidden="true">&raquo;</span>
                                <span class="sr-only">Next</span>
                            </a>
                        </li>';

    $paginationHtml .= '</ul>';

    echo $paginationHtml;

【讨论】:

【参考方案19】:

您好,这是我的分页代码:在刀片中使用 @include('pagination.default', ['paginator' => $users])

视图/分页/default.blade.php

@if ($paginator->lastPage() > 1)

si la pagina actual es distinto a 1 y hay mas de 5 hojas muestro el boton de 1era hoja --> if actual page is not equals 1, and there is more than 5 pages then I show first page button --> @if ($paginator->currentPage() != 1 && $paginator->lastPage() >= 5) << @endif
    <!-- si la pagina actual es distinto a 1 muestra el boton de atras -->
    @if($paginator->currentPage() != 1)
        <li>
            <a href=" $paginator->url($paginator->currentPage()-1) " >
                <
            </a>
        </li>
    @endif

    <!-- dibuja las hojas... Tomando un rango de 5 hojas, siempre que puede muestra 2 hojas hacia atras y 2 hacia adelante -->
    <!-- I draw the pages... I show 2 pages back and 2 pages forward -->
    @for($i = max($paginator->currentPage()-2, 1); $i <= min(max($paginator->currentPage()-2, 1)+4,$paginator->lastPage()); $i++)
            <li class=" ($paginator->currentPage() == $i) ? ' active' : '' ">
                <a href=" $paginator->url($i) "> $i </a>
            </li>
    @endfor

    <!-- si la pagina actual es distinto a la ultima muestra el boton de adelante -->
    <!-- if actual page is not equal last page then I show the forward button-->
    @if ($paginator->currentPage() != $paginator->lastPage())
        <li>
            <a href=" $paginator->url($paginator->currentPage()+1) " >
                >
            </a>
        </li>
    @endif

    <!-- si la pagina actual es distinto a la ultima y hay mas de 5 hojas muestra el boton de ultima hoja -->
    <!-- if actual page is not equal last page, and there is more than 5 pages then I show last page button -->
    @if ($paginator->currentPage() != $paginator->lastPage() && $paginator->lastPage() >= 5)
        <li>
            <a href=" $paginator->url($paginator->lastPage()) " >
                >>
            </a>
        </li>
    @endif
</ul>

【讨论】:

这对我有用。非常感谢它节省了我的时间。【参考方案20】:

而在 Laravel 4.2 中我会使用:

 $users->links('view.name') 

Laravel 5 中,您可以使用以下内容复制上述内容:

@include('view.name', ['object' => $users])

现在在包含的视图中,$object 将具有可用的分页方法,例如currentPage()lastPage()perPage() 等。

您可以在http://laravel.com/docs/5.0/pagination查看所有可用的方法

【讨论】:

感谢@include 指针 - 这正是我需要知道的。【参考方案21】:

在 Laravel 5 中,自定义分页基于演示者(类)而不是视图。

假设你的路由代码中有

$users = Users::paginate(15);

在 L4 中,你曾经在你的视图中做这样的事情:

$users->appends(['sort' => 'votes'])->links();

在 L5 中你可以这样做:

$users->appends(['sort' => 'votes'])->render();

render() 方法接受 Illuminate\Contracts\Pagination\Presenter 实例。您可以创建一个实现该协定的自定义类并将其传递给render() 方法。请注意,Presenter 是一个接口,而不是一个类,因此您必须实现它,而不是扩展它。这就是您收到错误消息的原因。

或者,您可以扩展 Laravel 分页器(以使用其分页逻辑),然后将现有的分页实例 ($users-&gt;...) 传递给扩展的类构造函数。这确实是我基于 Laravel 提供的 Bootstrap 演示器创建自定义 Zurb Foundation 演示器所做的。它使用了 Laravel 的所有分页逻辑,并且只覆盖了渲染方法。

使用我的自定义演示者,我的视图如下所示:

with(new \Stolz\Laravel\Pagination($users->appends(['sort' => 'votes'])))->render();

而我的自定义分页演示者是:

<?php namespace Stolz\Laravel;

use Illuminate\Pagination\BootstrapThreePresenter;

class Pagination extends BootstrapThreePresenter

    /**
     * Convert the URL window into Zurb Foundation HTML.
     *
     * @return string
     */
    public function render()
    
        if( ! $this->hasPages())
            return '';

        return sprintf(
            '<ul class="pagination" aria-label="Pagination">%s %s %s</ul></div>',
            $this->getPreviousButton(),
            $this->getLinks(),
            $this->getNextButton()
        );
    

    /**
     * Get HTML wrapper for disabled text.
     *
     * @param  string  $text
     * @return string
     */
    protected function getDisabledTextWrapper($text)
    
        return '<li class="unavailable" aria-disabled="true"><a href="javascript:void(0)">'.$text.'</a></li>';
    

    /**
     * Get HTML wrapper for active text.
     *
     * @param  string  $text
     * @return string
     */
    protected function getActivePageWrapper($text)
    
        return '<li class="current"><a href="javascript:void(0)">'.$text.'</a></li>';
    

    /**
     * Get a pagination "dot" element.
     *
     * @return string
     */
    protected function getDots()
    
        return $this->getDisabledTextWrapper('&hellip;');
    

【讨论】:

此自定义演示者位于您项目中的哪个文件夹中? @moraleida,位于 Composer 域下的任何文件夹中。你可以关注 prs0, psr4,... 只要确保你使用正确的命名空间来解决它

以上是关于Laravel 5 中的自定义分页视图的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Nova 中的自定义 Vue 组件

Laravel 5.5 的自定义验证对象/类

Laravel 5.6.7 和 Vue.js 中的自定义错误消息,尤其是组件

如何将控制器中的 Laravel 4.2 beforeFilter 转换为 Laravel 5.2 中的自定义中间件

Laravel 5.5 模型上的自定义软删除

我可以通过 Laravel 5.1 中的自定义请求对象验证后恢复输入字段值吗?