这是对这个问题的跟进:
在Yii TbExtendedGridView 中的一个单元格内显示相关的has_many数据
我让那个单元格工作,但现在我不知道如何使它可排序和可过滤(过滤字段是隐藏的)。
视图:
$this->widget('bootstrap.widgets.TbExtendedGridView', array(
'id'=>'user-grid',
'dataProvider' => $model->search(),
'filter' => $model,
'columns' => array(
'user_name',
'favorite_color',
array(
'value'=>'$data->getAllDates()',
),
),
));
一个用户可以有多个日期,可以是单个日期或日期范围,所以我有getAllDates函数,它可以获取所有日期并将其全部放在字符串中,这样它们就可以在该用户的单个单元格中表示。
型号:
public function relations()
{
return array(
'listofdates' => array(self::HAS_MANY, 'Dates', 'user_id'),
);
}
public function getAllDates()
{
$data = '';
foreach ($this->listofdates as $date) {
$data .= $date->start_date.'-'.$date->end_date;
}
return $data;
}
我不知道如何启用筛选和搜索日期列。它甚至没有标题,也没有筛选字段。我可以通过添加"name"=>"whatever"来为该列启用筛选字段,但数据库中当然没有该数据的单列,所以我得到了MYSQL错误。我想我需要创建另一个用于过滤的自定义函数,但我不知道从哪里开始。
您可以创建一个额外的字段来过滤和排序$datesFilter和过滤器,如下所示:
型号:
public $datesFilter;
public function rules()
{
array(
array('datesFilter', 'safe', 'on'=>'search')
);
}
public function search()
{
$criteria=new CDbCriteria;
...
// filtering
if ($this->datesFilter!==null)
$criteria->addCondition('YOUR QUERY CONDITION');
...
// sorting
$sort = new CSort;
$sort->attributes =
array(
...
'datesFilter'=>=>array('asc'=>'YOUR SORT ASC', 'desc'=>'YOUR SORT DESC'),
);
}
视图中:
$this->widget('bootstrap.widgets.TbExtendedGridView', array(
'id'=>'user-grid',
'dataProvider' => $model->search(),
'filter' => $model,
'columns' => array(
'user_name',
'favorite_color',
array(
'value'=>'$data->getAllDates()',
'name'=>'datesFilter',
),
),
));