Yii pagination показывает меньше элементов, чем доступно

У меня есть простой CGridView, который подается из CActiveDataProvider. На данный момент, и я не уверен, как долго это происходило, он не показывает все элементы данных в представлении с включенной разбивкой по страницам.

Мой заголовок показывает "Отображение результатов 1-7 из 9", но нет кнопок для других страниц. Если я установлю для pageSize свойства pagenation поставщика данных небольшое значение, я в конечном итоге получу кнопки пейджинга, но на первой странице, похоже, будет меньше элементов, чем на второй. Например, если я установлю для pageSize CActiveDataProvider значение 3, я получу 2,2,3 (элементы на каждой странице) вместо 3,3,1, как и следовало ожидать.

Если я установлю для pageSize что-нибудь между 9 и 11 включительно, есть элементы, которые я не вижу, потому что я получаю только одну страницу, и не все элементы отображаются ("1-6 из 9", если я установил для pageSize значение 9).

$criteria=new CDbCriteria;
$criteria->with = array('registrations'); 
$criteria->addCondition('registrations.id IS NOT NULL');
$criteria->addCondition('registered = false');
$criteria->together = true;
$dataProvider = new CActiveDataProvider('Skier', array('criteria'=>$criteria));

$this->widget('zii.widgets.grid.CGridView', array(
    'dataProvider'=>$dataProvider,
    'columns'=>array(
        array('name'=>'fullname', 'header'=>'Name'),
        array(
            'name'=>'programs_names',
            'header'=>'Programs',
            'value'=>'$data->programs_names',
        ),
        <More items here>
    )
));

У кого-нибудь есть идеи, что может привести к тому, что разбиение на страницы будет таким шатким?

Изменить: Кроме того, изменение CActiveDataProvider на CArrayDataProvider работает правильно, и я получаю 9 из 9 результатов. Сейчас это будет работать, потому что у меня есть небольшие наборы данных, но я бы лучше выяснил, в чем проблема.

$dataProvider = new CArrayDataProvider(Skier::model()->findAll($criteria));

5 ответов

У меня была такая проблема. это было связано с дублированием записей (первичных ключей) в базе данных.

Я должен был поставить $criteria->with И его together=true внутри if():

if( (int) $this->categoria_id > 0) {
    $criteria->with = Array (
        'categorie'=> Array (
            'together' => true,
        )
    );
    $criteria->compare ('categorie.id', $this->categoria_id);
}

в противном случае CActiveDataProvider с нумерацией страниц together=true и не переданный параметр возвращает неверный счет

Если вы используете сложный запрос, попробуйте этот

$count=Yii::app()->db->createCommand('SELECT COUNT(*) FROM tbl_user')->queryScalar();

$sql='SELECT * FROM tbl_user';

$dataProvider=new CSqlDataProvider($sql, array(
    'totalItemCount'=>$count,
    'sort'=>array(
        'attributes'=>array(
             'id', 'username', 'email',
        ),
    ),
    'pagination'=>array(
        'pageSize'=>10,
    ),
));
// $dataProvider->getData() will return a list of arrays.

Затем вы можете передать свой $dataProvider в CGridView.

Дальнейшие документы по использованию пользовательского запроса в качестве dataProvider, проверьте здесь.

Попробуйте добавить следующее в метод поиска модели "Лыжник":

$criteria->group = "id";

Или же:

$criteria->group = "t.id";

Чтобы показать точно ВСЕ записи, "подсчитать строки", а затем "указать $countResult для pageSize", например

Сначала подсчитайте количество строк (это пример, 'User' = 'название вашей модели'))

$countResult = User::model()->countByAttributes(array('record_name' => $matched_record_name));

ИЛИ ЖЕ

$countResult = User::model()->count($condition);

И затем поставьте $countResult для pageSize

            'pagination'=>array(
                'pageSize' => intval($countResult),
                )), 
Другие вопросы по тегам