This post has seriously helped me out, cheers to everyone involved. There was one thing though that I have extended on this. I use Yii translation files and needed to obviously make these sortable also. Here is my code for those people trying to do the same. Below we have a solution for sorting relational fields, link fields, translated fields, also working with the ecolumns extension.
My Controller Code
public function actionIndex()
{
$sort = new CSort();
$sort->attributes = array(
Yii::t('app','model.accounts.name')=>array(
'asc'=>'a.name',
'desc'=>'a.name desc',
),
Yii::t('app','model.accounts.phone')=>array(
'asc'=>'a.phone',
'desc'=>'a.phone desc',
),
Yii::t('app','model.tickets.date_required')=>array(
'asc'=>'t.date_required',
'desc'=>'t.date_required desc',
),
Yii::t('app','model.tickets.department_id')=>array(
'asc'=>'t.department_id',
'desc'=>'t.department_id desc',
),
Yii::t('app','model.tickets.category_id')=>array(
'asc'=>'t.category_id',
'desc'=>'t.category_id desc',
),
Yii::t('app','model.tickets.status_id')=>array(
'asc'=>'t.status_id',
'desc'=>'t.status_id desc',
),
'id',
'problem_description',
'problem_solution',
'internal_notes',
'department_id',
'subject',
);
$dataProvider=new CActiveDataProvider('Tickets', array(
'criteria'=>array(
'alias'=>'t',
'join'=>'inner join accounts a on a.id = t.account_id',
),
'sort'=>$sort,
'pagination'=>array(
'pageSize'=>10,
),
));
if(isset($_GET['Tickets']))
$model->attributes=$_GET['Tickets'];
$this->render('index',array(
'model'=>$model,'dataProvider'=>$dataProvider
));
}
My View Code
<?php
$dialog = $this->widget('ext.ecolumns.EColumnsDialog', array(
'options'=>array(
'title' => 'Layout settings',
'autoOpen' => false,
'show' => 'fade',
'hide' => 'fade',
),
'htmlOptions' => array('style' => 'display: none'), //disable flush of dialog content
'ecolumns' => array(
'gridId' => 'tickets-grid', //id of related grid
'storage' => 'session', //where to store settings: 'db', 'session', 'cookie'
'model' => $dataProvider, //model is used to get attribute labels
'columns'=>array(
'id',
'subject',
array(
'name'=>Yii::t('app','model.accounts.name'),
'type'=>'raw',
'value'=>'CHtml::link(CHtml::encode(Custom::truncateText($data->rl_account->name, 30)),Yii::app()->createUrl("Accounts/view",array("id"=>$data->account_id)))',
),
array(
'name'=>Yii::t('app','model.accounts.phone'),
'value'=>'$data->rl_account->phone',
),
array(
'name'=>Yii::t('app','model.tickets.date_required'),
'value'=>'Custom::reformatDate($data->date_required)',
),
//'category_id',
array(
'name'=>Yii::t('app','model.tickets.department_id'),
'value'=>'$data->rl_category->text',
),
array(
'name'=>Yii::t('app','model.tickets.category_id'),
'value'=>'$data->rl_category->text',
),
array(
'name'=>Yii::t('app','model.tickets.status_id'),
'value'=>'$data->rl_status->text',
),
/*
'status_id',
'problem_description',
'problem_solution',
'internal_notes',
'department_id',
'subject',
*/
array(
'class'=>'CButtonColumn',
'template' => '{view} {update}',
'buttons'=>array(
'view'=>array(
'visible'=>'Users::isAllowedActionLink(array("Tickets", "view"))',
),
'update'=>array(
'visible'=>'Users::isAllowedActionLink(array("Tickets", "update"))',
),
),
),
),
)
));
$this->widget('zii.widgets.grid.CGridView', array(
'id'=>'tickets-grid',
'dataProvider'=>$dataProvider,
'summaryCssClass'=>'right block clear',
'pagerCssClass'=>'right block clear',
'template'=>$dialog->link().'{items}{summary}{pager}',
'cssFile'=> Yii::app()->request->baseUrl . '/css/foundation.css',
'columns'=>$dialog->columns(),
));
?>