Reputation: 461
I'm trying to do a pagination on a CGridView
using CArrayDataProvider
(my $rawData
is a custom array - not from a DB/model).
So, In the controller`s action a have the following:
$form = new SearchUser;//here I have SearchUser form that extends CFormModel with the following attributes: 'id', 'name', 'surname', 'phone', 'address'
$users = array();
if (isset($_POST['SearchUser'])) {
....//prepare users array from my custom source-> not from DB/models etc
}
$dataProvider=new CArrayDataProvider($users, array(
'id'=>'id',
'keys'=>array('name', 'surname', 'phone', 'address'),
'sort'=>array(
'attributes'=>array(
'name', 'surname', 'phone', 'address'
),
),
'pagination'=>array(
'pageSize'=>15,
),
));
And:
$this->render('index', array('dataProvider'=>$dataProvider, 'form'=>$form));
On index.php I have:
...
<?php echo CHtml::link('Search','#',array('class'=>'search-button')); ?>
<div class="search-form" style="display:none">
<?php $this->renderPartial('_search',array(
'model'=>$form,
)); ?>
</div><!-- search-form -->
<?php
$this->widget('zii.widgets.grid.CGridView', array(
'dataProvider'=>$dataProvider,
'columns'=>array(
array(
'name' => 'Name',
'type' => 'raw',
'value' => 'CHtml::encode(@$data["name"])'
),
array(
'name' => 'Surname',
'type' => 'raw',
'value' => 'CHtml::encode(@$data["surname"])'
),/*
array(
'name' => 'Phone',
'type' => 'raw',
'value' => 'CHtml::encode(@$data["phone"])'
),*/
array(
'name' => 'Address',
'type' => 'raw',
'value' => 'CHtml::encode(@$data["address"])'
),
),
'enablePagination'=> true,
));
The first page is displayed correctly but when I select another page, my filter is lost and all data are displayed in the grid instead of "filtered" ones.
Upvotes: 2
Views: 14062
Reputation: 1621
Users Model:
public function getAllList(){
$sql = "SELECT * FROM users";
$cmd = Yii::app()->db->createCommand($sql);
return $cmd->queryAll();
}
Users Controller:
public function actionIndex(){
$model = Users::model()->getAllList();
$dataProvider = new ArrayDataProvider($model, array(
'keyField' => 'user_id',
'pagination' => array(
'pageSize' => 5,
),
)
);
$this->render('index',array(
'dataProvider' => $dataProvider,
)
);
}
Users Views:
index.php
$this->widget('zii.widgets.CListView', array(
'ajaxUpdate' => true,
'dataProvider' => $dataProvider,
'itemView' => '_view', // refers to the partial view named '_carList'
'template' => '<h4><span>{summary}</span></h4>{items}{summary}{pager}',
'pagerCssClass' => 'pagination',
'summaryText' => '{start}-{end} of {count} Total Property ',
'pager' => array(
'header' => FALSE,
'firstPageLabel' => FALSE,
'lastPageLabel' => FALSE,
'nextPageLabel' => 'Next',
'prevPageLabel' => 'Previous',
'selectedPageCssClass' => 'active',
'maxButtonCount' => '5'
),
'beforeAjaxUpdate' => 'function(){
//todo before
}',
'afterAjaxUpdate' => 'function(){
//todo after
}',
));
_view.php
<p>
<?php echo $data['user_id']; ?>
<?php echo $data['user_name']; ?>
<?php echo $data['user_pass']; ?>
</p>
Upvotes: 0
Reputation: 8950
Not sure it will solve your problem, but in your CArrayDataProvider you use id
to define the name of the key field instead of keyField
.
You could try the following:
$dataProvider=new CArrayDataProvider($users, array(
'id'=>'users',
'keyField' => 'id',
'keys'=>array('id','name', 'surname', 'phone', 'address'),
'sort'=>array(
'attributes'=>array(
'name', 'surname', 'phone', 'address'
),
),
'pagination'=>array(
'pageSize'=>15,
),
));
Upvotes: 2