简体   繁体   中英

how to apply sorting on model method in CGridView Yii

I have User mode l which contain a function that calculates the average revenue per user. Now i want apply sorting in CGridView on the column which is associated with getAvgRevenue() function. While license is relation in the User model.

Here is my code,

 public class User{
     $user_id;
     $email;
     public function getAvgRevenue(){
        $count = 0;
        $revenue = 0;
        foreach ($this->license as $license){

            $revenue += $license->price;
            $count++;                
        }

        if($count!= 0){
            $averageRevenue = $revenue/$count;
            return $averageRevenue;
        }
        else{
            return null;
        }
      }

}

In Controller

  $modelUser = new CActiveDataProvider('User', array( 
            'sort' => array(
                    'attributes' => array(
                            'user_id',
                            'email',
                            'averagerevenue'
                    ),
                    'defaultOrder' => array(
                            'user_id' => CSort::SORT_ASC,
                    ),
            ),
     ));

In view

  <?php $this->widget('zii.widgets.grid.CGridView', array(
     'id' => 'user-grid',
    'dataProvider' => $modelUser,
     'columns' => array(
            array(
                    'header' => 'User ID',
                    'name' => 'user_id',
            ),
            array(
                    'header' => 'Email',
                    'name' => 'email',
            ),
            array(
                'header'=>'Average Revenue',
                'value'=>'$data->averagerevenue',
            ),
        )
    ));

?>

Sorting is applicable on user_id and email but Average Revenue column is not sortable. how to specify model method in sort() of CActiveDataprovider Please help me to solve the problem.

Try this:

$modelUser = new CActiveDataProvider('User', array( 
        'sort' => array(
                'attributes' => array(
                        'user_id',
                        'email',
                        'avgRevenue' //here's the change for you
                ),
                'defaultOrder' => array(
                        'user_id' => CSort::SORT_ASC,
                ),
        ),
 ));

And your gridview column should be:

array(
            'header'=>'Average Revenue',
            'value'=>'avgRevenue',
        ),

and you can read more info on it over here:

http://www.yiiframework.com/wiki/167/understanding-virtual-attributes-and-get-set-methods/

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM