数据提供器新字段
数据提供器DataProviter给gridview提供数据。当数据提供器是ActiveDataProvider 时,数据来源为model。当model查询给出额外的字段时,在gridview中调用额外字段会提示未定义。解决方法如下
数据提供器
$query = User::find()->select("*,count(id) as num")->groupBy(['uid']);//num为新增的额外字段
$dataProvider = new ActiveDataProvider(['query'=>$query]);
打开model,User.php,在文件中新增代码:public $num;
OK,然后就可以在gridview中像调用其他属性一样,直接调用num了
数据筛选器新字段
除了数据提供器会使用新字段外,筛选器也有使用新字段的情况。
比如我们筛选数据时,向筛选器传递了时间段参数,但数据表中并没有该字段,如下
我们先在gridwiew里添加了新的act_time字段,并用来筛选
[
'attribute' => 'act_time',
'label' => '选择请求时段',
'class' => DateColumn::className(),
'value' => function($data){
//return $end_time;
//return '';
}
]
然后我们去到对应的筛选model中,注册我们定义的新字段,如下
//继承父model的属性,并添加新的属性
public function attributes()
{
return array_merge(parent::attributes(),['act_time']);
}
//设置新字段的验证规则
public function rules()
{
return [
[['id', 'uid', 'created_at'], 'integer'],
[['path', 'method', 'statuscode', 'ip','phone','act_time'], 'safe'],
];
}
这样我们就能在searchModel中使用新增的筛选字段了
编辑gii生成的后台文件
gii生成的后台文件并我们满足我们所用的需求。当我需要引入其他js,css,或者在页面上直接添加js代码时,该怎么做呢?
使用$this->registerJsFile();
引入资源
$this->registerJsFile('static/js/echarts.min.js');
$this->registerJsFile('static/js/china.js');
添加js代码(放在文件最末尾)
<?php
$this->registerJs("
alert('Hello world');
", \yii\web\View::POS_END);
gridview 内容和按钮参数
[
//列名称
'label' => '状态',
//该列对应的数据提供器中的字段。可以不填。填写的话,当value不设值时,会自动读取字段值
'attribute' => 'last_a_time',
//列内容的渲染状态,raw表示自定义html,还有image,text可选
'format' => 'raw',
//设置表格头部样式
'headerOptions' => ['width' => '100px','style'=>'text-align:center;'],
//设置表格内容列样式
'contentOptions' => ['style'=>'text-align:center;'],
//自定义返回值
'value' => function($model){
return $model->status==0?'<span style="color:orange;">待回复</span>':'<span style="color:green;">已回复</span>';
},
//当visible值为真时,显示整列,为假,不显示整列
‘visible’ => (1==2),
//当该字段在searchmodel中设为筛选字段时,可以设置该字段的筛选样式
//传false,不显示筛选。传数组,展示下拉框筛选
'filter' => [0=>'待回复',1=>'已回复'],
//设置筛选框的元素属性
'filterInputOptions' => [
'id' => 'myselect', //设置筛选框的id
'placeholder'=>'input的默认值',//筛选框是文本框时,设置占位字符
'prompt' => '全部'.//筛选框下拉框时,设置下拉框默认值
],
],
[
'class' => 'yii\grid\ActionColumn',
'header' => '状态', //列名称
'template' => '{status}', //定义按钮
'headerOptions' => ['width' => '150px','style'=>'text-align:center;'],
'contentOptions' => ['style'=>'text-align:center;'],
'buttons' => [
//试下按钮方法
'status' => function($url, $model, $key){
$status = $model->status==1?'<span style="color:green;">正常</span>':'<span style="color:red;">禁用</a>';
$url = Url::to(['statusedit','id'=>$key]);
return '<a href="javascript:;" onclick="status_edit(\''.$url.'\',this)">'.$status.'</a>';
}
]
],
Yii2 GridView中使用自定义函数显示内容时使用外部变量问题
ActiveForm
需要上传文件时,需要设置enctype属性。第二个参数表示是否对表单进行验证。当上传的文件需要特殊处理时,最好把该字段设为false
ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data', 'class' => 'submit-form']],false);