CGridView 按日期年份过滤
CGridView filter by year of date
抱歉,文字很长,但我的问题很长 :-) 我制作了这样的网格
$this->widget('zii.widgets.grid.CGridView', array(
'dataProvider'=>$model->search(),
'filter'=>$model,
'columns'=>array(
array(
'name'=>'title',
'type'=>'raw',
'value'=>'CHtml::link(CHtml::encode($data->title), $data->url)'
),
array(
'name'=>'create_time',
'type'=>'raw',
'value' => 'Yii::app()->dateFormatter->format("yyyy", $data->create_time)',
),
),
));
然后我想按日期过滤,例如按文本字段过滤标题。
我用代码
制作了控制器
$model=new Post('search');
if(isset($_GET['Post']))
$model->attributes=$_GET['Post'];
$this->render('admin',array(
'model'=>$model,
));
和模型中的搜索方法
public function search()
{
$criteria=new CDbCriteria;
$criteria->compare('title',$this->title,$partialMatch=true);
$criteria->compare('create_time',$this->create_time,$partialMatch=true);
return new CActiveDataProvider('Post', array(
'criteria'=>$criteria,
'sort'=>array(
'defaultOrder'=>'status, update_time DESC',
),
));
}
我不会忘记数量规则()
array('title, create_time', 'safe', 'on'=>'search')
我有两条记录是今天的日期。标题过滤工作正常,但是当我在 'create_time' 列过滤器文本字段中键入“2015”并按回车键时,我得到 "no results found".
我试过这个:
array(
'name'=>'create_time',
'type'=>'raw',
'value' => 'Yii::app()->dateFormatter->format("dd MMMM yyyy", $data->create_time)',
'filter' => CHtml::listData(Post::model()->findAll(array('order'=>'create_time')), 'create_time', 'create_time'),
),
似乎有效,但在我的数据库中,create_time 是 integer(11) (必需)并且 listdata 值是数字而不是日期并代表完整日期,不仅是年。
我控制器我用 create_time 记录值中的唯一年份值制作了数组。输出数组 $rok['2015'] => '2015'
$model_post = new Post;
$wyniki = $model_post::model() -> findAllBySql('SELECT create_time FROM tbl_post');
for($i=0;$i<count($wyniki);$i++)
{
$rok_temp[$i] = Yii::app()->dateFormatter->format("yyyy", $wyniki[$i]->create_time);
$rok[$rok_temp[$i]] = $rok_temp[$i];
}
$rok = array_unique($rok);
我发送$rok查看
array(
'name'=>'create_time',
'type'=>'raw',
'value' => 'Yii::app()->dateFormatter->format("dd MMMM yyyy", $data->create_time)',
'filter' => $rok,
),
和
$criteria->compare('create_time',Yii::app()->dateFormatter->format("yyyy", $this->create_time));
但过滤时我得到 "no results found"。
我做错了什么?
您的时间存储为 UNIX 时间戳。因此,您必须对来自过滤器的输入进行一些转换,以将其也更改为 UNIX。首先,创建一个变量来保存模型中的年份
class MyModel extends ... {
public $create_year;
}
然后将此变量添加到您的规则中:
array('create_year', 'safe', 'on' => 'search')
array('create_year', 'numerical', 'integerOnly' => true)
接下来将年份的转换规则添加到您的search()
,即
public function search() {
...
if ($this->create_year) {
$criteria->addBetweenCondition('create_time',
strtotime($this->create_year.'-01-01 00:00:00'),
strtotime($this->create_year.'-12-31 23:59:59')
);
}
...
}
最后将过滤器更改为下拉列表以减少无效条目:
'filter' => CHtml::activeDropDownList(
$model,
'create_year',
array_combine(range(1900, 2099), range(1900, 2099),
array('prompt' => 'Any year')
)
抱歉,文字很长,但我的问题很长 :-) 我制作了这样的网格
$this->widget('zii.widgets.grid.CGridView', array(
'dataProvider'=>$model->search(),
'filter'=>$model,
'columns'=>array(
array(
'name'=>'title',
'type'=>'raw',
'value'=>'CHtml::link(CHtml::encode($data->title), $data->url)'
),
array(
'name'=>'create_time',
'type'=>'raw',
'value' => 'Yii::app()->dateFormatter->format("yyyy", $data->create_time)',
),
),
));
然后我想按日期过滤,例如按文本字段过滤标题。 我用代码
制作了控制器$model=new Post('search');
if(isset($_GET['Post']))
$model->attributes=$_GET['Post'];
$this->render('admin',array(
'model'=>$model,
));
和模型中的搜索方法
public function search()
{
$criteria=new CDbCriteria;
$criteria->compare('title',$this->title,$partialMatch=true);
$criteria->compare('create_time',$this->create_time,$partialMatch=true);
return new CActiveDataProvider('Post', array(
'criteria'=>$criteria,
'sort'=>array(
'defaultOrder'=>'status, update_time DESC',
),
));
}
我不会忘记数量规则()
array('title, create_time', 'safe', 'on'=>'search')
我有两条记录是今天的日期。标题过滤工作正常,但是当我在 'create_time' 列过滤器文本字段中键入“2015”并按回车键时,我得到 "no results found".
我试过这个:
array(
'name'=>'create_time',
'type'=>'raw',
'value' => 'Yii::app()->dateFormatter->format("dd MMMM yyyy", $data->create_time)',
'filter' => CHtml::listData(Post::model()->findAll(array('order'=>'create_time')), 'create_time', 'create_time'),
),
似乎有效,但在我的数据库中,create_time 是 integer(11) (必需)并且 listdata 值是数字而不是日期并代表完整日期,不仅是年。 我控制器我用 create_time 记录值中的唯一年份值制作了数组。输出数组 $rok['2015'] => '2015'
$model_post = new Post;
$wyniki = $model_post::model() -> findAllBySql('SELECT create_time FROM tbl_post');
for($i=0;$i<count($wyniki);$i++)
{
$rok_temp[$i] = Yii::app()->dateFormatter->format("yyyy", $wyniki[$i]->create_time);
$rok[$rok_temp[$i]] = $rok_temp[$i];
}
$rok = array_unique($rok);
我发送$rok查看
array(
'name'=>'create_time',
'type'=>'raw',
'value' => 'Yii::app()->dateFormatter->format("dd MMMM yyyy", $data->create_time)',
'filter' => $rok,
),
和
$criteria->compare('create_time',Yii::app()->dateFormatter->format("yyyy", $this->create_time));
但过滤时我得到 "no results found"。 我做错了什么?
您的时间存储为 UNIX 时间戳。因此,您必须对来自过滤器的输入进行一些转换,以将其也更改为 UNIX。首先,创建一个变量来保存模型中的年份
class MyModel extends ... {
public $create_year;
}
然后将此变量添加到您的规则中:
array('create_year', 'safe', 'on' => 'search')
array('create_year', 'numerical', 'integerOnly' => true)
接下来将年份的转换规则添加到您的search()
,即
public function search() {
...
if ($this->create_year) {
$criteria->addBetweenCondition('create_time',
strtotime($this->create_year.'-01-01 00:00:00'),
strtotime($this->create_year.'-12-31 23:59:59')
);
}
...
}
最后将过滤器更改为下拉列表以减少无效条目:
'filter' => CHtml::activeDropDownList(
$model,
'create_year',
array_combine(range(1900, 2099), range(1900, 2099),
array('prompt' => 'Any year')
)