Сортировка по пользовательскому атрибуту

В моей отпускной модели 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.

Другие вопросы по тегам