xxxgmsxxx / yii2-edit-data-column
用于标准 Yii2 网格数据的简单编辑列类
Requires
- yiisoft/yii2: ~2.0
README
1. 这是什么以及为什么使用它?
这是一个为 Yii2 组件 yii\grid\GridView
的列添加的额外类,它继承自标准 GridView 列类 yii\grid\DataColumn
,但提供了在表格中直接编辑数据的功能。其外观如下:
当点击此列的文本单元格时,会出现一个输入框和两个按钮:应用和取消。数据将通过 AJAX 发送到服务器。
要使用此组件,需要通过 Composer 安装组件,创建 AJAX 请求处理器(如下所述),并将所选列赋予类 xxxgmsxxx/EditDataColumn。
2. 安装
可以通过两种方式安装:从 GitHub 仓库或从包中安装。
a) 从 GitHub 仓库安装
-
打开项目根目录下的 composer.json 文件
-
找到其中的
"repositories"
部分,并添加仓库{ "type": "vcs", "url": "https://github.com/xxxgmsxxx/yii2-edit-data-column" }
-
如果不存在
"repositories"
部分,则需要创建它"repositories": [ { "type": "vcs", "url": "https://github.com/xxxgmsxxx/yii2-edit-data-column" } ]
-
然后在
"require"
部分添加包"xxxgmsxxx/yii2-edit-data-column": "@dev"
-
在控制台执行以下命令:
composer install
b) 从包中安装
-
进入项目根目录,打开控制台,并执行以下命令:
composer require xxxgmsxxx/yii2-edit-data-column
-
在控制台执行以下命令:
composer install
3. 添加到 GridView
为了使列工作,需要满足两个条件:
- 配置列
- 创建服务器端处理器
要配置列,需要指定列的类,可选地指定处理器的地址
<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
[
'attribute' => 'tag',
'headerOptions' => [
'width' => '300px',
],
'class' => xxxgmsxxx\EditDataColumn\EditDataColumn::class,
'ajaxUrl' => '/tags/ajax-edit',
],
如果有多个此类列,最好在脚本开始时添加 use 指令,然后直接写类名,不带路径
<?php
use xxxgmsxxx\EditDataColumn\EditDataColumn;
?>
...
<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
[
'attribute' => 'tag',
'headerOptions' => [
'width' => '300px',
],
'class' => EditDataColumn::class,
'ajaxUrl' => '/tags/ajax-edit',
],
处理器的地址需要通过 ajaxUrl
参数传递,它可以是一个相对路径,也可以是一个绝对路径。如果没有传递处理器地址,但将使用标准的 /ajax/edit-
形式的地址
接下来需要创建处理器。处理器的要求如下:
-
它必须接受参数
id
和value
,分别代表编辑的模型字段的值和输入框中的文本。它还可以接受参数attribute
,其中传递字段的名称 -
处理器返回 JSON,其中必须有一项必填字段 -
result
,以及一个可选的message
字段。第一项是布尔类型,指示是否成功更新数据,第二项包含错误消息,如果更新失败
处理器示例(来自同一项目的截图)
public function actionAjaxEdit()
{
if (!Yii::$app->request->isAjax) {
throw new ForbiddenHttpException('Only AJAX request accept!');
}
$id = Yii::$app->request->post('id', false);
if ($id === false) {
throw new NotAcceptableHttpException('You must send "id" parameter!');
}
$value = Yii::$app->request->post('value', false);
if ($value === false) {
throw new NotAcceptableHttpException('You must send "value" parameter!');
}
$attribute = Yii::$app->request->post('attribute', false);
if ($attribute === false) {
$attribute = 'tag';
}
$model = Tags::findOne(['id' => $id]);
$result = [
'result' => true,
'message' => '',
];
if (!$model) {
$result = [
'result' => false,
'message' => 'Model not found!',
];
} else {
$model->$attribute = $value;
if (!$model->save()) {
$result = [
'result' => false,
'message' => 'Error on save' . ($model->hasErrors($attribute) ? '!' : ': ' . $model->getFirstError($attribute)),
];
}
}
return json_encode($result);
}
按钮类及其内容暂时不会更改,这将在计划中。