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),
)),