Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
собственно есть массив коллекций. забиваю URL руками - все выводится как надо., НО как только жмякаю ларавелевскую кнопку пагинатора "2", например "показать результат следующей выборки"
то URL превращается в какуюто херню.. и как с этим бороться - не знаю.
или я где че попутал и не в ту степь пошел.. в общем:
сперва делаю следующее:
в рут добавляю свой параметр и передаю его ($page_id) в код ниже:
$comm -- коллекция массивов.
$paginate = 10;
$offset = ($page_id * $paginate) - $paginate;
$itemsForCurrentPage = array_slice($comm, $offset, $paginate, true);
$test = new\Illuminate\Pagination\LengthAwarePaginator($itemsForCurrentPage, count($comm), $paginate, $page_id);
сделал, как написано тут http://itsolutionstuff.com/post/laravel … ample.html
дефолтом пагинатор лары делает к урле, грубо говоря,
http://test.loc/&page=2
тогда как мне надо сайт/параметр/параметр/параметр/2
ок. меняю ларкин пейдж на свой
$test->setPageName($_SERVER['REQUEST_URI']);
тут же смотрю результат с 0
(сайт/параметр/параметр/параметр/0)
LengthAwarePaginator {#4263 ▼
#total: 38
#lastPage: 4
#items: Collection {#4228 ▼
#items: array:10 [▼
28 => test {#742 ▶}
29 => test {#2341 ▶}
30 => test {#2342 ▶}
31 => test {#2343 ▶}
32 => test {#2344 ▶}
33 => test {#2345 ▶}
34 => test {#2346 ▶}
35 => test {#2347 ▶}
36 => test {#2348 ▶}
37 => test {#2349 ▶}
]
}
#perPage: 10
#currentPage: 1
#path: "/"
#query: []
#fragment: null
#pageName: "/admin/param1/param2/param3/0"
}
выборка есть, "pageName" тоже то, что надо.
жмякаю ларавелевскую кнопку пагинатора "2" << 0 1 "2" 3 >>
и получаю:
http://test.loc/?%2Fadmin%2Fparam1%2Fparam2%2Fparam3%2F=2
откуда взялся "?" не понятно. "/" заменился на "3%2F"
и этож происходит после сабмита. и как такое обработать? я догадываюсь, что нужно сделать декодирование.. но как..
или, там, мож мидлварь както приляпать, что после дейсвтия чето проделать.. не знаю.
вот что говорит документация по ларке (пагинация по массиву)
https://laravel.ru/docs/v5/pagination#ручное
(неужели было сложно авторам добавить пару примеров... аж бомбит)
Изменено sam (06.12.2017 11:21:03)
Не в сети
Там в доке по ссылке в комментах написано переопределить метод url() чтобы он формировал нужный адрес
Изменено maximilianno (06.12.2017 11:49:36)
Не в сети
большое спасибо!
вот только хотел написать:
---
Нашел где косяк.
Ларкин пагинатор както сам смотрит УРЛУ и клеит к ней "?page=2" с номером нажатой кнопки.
а у меня он не видит урлы и клеит тоже "?page=2"
и получается я просто "page" заменил на "test1/test/2" и получил вместо правильной урлы, свою не вычисленную урлу + приклейка в которой перелопачены спец символы.. сайт/"?test1/test/2=2"
как и справляется пока не ясно..
------
Не в сети
В vendor/laravel/framework/src/Illuminate/Pagination/PaginationServiceProvider.php есть
Paginator::currentPathResolver(function () {
return $this->app['request']->url();
});
Этот ->url() определен в vendor/laravel/framework/src/Illuminate/Routing/RoutingServiceProvider.php
protected function registerUrlGenerator()
{
$this->app->singleton('url', function ($app) {
$routes = $app['router']->getRoutes();
// The URL generator needs the route collection that exists on the router.
// Keep in mind this is an object, so we're passing by references here
// and all the registered routes will be available to the generator.
$app->instance('routes', $routes);
$url = new UrlGenerator(
$routes, $app->rebinding(
'request', $this->requestRebinder()
)
);
$url->setSessionResolver(function () {
return $this->app['session'];
});
// If the route collection is "rebound", for example, when the routes stay
// cached for the application, we will need to rebind the routes on the
// URL generator instance so it has the latest version of the routes.
$app->rebinding('routes', function ($app, $routes) {
$app['url']->setRoutes($routes);
});
return $url;
});
}
а дальше сам смотри, я застрял
Не в сети
нет, по ссылке в комментариях стал делать, переопределил метод, url стал формироваться как надо, выборка данных тоже. но этот сам пагинатор к параметру, точнее к слову "page" в урле привязан. и если page=3 то он подсвечивает нажатой кнопку 3. если в урле изменить на pages или че хочешь, то все работает кроме отрисовки пагинатора.. и както не всегда даже корректно.. пока с этим разбираюсь
п.с. сперва на радостях переопределил этот
protected $pageName = 'page';
на ''. и ссылку получил что хотел, но отрисовка блин...
Изменено sam (06.12.2017 15:21:02)
Не в сети
Короче сделал и работает. но есть вопрос к спецам..
исходно в
abstract class AbstractPaginator implements Htmlable
...
protected $pageName = 'page';
если оставить как есть, то в урл попадает /page2 и не работает.
если прям там же беру и стираю
protected $pageName = '';
в урл попадает /2 и все работает. и выборка и скролинги и выбрана кнопка!...
если в своем созданном для переопределения классе Paginator
добавляю переопределение переменной
class Paginator extends \Illuminate\Pagination\LengthAwarePaginator
{
public function url($page)
{
protected $pageName = '';
if ($page < 0) {
$page = 0;
}
return
$this->pageName
.$page
.$this->buildFragment();
}
}
то пагинация начинает валиться с ошибками. то не скролится то еще че, т.к. ключ 'page' отсутствует, я так понял... а в урле он как строка. в общем не корректное поведение какое-то.
и как тут грамотно поступить я не знаю. это по идее, после обновления ларавеля, снова надо будет стирать значение в переменной?
------------------------
Код следующий:
в руте гета добавляем /{page?}
public function test (.... , $page = 0) {
// $comm - массив коллекций
$paginate = 10; // выводим по 10 записей
$offset = ($page * $paginate) - $paginate;
$itemsForCurrentPage = array_slice($comm, $offset, $paginate, true); // выборка 10 записей в зависимости от нажатой кнопки.
$paginate = new Paginator($itemsForCurrentPage, count($comm), $paginate, $page);
return в шаблон $paginate
}
в шаблоне
<div align="right"> {{--Пагинация--}}
{{ "Всего записей: " . $paginate->total() }}
{{ "Количество строк в таблице на странице: " . $paginate->count() }}<br/>
{{ "Номер текущей страницы: " . $paginate->currentPage() }}<br/>
{{ "номер последнего элемента: " . $paginate->lastItem() }}<br/>
{{ "номер последней страницы в пейджинге: " . $paginate->lastPage() }}<br/>
{{ "Номер следующей страницы за текущей: " . $paginate->nextPageUrl() }}<br/>
{{ "Шаг, видимо: " . $paginate->perPage() }}<br/>
{{ "Ссылка на предыдущую страницу: " . $paginate->previousPageUrl() }}<br/>
</div>
<div align="right">{{ $paginate->links() }}</div>
<br>
@foreach($paginate as $t)
{{ $t->name }}<br>
@endforeach
<br>
П.С.
получается этот
protected $pageName = 'page';
везде участвует, но когда доходит дело конца отработки кода, мне нужно этот page удалить из выхлопа результата. чтоб далее мой код корректно отработал. как такое делается?
__
всеравно както странно себя ведет пагинатор. походу его весь переписывать под себя надо..
например перейдя по линку, в котором прописано имя рута, рут открывается. наприимер:
"test/statya-1/open_read"
жму листание комментов под статьей, параметр передается не к "test/statya-1/open_read/2", а "test/statya-1/2".
если руками вобью и обновлю "test/statya-1/open_read/2", то дальше пагинатор работает как надо.
Изменено sam (08.12.2017 19:34:14)
Не в сети
Страницы 1