webentwicklung-frage-antwort-db.com.de

Anzahl der angezeigten Links begrenzen Laravel Seitennummerierung

Gibt es eine einfache Möglichkeit, zu begrenzen, wie viele Links mit der Pagode von Laravels angezeigt werden?

Derzeit werden maximal 13 Links angezeigt (Zurück, 1 2 3 4 5 7 8 .. 78 79 weiter).

Dies ist jedoch zu viel für mobile Geräte und wird zu einer zweizeiligen Navigation. Gibt es eine Möglichkeit, die Links auf z. nur 10 anzeigen?

Ich habe mit dem Paginierungs-Moderator herumgespielt, aber eigentlich schien nichts zu funktionieren.

Vielen Dank

16
Lovelock

Die alte Art, einen benutzerdefinierten Presenter zu definieren, funktioniert nicht mit Laravel 5.3+. Die Anzahl der angezeigten Links scheint im Parameter $onEachSide von Illuminate/Pagination/UrlWindow::make() fest zu codieren:

public static function make(PaginatorContract $paginator, $onEachSide = 3)

Am Ende habe ich nur meine eigene render () - Funktion geschrieben und dabei etwas Code von LengthAwarePaginator gestohlen.

/**
 * Stole come code from LengthAwarePaginator::render() and ::elements() to allow for a smaller UrlWindow
 *
 * @param LengthAwarePaginator $paginator
 * @param int $onEachSide
 * @return string
 */
public static function render(LengthAwarePaginator $paginator, $onEachSide = 2)
{
    $window = UrlWindow::make($paginator, $onEachSide);

    $elements = array_filter([
        $window['first'],
        is_array($window['slider']) ? '...' : null,
        $window['slider'],
        is_array($window['last']) ? '...' : null,
        $window['last'],
    ]);

    return LengthAwarePaginator::viewFactory()->make(LengthAwarePaginator::$defaultView, [
        'paginator' => $paginator,
        'elements' => $elements,
    ])->render();
}

}

Wir verwenden Twig, also habe ich dies als Twig-Filter registriert. Ich denke, etwas Ähnliches könnte für Blade gemacht werden.

1
barryp

Ich hatte einen neuen benutzerdefinierten Presenter erstellt, um nur 10 Links anzuzeigen. Es umfasst 3 Schritte:

Erstellen Sie Ihren eigenen Präsentator

use Illuminate\Pagination\BootstrapPresenter;

class CustomPresenter extends BootstrapPresenter{
    protected function getPageSlider()
    {
        // Changing the original value from 6 to 3 to reduce the link count
        $window = 3;

        // If the current page is very close to the beginning of the page range, we will
        // just render the beginning of the page range, followed by the last 2 of the
        // links in this list, since we will not have room to create a full slider.
        if ($this->currentPage <= $window)
        {
            $ending = $this->getFinish();

            return $this->getPageRange(1, $window + 2).$ending;
        }

        // If the current page is close to the ending of the page range we will just get
        // this first couple pages, followed by a larger window of these ending pages
        // since we're too close to the end of the list to create a full on slider.
        elseif ($this->currentPage >= $this->lastPage - $window)
        {
            $start = $this->lastPage - 8;

            $content = $this->getPageRange($start, $this->lastPage);

            return $this->getStart().$content;
        }

        // If we have enough room on both sides of the current page to build a slider we
        // will surround it with both the beginning and ending caps, with this window
        // of pages in the middle providing a Google style sliding paginator setup.
        else
        {
            $content = $this->getAdjacentRange();

            return $this->getStart().$content.$this->getFinish();
        }
    }

} 

Erstellen Sie Ihre eigene Paginierungsansicht (z. B. custom-paginator.php) und legen Sie sie in Ihrem Ordner views ab

<ul class="pagination">
    <?php echo with(new CustomPresenter($paginator))->render(); ?>
</ul>

Aktualisieren Sie Ihre app/config.view.php

'pagination' => 'custom-paginator',

Wenn Sie die folgenden Änderungen vornehmen, erhalten Sie einen Paginator mit 10 Links. 

Hoffe diese Hilfe: D

