Php Yii框架-CGridView排序相关列
提前感谢任何能提供帮助的人。我一直在寻找答案,但还没有找到。我遇到过从一行到重写整个类都不起作用的“解决方案” 我有“网格”来显示关系,并且能够使用搜索功能。我搞不懂的是排序功能。一旦进行了以下更改,列标题将不可单击 这就是我所拥有的: 关系名称/标签为“公司”,在员工模型中设置 表:雇员--列:idCompany & 表:Company--列:companyNick admin.php-查看Php Yii框架-CGridView排序相关列,php,gridview,frameworks,jquery-ui-sortable,yii,Php,Gridview,Frameworks,Jquery Ui Sortable,Yii,提前感谢任何能提供帮助的人。我一直在寻找答案,但还没有找到。我遇到过从一行到重写整个类都不起作用的“解决方案” 我有“网格”来显示关系,并且能够使用搜索功能。我搞不懂的是排序功能。一旦进行了以下更改,列标题将不可单击 这就是我所拥有的: 关系名称/标签为“公司”,在员工模型中设置 表:雇员--列:idCompany & 表:Company--列:companyNick admin.php-查看 <?php $this->widget('zii.widgets.grid.CGridVi
<?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...
这似乎是一个关于[yii]的日常问题。从搜索函数中删除这些内容,并向CGridView列添加一个过滤器属性,如下所示:
array(
'name'=>'company',
'value'=>'$data->company->companyNick',
'filter' => CHtml::listData(Company::model()->findAll(),'id','nick'),
),
我也遇到过同样的问题,最后用这种方式解决了: 模型搜索方法:
$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\u id=t.assigned\u to
(其中t是yii提供的表别名)。这也许不是创建ORDERBY子句的最有效的方法,但它确实有效 在Yii网站的Wiki页面上也有很好的解释:
我喜欢迈克H的答案。我还想指出,您可以使用with()执行关系查询,然后将select设置为false,以防止实际加载相关模型,而不是输入原始SQL。还可以通过传递点符号字符串在视图中使用相关属性的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',
),
我不想创建下拉菜单。我想使用表格标题进行排序(而不是选择);和其他人一样,你仍然可以。但是,如果您想按公司名称而不是外键进行排序,则必须将其插入到数据提供程序(例如$model->search())中。我使用CSort开始了正确的路径。。。你不是很具体。谢谢你告诉我,我需要改变“某些东西”来让它工作。很明显。哇,我相信你会从“我是一个无法容忍的,对每个试图帮助我的人都不领情的混蛋”这句话中得到很多好处。谢谢。下次试着读这个问题,而不是用一个与之无关的不伦不类的答案来回答。
// 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',
),