Как сделать пагинацию laravel

Обновлено: 07.07.2024

Фреймворк Laravel 4.2 имеет возможность указать пользовательский вид в app/config/view.php` таких как:

Это пошло в фреймворк Laravel 5 по крайней мере в отношении view.php .

Есть ли способ, чтобы повторить это поведение в фреймворк Laravel 5?

В фреймворк Laravel 5.3+ использование

В фреймворк Laravel 5.0 - 5.2 вместо

Если у вас много страниц, используйте данный шаблон:

За что Laravel 5.3 (и может быть в другой 5.X версий) пользовательских код пагинации в просмотре папок.

затем вызвать этот файл пагинации из главном окне файл как

Однако обновление pagination/default.blade.php вы хотите

Он работает в 6.х версий, а также.

В фреймворк Laravel 5 пользовательских страниц основана на ведущие (классов), а не мнениями.

Предполагая, что в вашем направляется код у вас есть

В Л4 вы привыкли делать что-то подобное в ваших представлениях:

В Л5 вы вместо этого:

В рендер() метод принимает загорается\контракты\разбивка\ведущий экземпляр. Вы можете создать пользовательский класс, который реализует этот контракт и передать его рендер() метод. Обратите внимание, что телеведущего является интерфейс, а не класс, поэтому вы должны реализации, а не распространяется он. Что's, почему вы получаете ошибку.

Кроме того, вы можете расширить фреймворк Laravel пагинатор (для того, чтобы использовать его пагинация логика), а затем передать существующую нумерацию страниц экземпляра ( $пользователи->. ) вам расширенный конструктор класса. Это действительно то, что я сделал для создания пользовательского Zurb Фонд ведущий на основе Bootstrap телеведущий, предусмотренных фреймворк Laravel. Он использует все что Laravel пагинации логика и только переопределяет методы рендеринга.

С моей нестандартной телеведущий мои взгляды выглядят так:

И мои индивидуальные пагинации ведущий:

В то время как в фреймворк Laravel 4.2 я хотел бы использовать:

В фреймворк Laravel 5 Вы можете воспроизвести выше следующим:

Теперь в комплекте красивый вид, $объект будет иметь нумерацию методов, таких как currentPage() , lastPage() , perPage ()` и т. д.

В 5.5 ссылки () "заменен на" рендер () , который, кажется, работает точно так же. [Официальную\док]

Следующие команды будут генерировать шаблон пагинации в ресурсы/вид/поставщик/пагинация

В любом виде файл (лезвие файлы) вы можете использовать эти шаблоны как следующий пример:

  • визуализации("в пагинации::по умолчанию", у) >>
  • визуализации("в пагинации::загрузочный-4", у) >>
  • отрисовки("в пагинации::простой-прихлоп-4", у) >>
  • отрисовки("в пагинации::семантико-интерфейс", у) >>

Что Laravel 5 кораблей с предзагрузка 4 пагинатор если кому-нибудь нужно.

Сначала создайте нового поставщика услуг.

В зарегистрироваться способ передать застежкой на фреймворк Laravel'S-класса пагинатор, который создает и возвращает новый ведущий.