5
Zesky

Ich weiß, dass es eine alte Frage ist, aber es gibt immer noch keine Möglichkeit, die Parameter der Funktion links () einzustellen. Ich habe einfachen jQuery-Code erstellt, vielleicht hilft er jemandem. Das ist viel einfacher als die Antwort von Zesky. Ich meine nicht besser, nur einfacher :)

JavaScript:

(function($) {
    $('ul.pagination li.active')
        .prev().addClass('show-mobile')
        .prev().addClass('show-mobile');
    $('ul.pagination li.active')
        .next().addClass('show-mobile')
        .next().addClass('show-mobile');
    $('ul.pagination')
        .find('li:first-child, li:last-child, li.active')
        .addClass('show-mobile');
})(jQuery);

CSS:

@media (max-width: /* write what you need, for me it's 560px */) {
    ul.pagination li:not(.show-mobile) {
        display: none;
    }
}

Dieser Code macht nur wenige li-Elemente sichtbar. Aktiv, zwei vor, zwei nach, vorherige/nächste Pfeile. Das macht höchstens 7 sichtbare Elemente statt 15.

3
ElChupacabra

Für Laravel 5.6+

Lieferantenvorlage veröffentlichen:

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

Bearbeiten Sie bootstrap-4.blade.php wie folgt:

@if ($paginator->hasPages())
<ul class="pagination" role="navigation">
    {{-- Previous Page Link --}}
    @if ($paginator->onFirstPage())
        <li class="page-item disabled" aria-disabled="true" aria-label="@lang('pagination.previous')">
            <span class="page-link" aria-hidden="true">&lsaquo;</span>
        </li>
    @else
        <li class="page-item">
            <a class="page-link" href="{{ $paginator->previousPageUrl() }}" rel="prev" aria-label="@lang('pagination.previous')">&lsaquo;</a>
        </li>
    @endif

    <?php
        $start = $paginator->currentPage() - 2; // show 3 pagination links before current
        $end = $paginator->currentPage() + 2; // show 3 pagination links after current
        if($start < 1) {
            $start = 1; // reset start to 1
            $end += 1;
        } 
        if($end >= $paginator->lastPage() ) $end = $paginator->lastPage(); // reset end to last page
    ?>

    @if($start > 1)
        <li class="page-item">
            <a class="page-link" href="{{ $paginator->url(1) }}">{{1}}</a>
        </li>
        @if($paginator->currentPage() != 4)
            {{-- "Three Dots" Separator --}}
            <li class="page-item disabled" aria-disabled="true"><span class="page-link">...</span></li>
        @endif
    @endif
        @for ($i = $start; $i <= $end; $i++)
            <li class="page-item {{ ($paginator->currentPage() == $i) ? ' active' : '' }}">
                <a class="page-link" href="{{ $paginator->url($i) }}">{{$i}}</a>
            </li>
        @endfor
    @if($end < $paginator->lastPage())
        @if($paginator->currentPage() + 3 != $paginator->lastPage())
            {{-- "Three Dots" Separator --}}
            <li class="page-item disabled" aria-disabled="true"><span class="page-link">...</span></li>
        @endif
        <li class="page-item">
            <a class="page-link" href="{{ $paginator->url($paginator->lastPage()) }}">{{$paginator->lastPage()}}</a>
        </li>
    @endif

    {{-- Next Page Link --}}
    @if ($paginator->hasMorePages())
        <li class="page-item">
            <a class="page-link" href="{{ $paginator->nextPageUrl() }}" rel="next" aria-label="@lang('pagination.next')">&rsaquo;</a>
        </li>
    @else
        <li class="page-item disabled" aria-disabled="true" aria-label="@lang('pagination.next')">
            <span class="page-link" aria-hidden="true">&rsaquo;</span>
        </li>
    @endif
</ul>
@endif

In diesem Beispiel werden neue CSS-Klassen, aktive Verknüpfungen, drei Punkte (richtig, nicht 1..2 3 4) korrekt behandelt und können angepasst werden (Anzahl der Seiten, die Sie anzeigen möchten).

Beispiel

Drei Punkte richtig behandelt

