[解决] 我需要将两个ID表与一个Detail表进行比较,以便过滤我的CGridview。
“详细信息”表有三个重要字段:
1 - id of the detail row
2 - ID of an assigned PERSON
3 - ID of an assigned GROUP (of PERSONs)
只能指定一个人或一个人。两者都不能分配。但同时他们中的任何人都必须(PERSON,GROUP或NONE)
然后我有两个PERSON和GROUP的ID表。 basic,只有一个id链接到detail,一个NAME定义为NAME。
在我的CGridView中我想在一个字段中添加GROUP和PERSON作为SUPPORT,因为我知道它们不会因为之前解释的EITHER规则而发生冲突。所以我得到的那些价值观,如:
在列数组中:
array(
'header'=>'supp group/person',
'value'=>'(!$data->assignedSupportperson && !$data->assignedSupportgroup ?
"null" :
($data->assignedSupportperson ?
$data->assignedSupportperson->name :
$data->assignedSupportgroup->name
)
)',
),
很容易,但困难的部分是我需要为此列添加过滤器。
所以我的逻辑告诉我在我的模型中使用$criteria->compare()
来将两个ID表与DETAIL表中的两列进行比较。我使用$criteria->compare()
来引用ID表来进行文本字段过滤,所以我对此有了一些了解。
但是,如果有人能够很好地操纵模型,请分享你的知识,因为我迷失了。
[添加源代码] 网格视图::
$model = new TicketDetail('search');
if (isset($_GET['TicketDetail'])) {
$model->attributes = $_GET['TicketDetail'];
}
$this->widget('bootstrap.widgets.TbGridView', array(
'id' => 'Assigned-Ticket-grid',
'dataProvider'=>$model->assignedToUser(Yii::app()->user->data()->id)->search(),
'template' => "{items}{pager}",
'htmlOptions'=>array(),
'itemsCssClass' => 'table table-striped table-bordered table-condensed',
'filter' => $model,
'columns' => array(
array(
'name' => 'id',
'header' => 'ID',
'headerHtmlOptions'=>array(
'width'=> 50,
),
),
array(
'header'=>'supp group/person',
'value'=>'$data->AssignedSupport?$data->AssignedSupport:"null"',
//'filter'=>$model, <----- heres where i tried a couple things.
'headerHtmlOptions'=>array(
'width'=>100
)
),
),
);
model ::
public function getAssignedSupport()
{
return !$this->assignedSupportperson&&!$this->assignedSupportgroup?"null":$this->assignedSupportperson?$this->assignedSupportperson->name:$this->assignedSupportgroup->name);
}
是否必须能够搜索过滤器的值?还是我的错误印象?
答案 0 :(得分:0)
我建议您为Detail
模型添加计算字段:
public function getAssignedSupport()
{
return !$this->assignedSupportperson && !$this->assignedSupportgroup?"null":($this->assignedSupportperson?$this->assignedSupportperson->name:$this->assignedSupportgroup->name;
}
现在,使用Yii的__get
函数,您可以将上述方法的结果作为属性(例如$data->assignedSupport
)访问,就像它是数据库中的属性一样。将计算列添加到模型中比将更简单,更清晰的方式添加到视图中。
修改强>
要在gridview中为计算列创建自定义过滤器和排序,还必须编辑模型中的search()
方法。有关实际示例,请查看以下文章:
Sort and filter a custom or composite CGridView column