Зарегистрировать новый провайдер в config/app.php`

Может быть, это слишком поздно, но я хотел бы поделиться еще один настраиваемый шаблон разбиения на страницы я сделал, что создает первого и последнего/предыдущей ссылки. Он также скрывает ссылки, когда пользователь находится в первой/последней странице уже.

(Опционально) вы также можете определить интервал ссылок (количество ссылок до и после текущей страницы)

Просто разместите ниже скрипт в вашу страницу:

Преимущества: экономит ЦП сервера, не требует корректировки в свое приложение.

Что Laravel 5.2 использует ведущие к этому. Вы можете создавать пользовательские ведущие или использовать предустановленные. Что Laravel 5.2 использует BootstrapThreePrensenter из-из-коробки, но это's легко использовать BootstrapFroutPresenter или любой другой изготовленный на заказ докладчики по этому вопросу.

В шаблоне лезвия, вы можете использовать следующую формулу:

Для создания пользовательских докладчики рекомендую смотреть [Codecourse's видео][1] об этом.

если вы хотите украсить внешний вид пагинации, я использую класс из начальной загрузки, чтобы сделать его более простым и легким

Моя модель используется вставить метод БД например, как следующие:

Позвольте'ы начать. нумеровать() метод помещенные внутри \осветить\базы данных\запросы\строителя и возвращает включение\страниц\LengthAwarePaginator объекта. LengthAwarePaginator расширяет включение\страниц\AbstractPaginator, который ссылка на государственную функцию($страница) метод, который должен быть продлен:

Пошаговое руководство (часть информации я взял из это Хорошая статья):

  1. Создать расширенный папку в приложения каталог.
  2. В расширенный папку создать 3 файла CustomConnection.php, CustomLengthAwarePaginator.php, CustomQueryBuilder.php:

Файл 2.1 CustomConnection.php :

Файл 2.2 CustomLengthAwarePaginator.php - этот файл содержит основную часть информации, которую нужно overwrited:

Файл 2.3 CustomQueryBuilder.php :

// закомментируйте эту строку // осветить\базы данных\DatabaseServiceProvider::класс

// и вместо того, чтобы добавить: Приложение\поставщиков\CustomDatabaseServiceProvider::класс

  1. В ваш контроллер (или другое место, где вы получаете данные с разбивкой на страницы из БД) нужно менять нумерацию страниц'параметры s:
  1. Добавьте ссылки пагинации в вашем представлении (/resources/views/your-controller/your-blade-file.blade.php), как следующие:

Наслаждайтесь! :) Ваши пользовательские разбиение на страницы должно работать теперь

Здесь's один на фреймворк Laravel 5, загрузочный 4 и без синтаксиса лезвия (для тех, кто найти его бесконечно труднее читать).

Где частичными/разбиение на страницы-это файл шаблона лезвие с ниже содержание вклеенными.

рядом с ответом @MantasD я хотел бы предложить комплексные индивидуальные фреймворк Laravel пагинации. Предполагая, что используя фреймворк Laravel 5.2 и включить в нее следующие вид:

Особенности

  • Показывает предыдущий и следующий кнопки и отключить их, когда не применяется
  • Показываю первый и последний значок, только если предыдущая и Следующая страница не делают то же
  • Создавать относительные ссылки, например: (10, 100, 500 .. и т. д.) вместо ограничения страницах
  • Показывает результат от X до y каждой страницы, используя вспомогательную функцию.

default.blade.php

Функция PaginationStartEnd

Вы можете использовать и настраивать это больше, как вы хотите.

Примечание: $пейджер->подкачки является переменной равно 0, объявленных в действие контроллера

Привет это мой код для пагинации: использовать в лезвие @включить('разбиение на страницы.по умолчанию', ['пагинатор' => $пользователи])

Я использую этот код с тема К7 и использовать этот код в своей причине в классе. Вы также можете использовать этот код в вашу тему и ваш класс, как вам нужно..

пытаться сделать это.

В Фреймворк Laravel 5.4

Самый простой способ я нашел, экспортируя их в каталог ресурсов/вид/поставщика с использованием поставщика:издавать команды

в PHP ремесленника поставщик:публикации --тег=что Laravel-пагинация

и чем перейти к resources\views\vendor\pagination\default.blade.php

и сделать все настройки там.

Полная документация обо всем этом можно прочитать здесь

Благодаря MantisD'ы пост для Bootstrap 4 это красиво работал.

Если вы хотите изменить номер страницы в URL, вместо того, чтобы получить данные, такие как /pageNo. экс: /2. вы можете использовать jQuery, чтобы изменить URL-адрес . У меня есть некоторые данные в метод GET с URL.

Вот простое решение индивидуальных фреймворк Laravel пагинации как серверный, так и клиентский код включен.

Предполагая, что используя фреймворк Laravel 5.2 и включить в нее следующие вид:

@включить('разбиение на страницы.по умолчанию', ['пейджер' => $данные])

Особенности

  • Показывает предыдущий и следующий кнопки и отключить их, когда не применимы.
  • Показывает первую и последнюю страницу кнопками.
  • Пример: ( Предыдущий|Первый|. |10|11|12|13|14|15|16|17|18|. |Последний|Следующий )

default.blade.php `` @если ($пагинатор->last_page > 1) Предыдущие

@если ( $пагинатор->current_page > 5 ) . @за endif

@Для ($я = 1; $я &л;= $пагинатор->last_page; $я++) @если ( ($я > ($пагинатор->current_page - 5)) и усилитель; & ($я &л; ($пагинатор->current_page + 5)) ) > @за endif @конецза

@если ( $пагинатор->current_page last_page - 4) ) . @за endif

Далее @за endif `` Сбоку Функция Контроллера-Сервера

`` getVendors государственную функцию (запрос $запроса) < $входов = $запрос->за исключением('фишку'); $perPage = (использования isset($входов['per_page']) и усилитель; & $входов['per_page'] и gt;0)?$входы['per_page']:$это->perPage; $currentPage = (использования isset($входов['страницы']) и усилитель; & $входов['страницы'] и gt;0)?$входы['страницы']:$Это->В разделе; $slice_init = ($currentPage == 1)?0:(($currentPage*$perPage)-$perPage);

$totalVendors = ДБ::настольный('client_broker') ->где('client_broker_type_id', [1, 2]) ->где('поле status_id которых содержит значение', '1') ->whereNotNull('client_broker_company_name') ->whereNotNull('client_broker_email')

  • и GT;выберите('client_broker_id', 'client_broker_company_name','client_broker_email') ->отчетливый() ->количество();

$поставщикам = ДБ::настольный('client_broker') ->где('client_broker_type_id', [1, 2]) ->где('поле status_id которых содержит значение', '1') ->whereNotNull('client_broker_company_name') ->whereNotNull('client_broker_email')

  • и GT;выберите('client_broker_id', 'client_broker_company_name','client_broker_email') ->отчетливый() ->пропустить($slice_init) ->принимают($perPage) ->получить();

$поставщикам = новый LengthAwarePaginator($поставщиками, $totalVendors, $perPage, $currentPage);

Всем привет. В прошлом уроке мы рассмотрели пример простой пагинации, которая отлично работает при относительно небольшом количестве записей. Если же их становится много, мы столкнемся с проблемами.

Чтобы не делать всё с нуля я предлагаю доработать пагинацию, реализованную в прошлом уроке. Стяните проект с гитхаба и сделайте чекаут на вот этот коммит.

Чтобы обозначить проблемы, давайте напишем скрипт, который добавит в нашу базу 1 млн статей.

Запускаем его командой:


Как видим, у нас появилось довольно большое число страниц, которое просто разрывает наш шаблончик. Не знаю как у вас, а у меня вкладка в браузере просто-напросто зависла.

Давайте сделаем пагинацию в стиле туда-сюда. Для этого в экшене \MyProject\Controllers\MainController::page() передадим в шаблон 2 ссылки на предыдущую и следующую страницы.

А в шаблоне выведем эти ссылки.

Любуемся аккуратным пагинатором.


Давайте теперь посмотрим на время генерации страницы. Для этого обернем код в index.php в следующие строки:

Обновим первую страницу блога. У меня время генерации заняло 0.258032 секунды.


Давайте посмотрим, какие запросы у нас выполняются во время загрузки страницы. Для этого в коде \MyProject\Services\Db::query добавим var_dump:

Обновим страничку и увидим, что у нас выполнилось 2 запроса:


Так как при загрузке первой страницы запрос:

остаётся неизменным, мы понимаем, что в случае последней страницы работу существенно замедляет второй запрос:

В случае загрузки первой страницы он будет выглядеть следующим образом:

Давайте сделаем ANALYZE (я использую mariadb, для mysql будет EXPLAIN ANALYZE) для обоих запросов.


Как видим, в случае первой страницы базке пришлось пройти 5 строк (r_rows), а в случае последней страницы 1000000 строк! Дело в том, что OFFSET N работает таким образом, что он вычитывает строки, подходящие под условие запроса до тех пор, пока не дойдёт до N-ой строки. Всё что до N будет пропущено, а далее будут выгружены строки после N-ой, до необходимого значения LIMIT. То есть, к примеру, в нашем случае при получении 200й страницы блога база будет прогонять при запросе следующие строки:


Как мы можем получить следующие 5 записей, чтобы сформировать следующую страницу?
Зная, что текущая страница заканчивается на нам можно получить следующие 5 записей, сформировав следующий запрос:


Как видим, результаты выполнения запросов совпадают. Однако, время их выполнения существенно отличается. Давайте проанализируем запрос.


Как мы видим, теперь базе пришлось считать всего 5 строк из таблицы. Это произошло благодаря использованию индекса по полю id. Мы просто отфильтровали ненужные нам строки и начиная с нужной получили первые 5.
Теперь давайте напишем запрос, который позволит получить записи с предыдущей страницы. Для этого нам нужно получить 5 статей, которые идут до первой статьи на текущей странице. В нашем случае это записи с id > 10:



Как видим, запрос тоже выполнился быстро. Давайте проанализируем и его.

Видим r_rows = 5, всё в порядке.
Однако, как вы могли заметить, записи отсортированы не в том порядке, в котором они должны выдаваться в блоге. Давайте исправим это.


Теперь всё в порядке. Это можно сделать и средствами PHP, вызвав функцию array_reverse() после получения результатов из базы. Как вы это сделаете – не так важно, это дешевая операция, относительно той, что была, когда мы работали через OFFSET.

Что-ж, остаётся только запрограммировать логику. Вместо url-ов вида myproject.loc/777 нам нужно сделать 2 поддерживаемых урла типа:

  • myproject.loc/before/777
  • myproject.loc/after/777

для получения страницы статей до и после соответственно.

Добавляем в контроллер 2 новых экшена:

и соответствующие им роуты:

Добавим в сущность статьи метод для получения статей для страницы до заданного id:

И аналогичный метод для получения статей после заданного id:

Помимо этого, нам также понадобятся ещё 2 метода, которые позволят узнать, есть ли после какого-то (или до какого-то) id ещё записи. Это потребуется, чтобы узнать, есть ли следующая или предыдущая страница, чтобы нарисовать ссылки.

Осталось написать логику в экшенах контроллера.


Обратите внимание на время генерации страницы. 0.017035 секунды! То есть произошло ускорение в 1,045724/0,017035 = 61,4 раза! Согласитесь, неплохо!

И дополним наш контроллер:


Код, расположенный в сущности Article легко выносится в класс ActiveRecordEntity, и масштабируется на все другие возможные модели.

А, ну и кстати, осталась ещё пара мест, где можно сэкономить. Во-первых, если мы знаем (а мы знаем), что id статей начинается с 1, то можно избавиться от лишнего похода в базу при проверке наличия следующей страницы:

А ещё можно закешировать id последней добавленной статьи, и избежать еще одного запроса в базу. Я сделал файловый кеш прямо в контроллере. Так делать не надо :) Это просто для быстрой демонстрации. Выносите такое куда-нибудь на уровень доменного сервиса. Там же при добавлении новых статей сбрасывайте/обновляйте кеш.

После этого остаётся единственный запрос в базу, а время генерации страницы уменьшается до 0.005457 секунды.

Laravel 5.5 ЧПУ ссылка в пагинации

Как я сделал средствами Laravel красивые ссылки при пагинации.

История началась с того, что на просторах русско-язычного интернета я не смог найти рабочую схему создания средствами самого Laravel красивые ссылки при пагинации. В английском не силён, но всё таки с переводчиком кое как смог преодолеть этот казалось бы простой шаг.

Странно, что такая казалось бы актуальная ситуация не реализована в таком мощном фреймворке, как Laravel на более доступном уровне.

Собственно к делу.

Такая была задача: сайт старый, в нем много ссылок такого вида:

Но по умолчанию Laravel прописывает адреса так

что меня не устраивало.

Первое что я сделал - прописал маршрут таким образом

Вроде бы все ок, переменная page есть, но Laravel не подхватывал ее, а использовал свою.

Далее, в контроллере я заменяю стандартную конструкцию пагинатора

Здесь я явно указываю пагинатору работать с моей пользовательской переменной page вместо его стандартной зашитой глубоко в кишках фреймворка.

Собственно на этом этапе Laravel прекрасно понимает ссылки вида

что мне собственно и нужно было.

Но все равно в конце ссылки он подставляет свои ненавистные мне

Следующий этап, с помощью консоли и вот такой команды

переместил стандартные шалоны пагинации Laravel в директорию

Теперь шаблон доступен для свободного редактирования. В папке 4 файла, нужный мне называется

Привожу мой отредактированный вид шаблона пагинатора, все изменения подчеркнуты

Если сравнить этот файл с оригиналом легко можно понять суть переделки.

С помощью регулярок я просто вычистил все мне мешающее в ссылках, а со страницы номер 1 удалил page совсем. Здесь ничего сложного, есть только php код, но его одна строка, где простой массив с паттернами. Можно конечно было передать его в параметрах вот таким образом

Но я посчитал это несущественным.

Повторюсь, это мой путь, скорее всего он не совсем верный. Возможно есть более элегантное решение, если кто знает поделитесь, буду очень признателен.

Существует проблема генерации двух типичных страниц: /job и /job?page=1 две страницы имеют одинаковое содержимое.

Я хочу сделать все, что удаляет строку запроса page с первой страницы пагинации.

Я попробовал следующее:

Но это повреждает разбиение на страницы, то есть ссылки страниц загружаются неправильно, и значение строки запроса остается для всех страниц.

Ответы - Как удалить страницу строки запроса с первой страницы разбиения на страницы laravel? / How to remove query string page from the first page of laravel pagination?

kai ogita

добавьте канонический тег, если вам не все равно SEO

- понятия не имею.

$нумерация страниц идентификатор запроса GET или класс себе

Ahmad Yousef

В ваших маршрутах дайте имя маршруту, который ведет к вашей функции:

Затем, в вашей функции в контроллере, используйте это:

AddWeb Solution Pvt Ltd

Я думаю, вы можете попробовать это:

Надеюсь, что это сработает для вас!

SaidbakR

Эффективное решение этой проблемы, которое я нашел, заключается в редактировании шаблона разбиенияна страницы .

Сначала опубликуйте шаблон разбиения на страницы от поставщиков, используя следующую команду из корневого каталога проекта:

Теперь должен быть найден файл по адресу resources/views/vendor/pagination/default.blade.php , и его можно отредактировать следующим образом, используя str_replace() для URL-адресов каждой страницы и кнопки обратной навигации:

Обновление:

Ошибка была найдена с ?page=10 , поэтому вместо использования str_replace мы должны использовать preg_replace следующим образом:

Обновление 2:

В случае использования любого настроенного имени для параметра номера страницы, отличного от page , мы могли бы использовать геттер paginator для свойства $pageName, как показано ниже в шаблоне разбиения на страницы:

Читайте также: