Hola Juan, es muy sencillo en realidad lograr lo que tu buscas, lo malo es que no viene casi nada de documentación al respecto en el sitio de Yii.
Te dejo un ejemplo comentado:
class File extends CActiveRecord {
public $category; // OJO: esta variable es el campo que deseamos utilizar en la ordenación y lo tomamos de otra tabla.
//...
public function rules() {
return array(
array('node_id, name', 'required'),
array('node_id', 'length', 'max' => 10),
array('name', 'length', 'max' => 45),
array('description', 'length', 'max' => 1000),
array('path', 'file', 'types' => 'jpg, png, gif, pdf, doc, docx, pps, ppsx, ppt, pptx, xls, xlsx'),
array('node_id, name, description, path, category', 'safe', 'on' => 'search'), // Hay que poner nuestra variable category como safe.
);
}
public function relations() {
return array(
'node' => array(self::BELONGS_TO, 'Node', 'node_id', 'with' => array('category')), // Nuestra relación con el otro modelo tambien debe de estar en nuestro codigo.
);
}
public function behaviors() {
return array('CAdvancedArBehavior',
array('class' => 'ext.CAdvancedArBehavior')
);
}
public function attributeLabels() {
return array(
'node_id' => Yii::t('app', 'Node'),
'name' => Yii::t('app', 'Name'),
'description' => Yii::t('app', 'Description'),
'path' => Yii::t('app', 'Path'),
'category' => Yii::t('app', 'Category'), // Aqui puedes cambiar el nombre de tu campo en el label de tu grid.
);
}
//....
/**
* Aqui viene la parte importante
*/
public function search() {
$criteria = new CDbCriteria;
$criteria->compare('node_id', $this->node_id, true);
$criteria->compare('name', $this->name, true);
$criteria->compare('description', $this->description, true);
$criteria->compare('path', $this->path, true);
$criteria->compare('category.name', $this->category, true); //Agregamos a $criteria nuestro nuevo campo, esto nos sirve para realizar búsquedas dentro del CGridView
$criteria->with = array('node');
//Creamos un nuevo sort y añadimos nuestro campo relacionado
$sort = new CSort();
$sort->attributes = array(
'node_id',
'name',
'description',
'path',
'category' => array( //<---------------- Aqui agregamos el campo relacionado
'asc'=>'category.name',
'desc'=>'category.name DESC',
),
);
return new CActiveDataProvider(get_class($this), array(
'criteria' => $criteria,
'sort' => $sort, // Pasamos la variable sort a nuestro [size=3]CActiveDataProvider[/size]
));
}
}
Ahora solamente en nuestro CGridView tenemos que poner lo siguiente:
<?php $this->widget('zii.widgets.grid.CGridView', array(
'id'=>'file-grid',
'dataProvider'=>$model->search(),
'filter'=>$model,
'columns'=>array(
'node_id',
array('name'=>'category',
'value' => '$data->node->category->name'),
'name',
'description',
'path',
array(
'class'=>'CButtonColumn',
),
),
)); ?>
Y listo, ya podemos hacer un sort con nuestro campo relacionado.
Espero te sirva, cualquier duda me avisas!
Saludos!