2

Es gibt viele Wege, um darauf einzugehen, je nachdem, wie genau Sie sich verhalten sollen.

Für meine Bedürfnisse wollte ich eine schnelle Lösung, um es zu verkürzen, damit meine mobilen Layouts nicht beschädigt werden.

Laravel 5.3

Bearbeiten Sie diese Datei: (oder die, die Sie in Ihren Paginator-Aufrufen verwenden)

/vendor/pagination/bootstrap-4.blade.php

Ich füge eine einzelne Zeile hinzu, um die Link-Rendering-Schleife nach 2 Links zu durchbrechen.

{{-- Array Of Links --}}
    @if (is_array($element))
        @foreach ($element as $page => $url)
             @if ($page == $paginator->currentPage())
                 <li class="page-item active"><span class="page-link">{{ $page }}</span></li>
              @else
                  <li class="page-item"><a class="page-link" href="{{ $url }}">{{ $page }}</a></li>
                  {{--Add the line below to limit rendered links--}}
                  <?php if($loop->count > 2) break; ?>
              @endif
         @endforeach
     @endif
2
JR Lawhorne

Ich habe css verwendet, um die erlaubten Links einzuschränken. Wirklich einfach .. Kann erweitert werden, um eine beliebige Anzahl von Seiten an beliebig vielen Haltepunkten anzuzeigen

@media screen and ( max-width: 400px ){

    li.page-item {

        display: none;
    }

    .page-item:first-child,
    .page-item:nth-child( 2 ),
    .page-item:nth-last-child( 2 ),
    .page-item:last-child,
    .page-item.active,
    .page-item.disabled {

        display: block;
    }
}

diese spezielle Implementierung erlaubt die Pfeile, die '...', die erste Seite, die aktive Seite und die letzte Seite

1
Tyler Johnson

Jetzt hat Laravel 5.7 eine neue Paginierungsmethode, um die Anzahl der Links auf jeder Seite des Paginators anzupassen. Dank der neuen Methode benötigen Sie in manchen Fällen keine benutzerdefinierte Paginierungsansicht mehr. Hier ist die API, mit der Sie die Link-Anzahl auf jeder Seite der aktuellen Seite definieren können:

User::paginate(10)->onEachSide(2);

schreiben Sie diesen Code auf Ihren Controller.

weitere Informationen finden Sie unter https://laravel-news.com/laravel-5-7-pagination-link-customizations

1
Abid Khairy

Mein Tisch war zu eng, also habe ich beschlossen, nur den ersten und den letzten li (Die nächsten und hinteren Pfeile) der Paginierung mit jQuery filter () anzuzeigen. Sie können dies weiter anpassen.

$('ul.pagination li').hide().filter(':lt(1), :nth-last-child(1)').show();

Stellen Sie sicher, dass Sie es vor dem Ende des Body-Tags hinzufügen.

1
Waqas Bukhary

Erstellen Sie eine Datei default.blade.php im neuen Seitenordner im Ansichtsordner mit dem folgenden Code. Das heißt, Sie haben die Kern-Paginierungsdatei mit unserer neuen Paginierungsdatei überschrieben. Dies wird ein gewisses Limit für den Seitenumbruch setzen.

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

        @if($paginator->currentPage() > 3)
            <li class="hidden-xs"><a href="{{ $paginator->url(1) }}">1</a></li>
        @endif
        @if($paginator->currentPage() > 4)
            <li><span>...</span></li>
        @endif
        @foreach(range(1, $paginator->lastPage()) as $i)
            @if($i >= $paginator->currentPage() - 2 && $i <= $paginator->currentPage() + 2)
                @if ($i == $paginator->currentPage())
                    <li class="active"><span>{{ $i }}</span></li>
                @else
                    <li><a href="{{ $paginator->url($i) }}">{{ $i }}</a></li>
                @endif
            @endif
        @endforeach
        @if($paginator->currentPage() < $paginator->lastPage() - 3)
            <li><span>...</span></li>
        @endif
        @if($paginator->currentPage() < $paginator->lastPage() - 2)
            <li class="hidden-xs"><a href="{{ $paginator->url($paginator->lastPage()) }}">{{ $paginator->lastPage() }}</a></li>
        @endif

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

