Skip to content

fix: 修复表单提交参数重复问题 (#22)#23

Open
PrintNow wants to merge 2 commits into
2.0from
fix/form-duplicate-params
Open

fix: 修复表单提交参数重复问题 (#22)#23
PrintNow wants to merge 2 commits into
2.0from
fix/form-duplicate-params

Conversation

@PrintNow
Copy link
Copy Markdown
Owner

@PrintNow PrintNow commented May 22, 2026

Summary

  • 修复 Builder::render()renderHiddenFields() 被调用两次,导致 _method_previous_ 等隐藏字段在 DOM 中重复
  • 修复 MultipleSelect 字段的隐藏 input 在有选中值时仍提交空值的问题

问题根因

隐藏字段重复

Builder::render() 在默认布局路径(无 columns、无 blocks)和 hasBlocks 路径中,renderHiddenFields() 被调用了两次:

  1. container.blade.php:18{!! $form->renderHiddenFields() !!}
  2. Builder::render():726$this->layout->build($this->renderHiddenFields())

jquery-form 的 ajaxSubmit 通过 form.elements 序列化所有表单元素,两个重复的 <input> 都被收集,导致 payload 中出现 _method=PUT&_method=PUT

MultipleSelect 空值重复

multipleselect.blade.php<input type="hidden" name="{{$name}}[]" /><select> 同名,选中值时两者同时提交,导致数组混入空值。

修复方式

  • 移除 Builder::render()build()renderHiddenFields() 的冗余调用
  • MultipleSelect 的隐藏 input 根据选中状态动态 disabled,Select2 变更时通过 change.select2 事件切换

Test plan

  • 编辑页面提交,确认 _method_previous_ 不再重复
  • MultipleSelect 选中值时确认 payload 中无空值
  • MultipleSelect 清空选择时确认服务端收到空数组
  • hasColumns 布局的表单 hidden fields 仍正常渲染
  • create 模式表单无回归

Closes #22

PrintNow added 2 commits May 22, 2026 13:37
- Builder::render() 中 renderHiddenFields() 被调用两次,导致 _method、
  _previous_ 等隐藏字段在 DOM 中重复,ajaxSubmit 序列化时参数翻倍
- MultipleSelect 的隐藏 input 在有选中值时仍提交空值,改为按需禁用
@PrintNow
Copy link
Copy Markdown
Owner Author

修复审查

Fix 1 — Builder::render() 移除冗余 renderHiddenFields()

三条渲染路径均通过 container.blade.php:18 渲染 hidden fields,移除 build() 中的冗余调用后每条路径只渲染一次:

路径 container.blade.php build() 结果
hasColumns ✓ doWrap 内 不调用 1次 ✓
默认(无columns无blocks) ✓ prepend 进 column 无参数 1次 ✓
hasBlocks ✓ block column 内 无参数 1次 ✓

renderHiddenFields() 仅在 container.blade.php:18Builder.php(方法定义)两处出现,无其他调用方。无副作用。

Fix 2 — MultipleSelect 隐藏 input 按需禁用

场景 行为 正确
页面加载,有预选值 PHP 输出 disabled,hidden input 不提交
页面加载,无预选值 提交空值 → Helper::array 过滤为 []
用户选中值 change.select2 → JS 禁用 hidden input
用户清空选择 change.select2 → JS 启用 hidden input
多个实例 $selector 含字段名,唯一不冲突
Select2 未初始化 原生 select 可用,PHP disabled 处理初始状态
.next() 查找 Select2 保留原生 select,.next() 能找到 hidden input
$(this).val() 为 null ?.length 可选链安全处理

未发现遗漏的边界情况,两个修复均安全。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

对于一些创建、更新等操作 Ajax 请求参数会重复

1 participant