在使用gridview时,无意间注意到别人的评论,说可以直接在列表页修改内容,简直是大赞呀,不用进入这条数据的编辑页,在列表中就搞定了,带着好奇,自己也搞出来了,效果如下:
这一功能的实现,需要借助js,插件,yii2自带的gridview是没有这一功能的,所以需要重新下载一个gridview插件,具体步骤如下:
第一步,我们先来部署好yii2-grid
利用composer安装yii2-grid
composer require kartik-v/yii2-grid "@dev"
安装好了之后,我们对module进行如下配置,这个是必须要配置的
'modules' => [ 'gridview' => [ 'class' => '\kartik\grid\Module' ] ];
下载配置好之后,在打开视图文件并参考下面的代码修改你的文件
// use yii\grid\GridView; //这里屏蔽掉yii的gridview,用刚刚安装的gridview use kartik\grid\GridView; <?= GridView::widget([ //...... 'export' => false, //加上这一句 'columns' => [ //...... ], ?>
上面代码中我们只需要添加一项 'export' => false, 即可,你原先的gridview无需改动。
然后我们安装yii2-editable
composer require kartik-v/yii2-editable "@dev"
安装好了后,我们在刚才配置好gridview的文件中引入editable
use kartik\editable\Editable;
一、介绍下textInput类型的修改,效果图如下
从上图中可以很轻松的看到编辑的效果,直接贴代码
[ 'attribute' => 'title', 'class'=>'kartik\grid\EditableColumn', ],
但是从上图中我们也看到了,弹窗式修改呢不是很方便,我们接下来看看方便点的操作方式
[ 'attribute' => 'title', 'class'=>'kartik\grid\EditableColumn', 'editableOptions'=>[ //加入本行代码 'asPopover' => false, ], ],
加入上述代码后,没有了弹窗,直接在列表中撑开显示了,效果如下:
如果是多内容的编辑,可以将input改成textare类型的,只需添加如下代码:
[ 'attribute' => 'title', 'class'=>'kartik\grid\EditableColumn', 'editableOptions'=>[ 'asPopover' => false, 'inputType'=>\kartik\editable\Editable::INPUT_TEXTAREA,//只需添加如下代码 'options' => [ 'rows' => 4, ], ], ],
效果如下:
其实,在实际环境中,我们需要的是简单易执行的,我喜欢第一图片的样式类型,其实只需在当前页面加入如下样式即可
<style> form .panel{ background:none !important;border:none;margin:0 !important;} form .panel .kv-editable-form-inline{padding:0 !important;} form .kv-editable-form-inline .form-group{display:none;} form .kv-editable-parent.form-group{display:block;} .kv-editable-link{border:none !important;} </style>
二、介绍下拉修改类型的那种,效果图如下:
代码如下:
[ 'attribute' => 'isoriginal', 'class'=>'kartik\grid\EditableColumn', 'editableOptions'=>[ 'inputType'=>\kartik\editable\Editable::INPUT_DROPDOWN_LIST, 'asPopover' => false, 'data' => ['1'=>'开启','2'=>'关闭'], ], 'value' => function ($model) { return $model->isoriginal == 1 ? '开启' : '关闭';; }, 'filter' => ['1'=>'开启','2'=>'关闭'], ],
常用的就这几种,还有几种类型,这里就不介绍了,我也是参考如下文章写的,介绍的很全,链接如下:
http://www.jb51.net/article/84281.htm
视图中修改完了,在控制器中修改数据,才算完成,声明:如果你的gridview是在视图article/index内,那么接下来的操作你需要在article控制器的index内操作。这里直接贴出代码:
$searchModel = new ProductSearch(); $dataProvider = $searchModel->search(Yii::$app->request->queryParams,$where);//在下面做修改 //直接修改列表中的数据 if (Yii::$app->request->post('hasEditable')) { $id = Yii::$app->request->post('editableKey'); $model = Product::findOne(['id' => $id]); $posted = current($_POST['Product']); $post = ['Product' => $posted]; if ($model->load($post)) { try{ if($model->save()){ $output = ''; isset($posted['name']) && $output = $model->name; isset($posted['status']) && $output = ($model->status == 1) ? '正常':'下架';//不加判断会直接显示数字 } }catch (\Exception $e){ return $e->getMessage(); } } return \yii\helpers\Json::encode(['output'=>$output, 'message'=>'']);//message为空时可以做到无缝切换 }
上面注释中的内容是注意事项,如果不按上述方法来,你会很容易发现问题的,你可以试试哦!下一篇会介绍gridview中的全新,批量操作,说到这来,才发现gridview能做的事情真是太多了!