form 方法构建编辑表单

  • 页面模式下
    • 通过访问 edit 路由, 进入到 AdminController 方法中的 edit 方法
    • edit 方法中, 调用 form 方法, 并返回新增页面的结构
  • 弹窗模式下
    • 在访问 rowEditButton 方法时, 会调用 form 方法, 并返回编辑表单的结构
/**
 * 前端 amis 通过识别 form 方法返回的结构来构建表单
 * 
 * @param bool $isEdit 用于判断是否为编辑
 * 
 * @return Form
 */
public function form($isEdit)
{
    // baseForm 方法中, 处理了表单的一些基础内容
    // 可以传入一个 bool 参数, 控制在表单提交成功后是否返回上一页
    return $this->baseForm()->body([
        TextControl::make()->name('name')->label('Name'),
        TextControl::make()->name('email')->label('Email'),
    ]);
}

update 方法处理编辑表单提交

  • 提交的流程
    • 前端渲染编辑表单 (里面包含了提交的路径)
      • 页面模式下, 提交 api 和查询回显数据的 apiAdminController 下的 edit 方法中进行了设置
      • 弹窗模式下, 提交 api 和查询回显数据的 apirowEditButton 方法中进行了设置
    • 提交到后端, 后端会调用 update 方法, 并进行相应的处理
  • AdminController 中的 update 方法, 可以满足大多数的编辑表单提交需求, 但是如果有特殊的需求, 也可以重写该方法
  • 大多数情况下, 重写对应 service 中的 update 方法即可
/**
 * 编辑保存
 *
 * @param Request $request
 *
 * @return JsonResponse|JsonResource
 */
public function update(Request $request)
{
    $result = $this->service->update($this->getPrimaryValue($request), $request->all());

    return $this->autoResponse($result, __('admin.save'));
}

/**
 * service 中实际处理修改逻辑的方法, 可以在自己的 service 中重写该方法
 *
 * @param $primaryKey
 * @param $data
 *
 * @return bool
 */
public function update($primaryKey, $data): bool
{
    $columns = $this->getTableColumns();
    $model   = $this->query()->whereKey($primaryKey)->first();

    foreach ($data as $k => $v) {
        if (!in_array($k, $columns)) {
            continue;
        }

        $model->setAttribute($k, $v);
    }

    return $model->save();
}

数据回显

  • 请求数据的 api 会携带 _action=getData 的参数, 从而调用 service 中的 getEditData 方法
  • 如果是弹窗模式, 编辑表单可以从列表中获取数据并回显
/**
 * 获取编辑页面
 *
 * @param $id
 *
 * @return JsonResponse|JsonResource
 */
public function edit($id)
{
    $this->isEdit = true;

    if ($this->actionOfGetData()) {
        return $this->response()->success($this->service->getEditData($id));
    }

    // ...
}

/**
 * 编辑 获取数据 (Service 中)
 *
 * @param $id
 *
 * @return Model|\Illuminate\Database\Eloquent\Collection|Builder|array|null
 */
public function getEditData($id)
{
    $model = $this->getModel();

    return $this->query()->find($id)->makeHidden([$model->getCreatedAtColumn(), $model->getUpdatedAtColumn()]);
}