Помощь с Pagination

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
cooper.baggi
Сообщения: 63
Зарегистрирован: 2012.10.31, 12:37

Помощь с Pagination

Сообщение cooper.baggi »

Доброго времени суток.
Ув. форумчане подскажите как заставить работать pagination через POST а не GET запрос

Код: Выделить всё

\yii\widgets\LinkPager::widget(['pagination' => $pages,]);
Заранее спасибо.
andrei.obuhovski
Сообщения: 610
Зарегистрирован: 2015.07.16, 10:50

Re: Помощь с Pagination

Сообщение andrei.obuhovski »

попробуй:

Код: Выделить всё

'linkOptions' => ['data-method' => 'post']
cooper.baggi
Сообщения: 63
Зарегистрирован: 2012.10.31, 12:37

Re: Помощь с Pagination

Сообщение cooper.baggi »

andrei.obuhovski писал(а):попробуй:

Код: Выделить всё

'linkOptions' => ['data-method' => 'post']
после добавления изменилась только ссылка, добавилось data-method="post", так же через GET отправляет
Аватара пользователя
irpsv
Сообщения: 65
Зарегистрирован: 2015.07.07, 18:03
Контактная информация:

Re: Помощь с Pagination

Сообщение irpsv »

cooper.baggi писал(а):Доброго времени суток.
Ув. форумчане подскажите как заставить работать pagination через POST а не GET запрос

Код: Выделить всё

\yii\widgets\LinkPager::widget(['pagination' => $pages,]); 
Заранее спасибо.
Надо переопределить Paginator вот здесь:

https://github.com/yiisoft/yii2/blob/ma ... n.php#L263
...то что мы не понимаем, делает нас тупее...
cooper.baggi
Сообщения: 63
Зарегистрирован: 2012.10.31, 12:37

Re: Помощь с Pagination

Сообщение cooper.baggi »

irpsv писал(а):
cooper.baggi писал(а):Доброго времени суток.
Ув. форумчане подскажите как заставить работать pagination через POST а не GET запрос

Код: Выделить всё

\yii\widgets\LinkPager::widget(['pagination' => $pages,]); 
Заранее спасибо.
Надо переопределить Paginator вот здесь:

https://github.com/yiisoft/yii2/blob/ma ... n.php#L263
Я так понял он все пагинаторы переопределит?
Мне просто не одном месте необходимо. Данные подгружаются и на них пагинация нужна
Аватара пользователя
irpsv
Сообщения: 65
Зарегистрирован: 2015.07.07, 18:03
Контактная информация:

Re: Помощь с Pagination

Сообщение irpsv »

cooper.baggi писал(а): Я так понял он все пагинаторы переопределит?
Мне просто не одном месте необходимо. Данные подгружаются и на них пагинация нужна
Ну по идее вам нужно создать свой пагинатор, где вы переопределите данный метод и потом уже где надо его подключать:

Код: Выделить всё

\yii\widgets\LinkPager::widget(['pagination' => new app\ext\UserPagination($config)]); 
---

А сам класс будет выглядеть примерно так:

Код: Выделить всё

class UserPagination extends \yii\data\Pagination {
    public function createUrl($page, $pageSize = null, $absolute = false)
    {
        $this->params = $_POST;
        return parent::createUrl($page,$pageSize,$absolute);
    }

    protected function getQueryParam($name, $defaultValue = null)
    {
        $this->params = $_POST;
        return parent::getQueryParam($name,$defaultValue);
    }
}
Ну естественно вместо $_POST инициализация параметров (хотя по сути и так сойдет).
Последний раз редактировалось irpsv 2015.09.25, 10:27, всего редактировалось 1 раз.
...то что мы не понимаем, делает нас тупее...
andrei.obuhovski
Сообщения: 610
Зарегистрирован: 2015.07.16, 10:50

Re: Помощь с Pagination

Сообщение andrei.obuhovski »

cooper.baggi писал(а):
andrei.obuhovski писал(а):попробуй:

Код: Выделить всё

'linkOptions' => ['data-method' => 'post']
 
после добавления изменилась только ссылка, добавилось data-method="post", так же через GET отправляет
Должно POST отправлять. Покажите заголовки запроса.
Аватара пользователя
irpsv
Сообщения: 65
Зарегистрирован: 2015.07.07, 18:03
Контактная информация:

Re: Помощь с Pagination

Сообщение irpsv »

andrei.obuhovski писал(а):
cooper.baggi писал(а):
andrei.obuhovski писал(а):попробуй:

Код: Выделить всё

'linkOptions' => ['data-method' => 'post']
после добавления изменилась только ссылка, добавилось data-method="post", так же через GET отправляет
Должно POST отправлять. Покажите заголовки запроса.
Данные отправляются POST'ом, вот только пагинатор считывает данные из QueryString
...то что мы не понимаем, делает нас тупее...
cooper.baggi
Сообщения: 63
Зарегистрирован: 2012.10.31, 12:37

Re: Помощь с Pagination

Сообщение cooper.baggi »

andrei.obuhovski писал(а):Покажите заголовки запроса.
Не понял, что именно показать
При нажатии на другую страницу в пагинаторе, данные отправляются в строку URL и страница перезагружается
andrei.obuhovski
Сообщения: 610
Зарегистрирован: 2015.07.16, 10:50

Re: Помощь с Pagination

Сообщение andrei.obuhovski »

Вы про данные ничего не говорили.
Если вам нужно без перезагрузки страницы и без параметров в URL то используйте pjax.
cooper.baggi
Сообщения: 63
Зарегистрирован: 2012.10.31, 12:37

Re: Помощь с Pagination

Сообщение cooper.baggi »

Использовал Pjax, он подгружает 3 js файла и блокирует основные js файлы
Они либо частично работают либо вообще не работают
makinaru
Сообщения: 6
Зарегистрирован: 2021.08.06, 12:24

Re: Помощь с Pagination

Сообщение makinaru »

Я решил это так - создал виджет переопределение LinkPager, назвал PostLinkPager.

Код: Выделить всё

<?php
declare(strict_types=1);

namespace app\widgets\postLinkPager;

use app\widgets\postLinkPager\assets\PostLinkPagerAsset;
use yii\base\InvalidConfigException;
use yii\widgets\LinkPager;

/**
 */
class PostLinkPager extends LinkPager
{
    /**
     * @inheritDoc
     */
    public function init(): void
    {
        parent::init();

        PostLinkPagerAsset::register($this->view);
        // .. здесь может быть еще ваши необходимые добавки
    }
}
Ассет добавляет js файл с примерно таким содержимым

Код: Выделить всё

$(document).ready(function () {
    $('.pagination .page-link').click(function (event) {
        event.preventDefault();

        const url = $(this).attr('href');
        const urlParams = new URLSearchParams(url.split('?')[1]); // Получаем параметры из URL
        const page = urlParams.get('page');
        const perPage = urlParams.get('per-page');
        // Тут берете или создаёте новую форму
        const form = $(`#${formId}`);
        
        // Заполняете ее текущими фильтрами.....
        form.append(`<input type="hidden" name="page" value="${page}">`);
        form.append(`<input type="hidden" name="per-page" value="${perPage}">`);
        form.submit();
    });
});
Подключается это все в GridView

Код: Выделить всё

GridView::begin([
   //.....
    'pager' => [
        'class' => PostLinkPager::class,
        'pagination' => $dataProvider->pagination,
    ],
    //.....

Ну и в контроллере соответственно данные берем из POST

Таким образом все фильтра передаются методом POST и нету ограничений на длину URL
Ответить