Wenn Sie dann die Paginierung erhalten möchten, müssen Sie die Laravel-Paginierungsfunktion mit diesem Parameter für die Ansichtsdatei aufrufen. 

 $data->links('pagination.default')
1
Bhavin Thummar

Es ist eine alte Frage, aber ich dachte, ich würde gerne sagen, wie ich kürzlich die Reduzierung der Anzahl von Seitenumbrüchen in einer Laravel 5.2 Anwendung erreicht habe:

In Ihrer ViewServiceProvider:

 \Illuminate\Pagination\AbstractPaginator::presenter(function($paginator) {
      return new \App\Pagination\BootstrapPresenter($paginator);
 });

App\Pagination\BootstrapPresenter.php

<?php namespace App\Pagination;

use Illuminate\Pagination\UrlWindow;
use Illuminate\Contracts\Pagination\Paginator as PaginatorContract;
use Illuminate\Pagination\BootstrapThreePresenter as LaravelBootstrapThreePresenter;

class BootstrapPresenter extends LaravelBootstrapThreePresenter
{
    /**
     * Create a new Bootstrap presenter instance.
     *
     * @param  \Illuminate\Contracts\Pagination\Paginator  $paginator
     * @param  \Illuminate\Pagination\UrlWindow|null  $window
     * @return void
     */
    public function __construct(PaginatorContract $paginator, UrlWindow $window = null)
    {
        $this->paginator = $paginator;

        // Make the pagination window smaller (default is 3).
        $this->window = UrlWindow::make($paginator, 1);
    }
}

Von:

 enter image description here

Zu:

 enter image description here

1
Gary Green

Dies ist eine ältere Frage, aber keine der Antworten ist mit der neuesten Laravel -Dokumentation auf dem neuesten Stand. Für neuere Versionen von Laravel (Laravel 5.6+) gibt es eine etwas einfache Lösung für dieses Problem. Es ist jedoch erforderlich, die Seiten der Anbieter-Paginierung zu veröffentlichen, wie in Laravel Documentation . Vorausgesetzt, Sie haben die Standard-Seitenumbruchansicht noch nicht veröffentlicht oder geändert, lautet der ausgeführte Befehl:

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

Sobald die Ansichten veröffentlicht sind, finden Sie bootstrap-4.blade.php im Verzeichnis resources/views/vendor/pagination. Sie können diese Datei bearbeiten und die Paginierungslinks beliebig anzeigen lassen. Um die Anzahl der standardmäßig angezeigten Links zu reduzieren, habe ich einfach ein wenig Inline-PHP verwendet, um einen Index festzulegen und die Anzahl der anzuzeigenden Links zu begrenzen, wie unten gezeigt:

{{-- Array Of Links --}}
@if (is_array($element))
    <?php $index = 0; ?>
    @foreach ($element as $page => $url)
        @if($index<4)
            @if ($page == $paginator->currentPage())
                <li class="page-item active" aria-current="page"><span class="page-link">{{ $page }}</span></li>
            @else
                <li class="page-item"><a class="page-link" href="{{ $url }}">{{ $page }}</a></li>
            @endif
        @endif
        <?php $index++ ?>
    @endforeach
@endif

Der größte Teil dieses Codes befindet sich in der Standard-Blade-Ansicht für bootstrap-4.blade.php, aber ich habe $ index = 0, $ index <4, $ index ++ zu LIMIT der Anzahl der Links auf der linken Seite des Paginators hinzugefügt 4.

Dies ist der richtige Weg, um dieses Problem gemäß der Laravel -Dokumentation zu behandeln, ohne die Dateien der Composer-Hersteller zu bearbeiten oder zu versuchen, das System auf andere Weise zu hacken. Mir ist klar, dass JR Lawhorne eine ähnliche Antwort gepostet hat, aber dies umfasst nicht den gesamten Prozess der Veröffentlichung der Lieferantendatei, bevor sie veröffentlicht wird. Hoffe das hilft anderen.

1
eResourcesInc