Yii,网格视图中的过滤和排序列,其中包含来自自定义模型函数的数据

时间:2014-04-22 09:26:18

标签: yii

这是对这个问题的跟进:

Display related has_many data inside once cell in Yii TbExtendedGridView

我让那个单元格工作,但现在我不知道如何使它可以排序和过滤(过滤字段被隐藏)。

查看:

$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'来为该列启用过滤字段=> '无论什么',但当然数据库中没有单一列的数据,所以我得到MYSQL错误。 我猜我需要创建另一个自定义函数进行过滤,但我不知道从哪里开始。

1 个答案:

答案 0 :(得分:0)

你可以创建一个额外的字段来过滤和排序$ 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',
        ),
    ),
));