CSort 和 CActiveDataProvider 使用的一个问题~

CSort中的applyOrder()方法源码


public function applyOrder($criteria)

{

    $order=$this->getOrderBy();

    if(!empty($order))

    {

        if(!empty($criteria->order))

            $criteria->order.=', ';

        $criteria->order.=$order;

    }

}

按照这个逻辑,使用applyOder()是会递加排序条件,这个让CGridView出现一个问题~

CGridView要指定默认排序,有点绕,假如直接在 $criteria中指定order的话,后面点击“表头”排序,就是复合排序的效果,这个不是我们所想要的。

我现在的做法是:


$criteria = new CDbCriteria;

$dataProvider = new CActiveDataProvider('Cases', array(

    'criteria' => $criteria,

));

if(!$dataProvider->getSort()->getOrderBy())

{

    $sort=new CSort('Cases');

    $sort->defaultOrder='sort_order DESC';

    $dataProvider->sort=$sort;

}

可是感觉这样实在是太绕了~~ 我感觉 CSort::applyOrder() 方法,没有必要递加,如果要递加的,可以另外写一个函数,或者给该方法加个参数来实现


$criteria = new CDbCriteria;

$dataProvider = new CActiveDataProvider('Cases', array(

    'criteria' => $criteria,

    'sort'=>array('defaultOrder'=>'sort_order DESC'),

));



这样就可了

嗯,这是一个好方法,还是独飞兄细心~

不过,我觉得这个应该属于配置,可以考虑作为 defaultOrder放到 CActiveDataProvide一个配置去