Laravel:重复字段(和字段组):表单模型绑定

时间:2015-04-02 13:30:57

标签: php mysql validation laravel

我正在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动态添加到表单时我仍然可以使用这些值

1 个答案:

答案 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
}