#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',
),