Laravel:重复字段(和字段组):表单模型绑定
Posted
技术标签:
【中文标题】Laravel:重复字段(和字段组):表单模型绑定【英文标题】:Laravel: Repeating Fields (and Field Groups): Form Model Binding 【发布时间】:2015-06-07 11:37:53 【问题描述】:我正在 Laravel 中构建一个表单,它以可重复实体的形式处理数组字段(无论是单个输入还是字段组)。当表单中存在重复字段的验证错误或表单中的不同输入时,我在使用表单模型绑定时遇到了问题。
现在我正在通过使用 AJAX 拉入部分视图来生成每个字段的新“实例”
# Add Feature
$(document).on 'click', '.js-listing__add-feature', (e) ->
e.preventDefault()
$.ajax
url: dashboard.partials.feature
type: 'GET'
success: (data) ->
$data = $(data)
$('.js-listing__features').append $data
return
return
# Removing features
$(document).on 'click', '.js-listing__remove-feature', (e) ->
e.preventDefault()
$(this).parent('.js-listing__feature-wrapper').remove()
return
因此,用户可以动态创建新的特征输入,并在保存时最终组合成一个数组。当表单中存在验证问题并且我们被重定向回来时,问题就出现了。我还没有找到一种方法来访问处于状态(动态或非动态)的 features 数组以吐出它们以前拥有的东西。在写这篇文章时,我猜如果是输入本身导致了验证问题,问题也会变成清除该字段。
我在文档和“ole Google”中搜索了有关此主题的灵感,但没有发现任何内容。朝着正确方向的任何推动都会非常有帮助。一如既往的感谢!
表格示例
@extends('dashboard.master')
@section('content')
<h1>Edit Listing</h1>
@include('dashboard.partials.errors')
!! Form::model($listing, ['method' => 'PATCH', 'route' => ['dashboard.listings.update', $listing->id], 'class' => 'uk-form']) !!
<div class="uk-form-row">
!! Form::label('price', 'Price') !!
!! Form::text('price') !!
</div>
<div class="uk-form-row js-listing__features">
!! Form::label('features', 'Features') !!
@if ($listing->features && count($listing->features))
@foreach($listing->features as $key => $feature)
<div class="js-listing__feature-wrapper">
<input type="text" name="features[]" value="$feature">
<a class="js-listing__add-feature" href="#">+</a>
@if ($key > 0)
<a class="js-listing__remove-feature" href="#">-</a>
@endif
</div>
@endforeach
@else
<div class="js-listing__feature-wrapper">
<input type="text" name="features[]">
<a class="js-listing__add-feature" href="#">+</a>
</div>
@endif
</div>
<div class="uk-form-row">
!! Form::submit('Update Listing') !!
</div>
!! Form::close() !!
@stop
当我有值在编辑列表时显示它们时,你会看到我对 @foreach
所做的事情的看法。这里的问题不是读回值(我已经设置/获取属性对那些工作正常),而是表单模型绑定如何与输入数组一起工作,所以当它们通过 AJAX 动态添加到表单时我仍然可以使用这些值.
【问题讨论】:
您能否举例说明您的表单的外观以及您在哪里遇到问题? 当然@DhirajBodicherla 我在原始问题中添加了表单示例。谢谢! 如果你可以在小提琴或其他地方展示它,那么解决你的问题会更容易。 不知道如何才能在 Laravel 之类的框架背后展示服务器端技术的乐趣...... 【参考方案1】:前段时间我也遇到过类似的问题...我的代码肯定不是很优雅,但它确实有效;它可以帮助你构建一些东西......
我的诀窍是为项目生成不同的名称,区分新旧项目,计算新项目:
<input type="text" name="E1-features"> // existing feature #1
<input type="text" name="N1-features"> // new feature #1
<input type="text" name="N3-features"> // new feature #3 (assuming user deleted #2)
<input type="hidden" name="counter" value="3"> // 3 features were added
服务器端,控制器将现有输入与新输入区分开来。这是新输入的代码:
Input::flash();
// Existing features
foreach($features as $key => $feature)
if (Input::get('E'.$key.'-features'))
$rules['E'.$key.'-features'] = 'required';
// New features
for ($i = 1; $i <= Input::get('counter'); $i++)
if (Input::get('N'.$i.'-features'))
$rules['N'.$i.'-features'] = 'required';
$validator = Validator::make(Input::all(), $rules);
if ($validator->fails())
return Redirect::to('page')->withErrors($validator)->withInput();
else
// data stuff
【讨论】:
以上是关于Laravel:重复字段(和字段组):表单模型绑定的主要内容,如果未能解决你的问题,请参考以下文章
Laravel - 使用 json 字段自定义路由模型绑定中的键