@marsdenden

Yii2 как отключить пагинацию или увеличить лимит?

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

class RestActiveController extends ActiveController
{
    public $serializer = [
        'class' => 'yii\rest\Serializer',
        'collectionEnvelope' => 'items',
    ];
}


Делаю сервис, который будет работать в локалке и разом забрать с сервера ответ в 60000 записей размером в десяток мегабайт (unzipped) - не проблема. Проблема в пагинации. Полазив в исходниках, покопавшись на просторах гугла, испытав /goods?per-page=60000 получил наглое заявление со стороны сервера, что максимальный per-page является 50. Не могу же я для получения 60000 записей делать 1200 запросов, как это обойти?

PS. Убрал сериализатор - все равно пагинация остается, и все равно лимит 50 записей
  • Вопрос задан
  • 1075 просмотров
Решения вопроса 2
myks92
@myks92 Куратор тега Yii
Нашёл решение — пометь вопрос ответом!
Можно задать размер страницы:
/goods?per-page=1000

При запросе /goods выполняется yii\rest\IndexAction, который возвращает
ActiveDataProvider(['query' => $modelClass::find()])

Т.е. объект Pagination там дефолтный
$pageParam = 'page'
$pageSizeParam = 'per-page' 
$pageSizeLimit = [1, 50]
А дефолтный yii\data\Pagination пытается забрать параметры из $request->getQueryParams().

Ваша задача переопределить через DI лимит пагинации у пагинатора $pageSizeLimit = [1, 1000]

PS: 60000 будет многовато. Даже у такого мощного сервиса как ВКонтакте API максимум 1000 по умолчанию 100. Я бы тоже рекомендовал сделать именно так.
Ответ написан
@marsdenden Автор вопроса
Сам спросил - сам решил. На самом деле достаточно просто, надо всего лишь переопределить prepareDataProvider в контроллере

public function actions()
    {
        $actions = parent::actions();
        $actions['index']['prepareDataProvider']=function ($action){
            $queryfunc = [$this->modelClass,'find'];
            return new ActiveDataProvider([
                'query' => $queryfunc(),
                'pagination' => false,
            ]);
        };
        return $actions;
    }


Да, согласен, может быть долго и нудно, но для моей задачи - самое оно ))
К решению подтолкнул ответ здесь
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@maksim_fix
Junior PHP developer
Загуглив ваш вопрос я сразу нашел ответ.
public function actionIndex()
{
    //$posts = Post::find()->all();
    $query = Post::find();
    $pages = new Pagination(['totalCount' => $query->count()]);
    $posts = $query->offset($pages->offset)
        ->limit($pages->limit)
        ->all();
    return $this->render('index', compact('posts', 'pages'));
}


указывайте нужный вам limit и все. Неужели так трудно заглянуть в гугл?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы