Сортировка по пользовательскому атрибуту
В моей отпускной модели Vac у меня есть эта функция
public function getVacCount(){
эта функция возвращает количество дней в одном отпуске.
и я хочу добавить пользовательский столбец в cgridview следующим образом:
<?php
$this->widget('zii.widgets.grid.CGridView', array(
...
array(
'name' => 'count',
'value' => '$data->getVacPeriod()'
),
...
),
));
?>
это работает отлично. но я не знаю, как я могу отсортировать этот пользовательский атрибут. Я пытался использовать CSort, но он не работает. любая идея?
1 ответ
Чтобы использовать CSort для сортировки, вам нужно преобразовать функцию отпуска в запрос SQL, а затем сохранить результаты в общедоступной переменной в вашей модели.
CSort работает только с операторами / функциями SQL, поскольку под ним используется ORDER BY для выполнения всей сортировки.
Более подробная информация (и демо-код) доступна здесь
Вот пример того, как я делаю это на моем сайте:
$criteria->select = array(
"*",
new CDbExpression("IF(survey.RequestDate, survey.RequestDate, SurveyCompleteDate) AS SurveyDate")
);
Это тогда позволяет мне сделать этот тип фильтра:
return new CActiveDataProvider($this, array(
'criteria' => $criteria,
'sort'=>array(
'attributes'=>array(
'SurveyDate' => array(
'asc' => 'SurveyDate',
'desc' => 'SurveyDate DESC',
),
'*',
),
),
);
Примечание: вам также понадобится открытая переменная, определенная в вашей модели для хранения результатов выполняемого вами выражения CDbExpression. Моя называется SurveyDate.