CArrayDataProvider and ListView - problem with pagination and sorting

(sorry for my english)

I have CListView widget which display data from CArrayDataProvider. dataProvider is an array




$test = array(

              0=>array('id'=>'1','name'=>'Test 1'),

              1=>array('id'=>'2','name'=>'Test 2'),

              2=>array('id'=>'3','name'=>'Test 3'),

            );


$dataProvider=new CArrayDataProvider($test, array(

                    

                    'keyField'=>'id',

                    'sort'=>array(

                        'attributes'=>array(

                             'id','name'

                        ),

                    ),

                    'pagination'=>array(

                        'pageSize'=>2,

                    ),

                ));



In view:




$this->widget('zii.widgets.CListView', array(

        'id'=>'test-id',

        'dataProvider'=>$dataProvider,

        'itemView'=>'_test',   // refers to the partial view named '_post'

        'sortableAttributes'=>array(

            'id','name'

        ),

    ));



Widget render properly in the first page. When I try to change page or sort my page goes blank…

When I render widget with param ?page=2 it render properly.

It dosen’t work after click pager link or sort link…

Why widget dosen’t update after click page link?

Problem is solved.

The reason was in controller which check condition with POST param and blocked action when is called via ajax.

It looks like that every changing page and sorting widgets with DataProvider every time call the action and create new instance of DataProvider…

Hey Deimos, can you give an example? I have the same problem, CArrayDataProvider with CGridView. Thanks before.

In controller:




if(isset($_POST['some_var'])){


   ....

    $some_var = $_POST['some_var'];


    $test = my_function_create_array($some_var);


    $dataProvider=new CArrayDataProvider($test, array(

                    'sort'=>array(

                        'attributes'=>array(

                             'id','name'

                        ),

                    ),

                    'pagination'=>array(

                        'pageSize'=>5,

                    ),

                ));


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


}



In my example, action is called after submit form with some_var which is not set when click pagination or sorting (via ajax). I solved this problem by save my some_var into session vars after call action via post. When action is called via ajax some_vars is getting from session vars:




if(Yii::app()->request->isAjaxRequest){

       $session = Yii::app()->getComponent('session');

       $some_var = $session->get('some_var','');

}else{

       if(isset($_POST['some_var'])){

              $some_var = $_POST['some_var'];

              $session = Yii::app()->getComponent('session');

              $session->add('some_var',$some_var);

       }

}




Thanks for sharing it.