xxxgmsxxx/yii2-edit-data-column

用于标准 Yii2 网格数据的简单编辑列类

1.01.002 2022-01-01 19:42 UTC

This package is auto-updated.

Last update: 2024-09-29 05:29:19 UTC


README

  1. 这是什么以及为什么使用它?
  2. 安装
  3. 添加到 GridView

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- 形式的地址

接下来需要创建处理器。处理器的要求如下:

  • 它必须接受参数 idvalue,分别代表编辑的模型字段的值和输入框中的文本。它还可以接受参数 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);
} 

按钮类及其内容暂时不会更改,这将在计划中。