Yii,在网格视图中过滤和排序列,该列具有来自自定义模型函数的数据



这是对这个问题的跟进:

在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',
        ),
    ),
));

最新更新