Платформа Yii — CGridView сортирует связанные столбцы

#php #gridview #frameworks #jquery-ui-sortable #yii

#php #gridview #фреймворки #jquery-пользовательский интерфейс-сортируемый #yii

Вопрос:

Заранее спасибо всем, кто может помочь. Я искал ответ, но пока его не нашел. Я столкнулся с «решениями», которые не сработали, которые запускаются от 1 строки до перезаписи целого класса.

У меня есть «сетка», чтобы показать связь, и я могу использовать функцию поиска. Чего я не могу понять, так это функции сортировки. Заголовок столбца становится не кликабельным после внесения приведенных ниже изменений.

Это то, что у меня есть:

Имя / метка отношения — «company», настроенная в модели Employee.

Таблица: Employee — Столбец: idCompany amp; Таблица: Company — Столбец: companyNick

admin.php — ПРОСМОТР

 <?php $this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'employee-grid',
    'dataProvider'=>$model->search(),
    'filter'=>$model,
    'columns'=>array(
            array(
                    'name'=>'company',   
                    'value'=>'$data->company->companyNick',
            ),
            'lastName',
            'firstName',

ETC...
  

Employee.php — МОДЕЛЬ

 public function search()
    {
            // Warning: Please modify the following code to remove attributes that
            // should not be searched.

            $criteria=new CDbCriteria;

            //Company Relation Search
            $criteria->compare('company.companyNick',$this->company,true);  
            $criteria->with='company'; 

            //stock
            $criteria->compare('idEmployee',$this->idEmployee,true);
            $criteria->compare('idAccount',$this->idAccount,true);

ETC...
  

Ответ №1:

У меня были те же проблемы, и в конце концов я решил это таким образом:

Метод поиска модели:

 $sort = new CSort();
$sort->attributes = array(
'assignedTo'=>array(
    'asc'=>'(SELECT surname from people 
            WHERE people.person_id = t.assigned_to) ASC',       
    'desc'=>'(SELECT surname from people 
            WHERE people.person_id = t.assigned_to) DESC',     
    ),
    '*', // add all of the other columns as sortable   
); 
  

Просмотр файла:

 $this->widget('zii.widgets.grid.CGridView', array(
'id'=>'tasks-grid',
'dataProvider'=>$model->search(),
//'filter'=>$model,
'columns'=>array(
    'task',
    array(
    'header'=>'Assigned To',
    'value'=> '$data->assignedTo->surname.", ".$data->assignedTo->forename',
        'name'=> 'assignedTo',
        'sortable'=>TRUE,
        ),
    'due_date',
    'status',       
),
  

));

Таким образом, я выбираю одно поле из связанной таблицы в предложении order by, а затем упорядочиваю по нему, вы создаете объединение таблиц в выражении, в данном случае это — people.person_id = t.assigned_to (где t — псевдоним таблицы, предоставленный yii). Возможно, это не самый эффективный способ создания предложения order by, но он работает!

Ответ №2:

Похоже, это ежедневный вопрос в [yii]. Удалите этот материал из вашей функции поиска и добавьте атрибут фильтра в ваш столбец CGridView следующим образом:

         array(
                'name'=>'company',   
                'value'=>'$data->company->companyNick',
                'filter' => CHtml::listData(Company::model()->findAll(),'id','nick'),
        ),
  

Комментарии:

1. Я не хочу создавать выпадающее меню. Я хочу сортировать (не выбирать), используя заголовок таблицы; как и с другими.

2. Вы все еще можете. Однако, если вы хотите выполнить сортировку по названию компании, а не по внешнему ключу, вам придется взломать его в вашем dataprovider (например, $model-> search())

3. Я начинаю с правильного пути с CSort … вы не очень конкретны. Спасибо, что сказали мне, что мне нужно изменить «кое-что», чтобы это заработало. Очевидно.

4. Вау, я уверен, что вы получите массу удовольствия от всей этой шутки «Я невыносимый, неблагодарный придурок по отношению ко всем, кто пытается мне помочь».

5. Что ж, спасибо. Попробуйте в следующий раз прочитать вопрос, а не отвечать неописуемым ответом, к которому это не относится.

Ответ №3:

Также есть хорошее объяснение, как это сделать на вики-странице веб-сайта Yii: http://www.yiiframework.com/wiki/281/searching-and-sorting-by-related-model-in-cgridview /

Ответ №4:

Мне нравится ответ Майка Х. Я также хочу отметить, что вы могли бы вместо ввода необработанного SQL использовать with() для выполнения реляционного запроса, а затем установить для select значение false, чтобы предотвратить фактическую загрузку связанных моделей. Вы также можете использовать attributeLabel соответствующего атрибута в представлении, передавая строку с обозначением точкой, например,:

 
// Controller
$gridDataProvider = new CActiveDataProvider('EmrFormPatientTie', array(
    'criteria'=>array(
        'condition'=>'flag_locked=0',
        'with'=>array('patient'=>array(
            'select'=>false, // Perform relational query without loading related models
        )),
    ),
    'pagination'=>(array('pageSize'=>15)),
    'sort'=>array(
        'attributes'=>array(
            'patient.display_id'=>array(
                'asc'=>'patient.display_id',
                'desc'=>'patient.display_id DESC',
            ),
            '*', // Make all other columns sortable, too
        ),
    ),
));

// View
array(
    'name'=>'patient.display_id',
    'value'=>'$data->patient->display_id',
),