Calculation before sort admin

Hi!

In database i have

id;number;factor

1;5;2

2;8;3

3;2;10

then in controller/admin, the page admin.php i want to multiply the number * factor. I did this:




array(

	'name'=>'number',

	'type' => 'raw',

	'value'=>function($model, $index, $widget) {

				$model->number = $model->number * $model->factor;

				

				return $model->number;

			 },

	'filter'=>CHtml::activeTextField($model, 'number', array('class'=>'form-control'))

),



then, the admin.php page show

id;number

1;10

2;24

3;20

but when i sort by number, the admin.php page show:

id;number

3;20

1;10

2;24

How can i sort by calculation?

I would recommend do the calculations in sql and assign the result to a virtual column name do the filters on that. look at the post below

Thank you, but if the calculation is so complex? And i have a function in components folder to do this? No way?

hi

use get function in your model




public function getValues(){


return $this->number* $this->factory


}



and in your search function added:




$criteria->compare('(number * factory)',$this->number);



this view in gridview:




array(

'name' => 'number',

'value' => '$data->getValues()'

)



any way :

in your model , defined virtual field.




public $var;



and your search function :




$criteria->select = '*, (number*factory) as var ';

$criteria->compare('(number*factory)',$this->var);

.

.

.

return new CActiveDataProvider($this, array(

			'criteria'=>$criteria,

			'pagination'=>array(

                       'pageSize'=> Yii::app()->user->getState('pageSize',Yii::app()->params['defaultPageSize']),

            ),

			

			'sort'=>array(

				

				'defaultOrder'=>'var DESC',

				'attributes'=>array(

						'var' => array(

							'asc' => 'var',

							'desc' => 'var DESC',

						),

                                    

                                    'dt' => array(

							'asc' => 'dt',

							'desc' => 'dt DESC',

						),

				'*',

       			 ),

			),

			

		));



in gridview




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

	'id'=>'score-grid',

	'dataProvider'=>$model->search(),

    'afterAjaxUpdate' => 'js:function(){f()}',


	'filter'=>$model,

	'columns'=>array(

'id'

'var',

	

array(

			'class'=>'CButtonColumn',

			        'template'=>' ' ,

			

			'header'=>CHtml::dropDownList('pageSize',$pageSize,array(10=>10,20=>20,50=>50,100=>100),array(

                       'onchange'=>"$.fn.yiiGridView.update('score-grid',{ data:{pageSize: $(this).val() }})",

                    ))

			

		

		),

	),

));