我正在尝试使用Yii列表视图实现排序。我在列表视图中加入了两个名为provider_favourite和service_request的表。两个表中的字段和内容都列在列表视图中。但排序只在provider_favourite表中有效,而不是在service_request表中。如何从service_request表中对字段进行排序?我使用csort进行排序。我也尝试过CGrid视图。但同样的问题也发生在网格视图中..
我使用以下代码加入
$criteria = new CDbCriteria;
$criteria->select = 'favourite_notes,favourite, favourite_added_date,max_budget,preferred_location,service_name';
$criteria->join = 'LEFT JOIN service_request AS s ON service_request_id = favourite';
$criteria->condition = 'favourite_type = 1';
$sort=new CSort('ProviderFavourite');
// $sort->defaultOrder='s.max_budget ';
$sort->applyOrder($criteria);
$sort->attributes = array(
'max_budget' => 'service_request.max_budget',
'service_name' => 'service_request.service_name',
'favourite_added_date'
);
$type = 2;
$data = new CActiveDataProvider('ProviderFavourite', array('criteria' => $criteria, 'pagination' => array('pageSize' => 4),'sort'=>$sort
));
$this->renderPartial('favourites', array(
'ModelInstance' => ProviderFavourite::model()->findAll($criteria),
'dataProvider' => $data, 'type' => $type, 'sort'=>$sort,
));
以及Iam在列表视图中提供可排序属性
$this->widget('zii.widgets.CListView', array('dataProvider'=>$dataProvider,'itemView'=>'index_1',
'id'=>'request',
'template' => ' {items}{pager}',
'sortableAttributes'=>array('favourite_notes','max_budget','service_name')
));
如果需要更多细节,我会提供。提前致谢
答案 0 :(得分:1)
您必须指定$sort
实例的attributes属性。默认情况下,只有$modelClass(在您的情况下为ProviderFavourite
)的字段是可排序的。
我认为它看起来像这样(未经测试):
$sort->attributes = array(
'service_name' => array(
'asc' => 's.service_name ASC',
'desc' => 's.service_name DESC'
),
// ...another sortable virtual attributes from service_request table
"*"
);
答案 1 :(得分:1)
您不应在CSort
中创建$sort
对象。 CActiveDataProvider
已经为您提供了正确的排序对象。按照您的方式,在配置排序属性之前,将排序条件应用于$criteria
。那不行。
您应该尝试这样的简单设置:
$data = new CActiveDataProvider('ProviderFavourite', array(
'criteria' => $criteria,
'pagination' => array('pageSize' => 4),
'sort'=> array(
'attributes' => array(
'service_name' => array(
'asc' => 's.service_name ASC',
'desc' => 's.service_name DESC'
),
// ...
),
));
如果您需要访问相关的CSort
对象(如果您使用CGridView
或CListView
通常不会访问该对象,因为他们会为您处理),那么您通过$data->sort
获得。