2013-04-17 62 views
0


我想實現用Yii列表視圖進行排序。我已經在列表視圖中加入了兩個名爲provider_favourite和service_request的表。兩個表中的字段和內容都列在列表視圖中。但排序只能在provider_favourite表中工作,而不能從service_request表中工作。如何對service_request表中的字段進行排序? Iam使用csort進行排序。我也嘗試過CGrid視圖。但同樣的問題是使用下面的代碼加入如何對Yii中關係表中的字段進行排序?

$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, 
    )); 

,也提供蔭列表視圖

$this->widget('zii.widgets.CListView', array('dataProvider'=>$dataProvider,'itemView'=>'index_1',  
     'id'=>'request', 
     'template' => ' {items}{pager}', 
     'sortableAttributes'=>array('favourite_notes','max_budget','service_name') 
)); 

如果有更多的細節需要排序的屬性發生在網格視圖也..
蔭,我會提供。在此先感謝

回答

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 
    "*" 
); 
+0

我想我已經提供了它。你能檢查我的問題嗎?我更新了代碼。但同樣的問題正在顯示。在鼠標懸停並點擊時,光標正在變化,頁面也重新加載。但排序不會發生 – anu

+0

關於[sortableAttributes](http://www.yiiframework.com/doc/api/1.1/CListView#sortableAttributes-detail)的文檔說,爲了使屬性可排序,它還必須顯示爲'dataProvider'的'IDataProvider :: sort'屬性中的可排序屬性。換句話說,這個屬性必須聲明爲在'CSort'的'attributes'屬性中進行排序。 – Ezze

+0

'CSort'實例本身也可以使用'CActiveDataProvider'的'sort'屬性進行聲明,如[here](http://www.yiiframework.com/forum/index.php/topic/9632-newbie-question-how -to-最好的排序與 - CListView中,使用-關係/ page__p__47656#entry47656)。 – Ezze

1

$sort你不應該創建一個CSort對象。 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' 
      ), 
      // ... 
    ), 
)); 

如果你需要,如果你使用一個CGridViewCListView訪問相關CSort對象(你通常不這樣做,因爲他們對付的是爲你),那麼你通過$data->sort得到它。

相關問題