Laravel 5中的自定义分页视图

use*_*178 49 php pagination laravel-5

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'
Run Code Online (Sandbox Code Playgroud)

这至少在Laravel 5中已经消失了view.php.

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

Man*_*s D 112

Laravel 5.3+中使用

$users->links('view.name')
Run Code Online (Sandbox Code Playgroud)

Laravel 5.0 - 5.2而不是

$users->render()
Run Code Online (Sandbox Code Playgroud)

使用

@include('pagination.default', ['paginator' => $users])
Run Code Online (Sandbox Code Playgroud)

视图/分页/ 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
Run Code Online (Sandbox Code Playgroud)

而已.


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

视图/分页/ 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
Run Code Online (Sandbox Code Playgroud)

  • 如果有1000页,则列出所有页面.需要对其显示的页数进行限制. (8认同)
  • 救生员 - 在 5.4 文档页面中没有任何相关信息,但这非常有效 (2认同)

Joy*_*yal 30

对于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
Run Code Online (Sandbox Code Playgroud)

然后从主视图文件中调用此分页视图文件

{{ $posts->links('pagination.default') }}
Run Code Online (Sandbox Code Playgroud)

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

  • 你的是唯一的,不属于:"让我们以最令人讨厌和困难的方式做出简单的事情,只是为了证明我们的编码能力." ;)))和Laracast的Jeff Way似乎同意你...保持简单的人!!! (当在L5.3 +上时) (3认同)

Jav*_*olz 22

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

在您的路由代码中假设您有

$users = Users::paginate(15);
Run Code Online (Sandbox Code Playgroud)

在L4中,您曾经在视图中执行过类似的操作:

$users->appends(['sort' => 'votes'])->links();
Run Code Online (Sandbox Code Playgroud)

在L5中你做了:

$users->appends(['sort' => 'votes'])->render();
Run Code Online (Sandbox Code Playgroud)

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

或者,您可以扩展Laravel paginator(以便使用其分页逻辑),然后将现有的分页实例($users->...)传递给扩展类构造函数.这确实是我根据Laravel提供的Bootstrap演示者创建自定义Zurb Foundation演示者所做的.它使用所有Laravel分页逻辑,仅覆盖渲染方法.

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

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

我定制的分页主持人是:

<?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;');
    }
}
Run Code Online (Sandbox Code Playgroud)


use*_*178 13

而在Laravel 4.2中我会使用:

{{ $users->links('view.name') }}
Run Code Online (Sandbox Code Playgroud)

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

@include('view.name', ['object' => $users])
Run Code Online (Sandbox Code Playgroud)

现在,在包括视图,$object将有分页可用的方法,如currentPage(),lastPage(),perPage(),等.

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


Vik*_*edi 8

在看来工作类似的5.5 links()替换render()为。[官方DOC]

更换

{{ $replies->links() }}
Run Code Online (Sandbox Code Playgroud)

{{ $replies->render("pagination::default") }}
Run Code Online (Sandbox Code Playgroud)

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

artisan vendor:publish --tag=laravel-pagination
artisan vendor:publish
Run Code Online (Sandbox Code Playgroud)

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

  • {{ $replies->render("pagination::default") }}
  • {{ $replies->render("pagination::bootstrap-4") }}
  • {{ $replies->render("pagination::simple-bootstrap-4") }}
  • {{ $replies->render("pagination::semantic-ui") }}


Mor*_*eal 7

如果有人需要,Laravel 5附带一个Bootstrap 4分页器.

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

php artisan make:provider PaginationServiceProvider
Run Code Online (Sandbox Code Playgroud)

在该register方法中,将一个闭包传递给Laravel的paginator类,该类创建并返回新的presenter.

<?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);
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

在中注册新的提供商 config/app.php

'providers' => [
    //....
    App\Providers\PaginationServiceProvider::class,
]
Run Code Online (Sandbox Code Playgroud)

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

  • 自提交以来不再使用演示者:https://github.com/laravel/framework/commit/c8d1b189c581824b18b2ddec6a1d2c225871858b为了使其工作,请替换`Paginator :: presenter(function($ paginator){return new BootstrapFourPresenter($ paginator) ;} ;;与`Paginator :: $ defaultView ='pagination :: bootstrap-4'; Paginator :: $ defaultSimpleView ='pagination :: bootstrap-4';` (2认同)

Car*_*cce 5

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

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

用法示例:

 @include('pagination', ['paginator' => $users])
Run Code Online (Sandbox Code Playgroud)

要么

@include('pagination', ['paginator' => $users, 'interval' => 5])
Run Code Online (Sandbox Code Playgroud)

这是要点:https://gist.github.com/xxnoobmanxx/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
Run Code Online (Sandbox Code Playgroud)