yii CActiveDataProvider с ограничением и нумерацией страниц - PullRequest
9 голосов
/ 30 декабря 2010

Я пытаюсь выделить несколько строк в таблице и отобразить их на нескольких страницах (разбиение на страницы). Это код в модели:

   return new CActiveDataProvider('Downloads',
        array(
            'criteria' => array(
                'select' => 'download_id,title,thumb_ext',
                'order' => 'download_id DESC',
                'limit' => $count,
            ),
            'pagination' => array('pageSize' => 5,),
        )
    );

В представлении я отображаю его с помощью CGridView:

    $this->widget('zii.widgets.grid.CGridView', array(
        'dataProvider'=>$dataProvider,
        'columns' => array('download_id', 'title', 'thumb_ext'),
    ));

Проблема в том, что CActiveDataProvider игнорирует ограничение критериев и возвращает все строки таблицы ...

Спасибо.

Ответы [ 3 ]

7 голосов
/ 30 декабря 2010

Я не уверен ... но я думаю, что Yii использует предложение LIMIT для разбивки результатов SQL, поэтому оно перезапишет / заменит ваше предложение LIMIT. Вы можете проверить это, включив маршрут журнала CWebLogRoute, чтобы точно узнать, какой SQL выполняется.

Во всяком случае, я не совсем уверен, как это должно работать. Для чего вы добавили предложение LIMIT? Если вы все-таки разбиваете на страницы, почему бы не позволить пользователю разбить на страницы все записи? Решение, вероятно, состоит в том, чтобы изменить ваши критерии, чтобы избавиться от предложения LIMIT.

Вы пытаетесь установить количество результатов на странице? Вы уже установили размер страницы в 5, хотя ...

Еще одна попытка, которая может сделать то, что вы хотите, это проверить базовый класс пейджера, CPagination. С CLinkPager это может позволить вам создавать более креативно, чем CListPager, который вы используете с CGridView.

Удачи!

5 голосов
/ 30 августа 2011

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

return new CActiveDataProvider('Downloads',
    array(
        'criteria' => array(
            'select' => 'download_id,title,thumb_ext',
            'order' => 'download_id DESC',
        ),
        'pagination' => array('pageSize' => 5,),
        'totalItemCount' => $count,
    )
);

и установил для CGridView пагинацию:

$this->widget('zii.widgets.grid.CGridView', array(
    'dataProvider'=>$dataProvider,
    'enablePagination' => false,
    'columns' => array('download_id', 'title', 'thumb_ext'),
));
2 голосов
/ 05 января 2011

Одна из основных функций поставщика данных заключается в том, что вы можете переопределить вычисление количества строк, указав «totalItemCount» в конфигурации.Обычно (я не проверял это) это также работает для ActiveDataProvider:

return new CActiveDataProvider('Downloads',
        array(
            'criteria' => array(
                'select' => 'download_id,title,thumb_ext',
                'order' => 'download_id DESC',
            ),
            'pagination' => array('pageSize' => 5,),
            'totalItemCount' => $count,
        )
    );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...