Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 05.12.2017 19:43:13

Пагинация массива Ларавелем

собственно есть массив коллекций. забиваю 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)

Не в сети

#2 06.12.2017 11:38:02

Re: Пагинация массива Ларавелем

Там в доке по ссылке в комментах написано переопределить метод url() чтобы он формировал нужный адрес

Изменено maximilianno (06.12.2017 11:49:36)

Не в сети

#3 06.12.2017 12:01:26

Re: Пагинация массива Ларавелем

большое спасибо!

вот только хотел написать:
---
Нашел где косяк.

Ларкин пагинатор както сам смотрит УРЛУ и клеит к ней   "?page=2"   с номером нажатой кнопки.
а у меня он не видит урлы и клеит тоже "?page=2"
и получается я просто "page" заменил на "test1/test/2"  и получил вместо правильной урлы, свою не вычисленную урлу + приклейка в которой перелопачены спец символы..  сайт/"?test1/test/2=2"

как и справляется пока не ясно..
------

Не в сети

#4 06.12.2017 12:16:37

Re: Пагинация массива Ларавелем

В 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;
        });
    }

а дальше сам смотри, я застрял

Не в сети

#5 06.12.2017 15:18:17

Re: Пагинация массива Ларавелем

нет, по ссылке в комментариях стал делать, переопределил метод, url стал формироваться как надо, выборка данных тоже. но этот сам пагинатор к параметру, точнее к слову "page" в урле привязан. и если page=3 то он подсвечивает нажатой кнопку 3. если в урле изменить на pages или че хочешь, то все работает кроме отрисовки пагинатора.. и както не всегда даже корректно.. пока с этим разбираюсь
п.с. сперва на радостях переопределил этот

protected $pageName = 'page';

на ''. и ссылку получил что хотел, но отрисовка блин...

Изменено sam (06.12.2017 15:21:02)

Не в сети

#6 06.12.2017 17:06:42

Re: Пагинация массива Ларавелем

Короче сделал и работает. но есть вопрос к спецам..


исходно в

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)

Не в сети

Подвал раздела