我正在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
因此,用户可以动态创建新的功能输入,最终在保存时组合成一个数组。当表单中存在验证问题并且我们被重定向回来时,问题就出现了。我还没有找到一种方法来访问功能数组(处于动态与否状态)来吐出他们以前的功能。在写这篇文章的时候,我想如果输入本身导致验证问题,那么该问题也会清除该字段。
我在文档和'谷歌搜索这个主题的灵感,但没有遇到任何事情。朝正确方向的任何推动都会非常有帮助。一如既往地谢谢!
@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
所做的操作。这里的问题不是回读值(我已经设置/获取属性适用于那些),但是Form Model Binding如何与输入数组一起工作,所以当使用AJAX动态添加到表单时我仍然可以使用这些值
答案 0 :(得分:0)
我之前遇到过类似的问题......我的代码肯定不是很优雅,但它确实有效;它可以帮助你建立一些东西......
我的诀窍是为物品生成不同的名称,区分旧物品和新物品,计算新物品:
<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
}