2011-05-20 9 views
2

助けてくれる人には、事前に感謝します。私は答えを探していますが、まだ答えを見つけていません。私は1つの行から実行されていない "ソリューション"を実行し、クラス全体を書き直しました。Yii Framework - CGridView関連の列を並べ替え

私は関係を示すために "グリッド"を持っており、検索機能を使用することができます。私が理解できないのは、ソート機能です。以下の変更が行われると、列ヘッダーはクリックできなくなります。

これは私が持っているものです。

リレーション名/ラベルは「会社、」従業員モデルのセットアップです。

表:社員 - カラム:idCompany & 表:会社 - カラム:companyNick

admin.php - VIEW

<?php $this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'employee-grid', 
    'dataProvider'=>$model->search(), 
    'filter'=>$model, 
    'columns'=>array(
      array(
        'name'=>'company', 
        'value'=>'$data->company->companyNick', 
      ), 
      'lastName', 
      'firstName', 

ETC... 

Employee.php - MODEL

public function search() 
    { 
      // Warning: Please modify the following code to remove attributes that 
      // should not be searched. 

      $criteria=new CDbCriteria; 

      //Company Relation Search 
      $criteria->compare('company.companyNick',$this->company,true); 
      $criteria->with='company'; 

      //stock 
      $criteria->compare('idEmployee',$this->idEmployee,true); 
      $criteria->compare('idAccount',$this->idAccount,true); 

ETC... 

答えて

4

私は同じ問題を抱えて、最後にそれをこのように解決してきた:

モデル検索方法:

$sort = new CSort(); 
$sort->attributes = array(
'assignedTo'=>array(
    'asc'=>'(SELECT surname from people 
      WHERE people.person_id = t.assigned_to) ASC',  
    'desc'=>'(SELECT surname from people 
      WHERE people.person_id = t.assigned_to) DESC',  
    ), 
    '*', // add all of the other columns as sortable 
); 

ビューファイル:

$this->widget('zii.widgets.grid.CGridView', array(
'id'=>'tasks-grid', 
'dataProvider'=>$model->search(), 
//'filter'=>$model, 
'columns'=>array(
    'task', 
    array(
    'header'=>'Assigned To', 
    'value'=> '$data->assignedTo->surname.", ".$data->assignedTo->forename', 
     'name'=> 'assignedTo', 
     'sortable'=>TRUE, 
     ), 
    'due_date', 
    'status',  
), 

));

このように、関連するテーブルからorder by句に1つのフィールドを選択し、それを並べると、式にテーブル結合を作成します。この場合は-です(tはテーブルですエイリアスはyiiによって提供されます)。これはおそらくorder by節を作成する最も効率的な方法ではありませんが、うまくいきます!

2

これは日々の質問です。検索機能のうち、その原料を除去し、そのようなあなたのCGridView列にフィルタ属性を追加します。

 array(
       'name'=>'company', 
       'value'=>'$data->company->companyNick', 
       'filter' => CHtml::listData(Company::model()->findAll(),'id','nick'), 
     ), 
+0

ドロップダウンメニューを作成したくない場合は、関連する属性のattributeLabelをビュー内で使用することもできます。私はテーブルヘッダーを使用して並べ替える(選択しない)。他のものと同様に。 –

+0

それでもできます。ただし、外部キーではなく会社名でソートする場合は、データプロバイダにハックする必要があります(例:$ model-> search()) –

+0

私はCSortで正しいパスを開始しています。あなたはあまり具体的ではありません。私がそれを動作させるために「何か」を変える必要があることを教えてくれてありがとう。明らかに。 –

1

私はマイク・Hの答えが好きです。また、生のSQLを入力するのではなく、with()を使用してリレーショナルクエリを実行し、selectをfalseに設定して、関連するモデルを実際にロードするのを防ぐことができます。


// Controller 
$gridDataProvider = new CActiveDataProvider('EmrFormPatientTie', array(
    'criteria'=>array(
     'condition'=>'flag_locked=0', 
     'with'=>array('patient'=>array(
      'select'=>false, // Perform relational query without loading related models 
     )), 
    ), 
    'pagination'=>(array('pageSize'=>15)), 
    'sort'=>array(
     'attributes'=>array(
      'patient.display_id'=>array(
       'asc'=>'patient.display_id', 
       'desc'=>'patient.display_id DESC', 
      ), 
      '*', // Make all other columns sortable, too 
     ), 
    ), 
)); 

// View 
array(
    'name'=>'patient.display_id', 
    'value'=>'$data->patient->display_id', 
), 

関連する問題