【问题标题】:CArrayDataProvider with CGridView pagination YiiCArrayDataProvider 和 CGridView 分页 Yii
【发布时间】:2017-04-25 17:50:59
【问题描述】:

我正在尝试使用 CArrayDataProviderCGridView 进行分页(我的 $rawData 是自定义数组 - 不是来自数据库/模型)。 所以,在控制器的动作中,有以下几点:

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

还有:

$this->render('index', array('dataProvider'=>$dataProvider, 'form'=>$form));

在 index.php 上我有:

...
<?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,
));

第一页显示正确,但当我选择另一页时,我的过滤器丢失,所有数据都显示在网格中,而不是“过滤”的数据。

【问题讨论】:

  • 在你的网址里有?page=...吗?
  • 我有这样的东西:&id_page=2

标签: php yii cgridview


【解决方案1】:

不确定它是否能解决您的问题,但在您的 CArrayDataProvider 中,您使用 id 来定义键字段的名称,而不是 keyField。 您可以尝试以下方法:

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

【讨论】:

  • CArrayDataProvider 没有实现分页和排序方法,所以你需要根据你的实现来实现它们
  • 是的,它有!只需检查来自 api yiiframework.com/doc/api/1.1/CArrayDataProvider 的示例。顺便说一句,数据提供者永远不会实现分页。数据提供者调用一个 CPagination 对象或继承自它的类
  • 如果你打算使用排序功能,这个答案可能会帮助你不应该使用$criteria-&gt;orderstackoverflow.com/a/13561187/1226748
【解决方案2】:

用户模型:

    public function getAllList(){
        $sql = "SELECT * FROM users";
        $cmd = Yii::app()->db->createCommand($sql);
        return $cmd->queryAll();
    }

用户控制器:

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

用户浏览量:

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>

【讨论】:

    猜你喜欢
    • 2013-08-20
    • 2014-06-15
    • 1970-01-01
    • 2014-07-18
    • 2013-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多