Сортировка по произвольному полю в yii CGridView

Я знаю, что подобные вопросы уже были опубликованы, но я не могу найти свое решение... Моя цель - создать настраиваемый столбец с возможностью сортировки. (сборка из функции в моей модели.) Столбец заполнен правильно, заголовок можно щелкнуть, но при попытке сортировки возникает исключение sql.

вот мой код:

Итак, у меня есть CGridView, на мой взгляд:

[code]
$dataprovider = $parametre->searchByUser($user->Id_User,'validateur');

$this->widget('zii.widgets.grid.CGridView', array(
        'id'=>'ValidIndice-grid',
        'dataProvider'=>$dataprovider,
        'rowCssClassExpression'=>'$data->color',
        'selectableRows'=>1,
        'selectionChanged'=>'function(id){ location.href = "'.$this->createUrl('Parametre/view').'/id/"+$.fn.yiiGridView.getSelection(id);}', //array('idEvent'=>$evenement->Id_Evenements),
        'htmlOptions'=>array('class'=>'grid-view mgrid_table'),

        'columns'=>array(

                array(
                        'name'=>'Libelle',
                        'header'=>'Libellé du paramètre',
                        'value'=>'$data->Libelle'
                ),
                array(                      
                        'header'=>'Nouvelle donnée?',
                        'name'=>'NewValue',
                        'value'=>'$data->NewValue',                 

                        ),
));
?>
[/code]

В моей модели:

[code]

public  function searchByUser($idUser,$role)
    {
        $criteria=new CDbCriteria;
        $criteria->alias = 'Parametre';

        $criteria->join='LEFT JOIN Droit ON Droit.Id_Parametre  = Parametre.Id_Parametre';

        $criteria->compare('Id_Parametre',$this->Id_Parametre,true);
        $criteria->compare('Libelle',$this->Libelle,true);

             ... Other criteria ... 

        $criteria->compare('NewValue',$this->NewValue);

        $sort = new CSort();
        $sort->attributes = array(
                'NewValue'=>array(
                        'asc'=>'NewValue ASC',
                        'desc'=>'NewValue DESC',
                ),
                '*', // this adds all of the other columns as sortable
        );

        return new CActiveDataProvider($this, array(
                'criteria'=>$criteria,
                'sort'=>$sort,
        ));
    }
[/code]

и в той же модели моя функция, чтобы увидеть, есть ли у меня новое значение:

[code]
    public function getNewValue() //mean => hasNewValue()
    {   
        $condition = 'Id_Parametre=:IdParam AND boolValide != 1';
        $params =  array(':IdParam'=>$this->Id_Parametre);
        if(Valeur::model()->exists($condition,$params)!=null)
        {
            return true;
        }   
        else 
        {
            return false;
        }
    }
[/code]

При этом мой CGridView заполнен правильно, а заголовок моего столбца «newValue» доступен для кликов. Но когда я нажимаю на него, у меня возникает исключение sql, потому что он не находит столбец «newValue». Это логика, этого столбца не существует, потому что это функция (getNewValue). Что не так? заранее спасибо !

вот ошибка, если она нужна:

[Цитировать]

[code]
Error 500: <h1>CDbException</h1>
<p>CDbCommand n'a pas pu exécuter la commande SQL : SQLSTATE[42S22]: Column not found: 1054 Unknown column 'NewValue' in 'order clause'. The SQL statement executed was: SELECT `Parametre`.`Id_Parametre`, `Parametre`.`Libelle`, `Parametre`.`DateDebut`, `Parametre`.`DateFin`, `Parametre`.`Ponderation`, `Parametre`.`Frequence`, `Parametre`.`ValeurCible`, `Parametre`.`Max`, `Parametre`.`BorneVO`, `Parametre`.`BorneOR`, `Parametre`.`Min`, `Parametre`.`Unite`, `Parametre`.`boolIndicateur`, `Parametre`.`Id_Indicateur` FROM `parametre` `Parametre` LEFT JOIN Droit ON Droit.Id_Parametre  = Parametre.Id_Parametre WHERE droit.BoolEncodage = 1 AND droit.Id_User = 0 ORDER BY NewValue ASC LIMIT 10 (D:\WWW\VincentM\yii\framework\db\CDbCommand.php:543)</p><pre>#0 D:\WWW\VincentM\yii\framework\db\CDbCommand.php(396): CDbCommand->queryInternal('fetchAll', Array, Array)
#1 D:\WWW\VincentM\yii\framework\db\ar\CActiveRecord.php(1351): CDbCommand->queryAll()
#2 D:\WWW\VincentM\yii\framework\db\ar\CActiveRecord.php(1470): CActiveRecord->query(Object(CDbCriteria), true)
#3 D:\WWW\VincentM\yii\framework\web\CActiveDataProvider.php(199): CActiveRecord->findAll(Object(CDbCriteria))
#4 D:\WWW\VincentM\yii\framework\web\CDataProvider.php(168): CActiveDataProvider->fetchData()
#5 D:\WWW\VincentM\yii\framework\zii\widgets\CBaseListView.php(111): CDataProvider->getData()
#6 D:\WWW\VincentM\yii\framework\zii\widgets\grid\CGridView.php(339): CBaseListView->init()
#7 D:\WWW\VincentM\yii\framework\web\CBaseController.php(147): CGridView->init()
#8 D:\WWW\VincentM\yii\framework\web\CBaseController.php(172): CBaseController->createWidget('zii.widgets.gri...', Array)
#9 D:\WWW\VincentM\PilotTool\protected\views\site\_Encode.phtml(68): CBaseController->widget('zii.widgets.gri...', Array)
#10 D:\WWW\VincentM\yii\framework\web\CBaseController.php(126): require('D:\WWW\VincentM...')
#11 D:\WWW\VincentM\yii\framework\web\CBaseController.php(95): CBaseController->renderInternal('D:\WWW\VincentM...', Array, true)
#12 D:\WWW\VincentM\yii\framework\web\CController.php(869): CBaseController->renderFile('D:\WWW\VincentM...', Array, true)
#13 D:\WWW\VincentM\PilotTool\protected\views\site\desktop_index.phtml(13): CController->renderPartial('_Encode', Array, true)
#14 D:\WWW\VincentM\yii\framework\web\CBaseController.php(126): require('D:\WWW\VincentM...')
#15 D:\WWW\VincentM\yii\framework\web\CBaseController.php(95): CBaseController->renderInternal('D:\WWW\VincentM...', NULL, true)
#16 D:\WWW\VincentM\yii\framework\web\CController.php(869): CBaseController->renderFile('D:\WWW\VincentM...', NULL, true)
#17 D:\WWW\VincentM\yii\framework\web\CController.php(782): CController->renderPartial('desktop_index', NULL, true)
#18 D:\WWW\VincentM\PilotTool\protected\controllers\SiteController.php(66): CController->render('desktop_index')
#19 D:\WWW\VincentM\yii\framework\web\actions\CInlineAction.php(49): SiteController->actionIndex()
#20 D:\WWW\VincentM\yii\framework\web\CController.php(308): CInlineAction->runWithParams(Array)
#21 D:\WWW\VincentM\yii\framework\web\CController.php(286): CController->runAction(Object(CInlineAction))
#22 D:\WWW\VincentM\yii\framework\web\CController.php(265): CController->runActionWithFilters(Object(CInlineAction), Array)
#23 D:\WWW\VincentM\yii\framework\web\CWebApplication.php(282): CController->run('index')
#24 D:\WWW\VincentM\yii\framework\web\CWebApplication.php(141): CWebApplication->runController('site/index')
#25 D:\WWW\VincentM\yii\framework\base\CApplication.php(180): CWebApplication->processRequest()
#26 D:\WWW\VincentM\PilotTool\index.php(21): CApplication->run()
#27 {main}</pre>
[/code]

[/Цитировать]


person Vincent    schedule 25.06.2014    source источник
comment
вы не можете сортировать по атрибуту, который не хранится в базе данных, возможно, если бы вы могли использовать какое-то выражение sql для этого   -  person Developerium    schedule 25.06.2014
comment
Вам нужен столбец с подзапросом, который либо возвращает true, либо false. Затем, нажав на ссылку в CGridView, результат должен быть отсортирован соответствующим образом. Это больше похоже на SELECT *, (SELECT ...) as NewValue FROM ... Вам нужно public $NewValue; как свойство в классе Parametre Model.   -  person Kunal Dethe    schedule 26.06.2014
comment
Пожалуйста, проверьте использование SubQuery в столбцах Yii.   -  person Kunal Dethe    schedule 26.06.2014


Ответы (2)


Попробуйте это может сработать.

Вызовите столбец «NewValue» в таблице «Droit» как Droit.NewValue в вашем CSort().

$sort->attributes = array(
            'NewValue'=>array(
                    'asc'=>'Droit.NewValue ASC',
                    'desc'=>'Droit.NewValue DESC',
            ),
            '*', // this adds all of the other columns as sortable
    );
person Sajin    schedule 25.06.2014
comment
не работай. таблица Droit используется, чтобы узнать, имеет ли пользователь право просматривать таблицу Parametre. но функция NewValue используется, чтобы увидеть, есть ли у параметра новая запись другой таблицы Valeur. Я попытался добавить Droit или Parametre перед вызовом, но безуспешно. Но если sql попытается найти поле NewValue в моей базе данных mysql, он никогда не найдет его, потому что его не было в базе данных. NewValue существует только в моем классе модели Parameter. - person Vincent; 25.06.2014

Я использовал datatable вместо CGridView & dataprovider. Это действительно более интуитивно понятно; просто и понятно;

Я не могу понять все данные, представленные в поставщике данных, и как они работают.

person Vincent    schedule 22.08.2014