【问题标题】:Laravel foreach loop malfunctioning with old() dataLaravel foreach 循环因 old() 数据而出现故障
【发布时间】:2021-01-14 00:04:37
【问题描述】:

我有一个表单,允许用户通过单击按钮添加新的输入行。由于某种原因,在表单提交时(故意将所需的行留空以测试表单重新填充),索引#1 被跳过,并且每次提交表单时都会发生这种情况。此外,提交时添加了额外的行,我似乎无法弄清楚原因。

Here is a numbered (top right) gallery depicting the result.

Foreach 循环:

@foreach(old() as $key => $value)
          @if($key !== '_token' && $key !== 'Save' && $key !== 'due_by')
            <div class="grid grid-cols-11 gap-6">
              <div class="col-span-3">
                <label class="block font-medium text-sm text-gray-700" for="">Title</label>
                <input autocomplete="off" class="form-input rounded-md shadow-sm mt-1 block w-full" value="{{old('title.'.$loop->index)}}" type="text" name="title[]">
              </div>

              <div class="col-span-3">
                <label class="block font-medium text-sm text-gray-700" for="">Description</label>
                <input autocomplete="off" class="form-input rounded-md shadow-sm mt-1 block w-full" value="{{old('description.'.$loop->index)}}" type="text" name="description[]">
              </div>

              <div class="col-span-1">
                <label class="block font-medium text-sm text-gray-700" for="">Quantity</label>
                <input autocomplete="off" class="form-input rounded-md shadow-sm mt-1 block w-full" value="{{old('quantity.'.$loop->index)}}" type="text" name="quantity[]">
              </div>

              <div class="col-span-1">
                <label class="block font-medium text-sm text-gray-700" for="">Price</label>
                <input autocomplete="off" class="form-input rounded-md shadow-sm mt-1 block w-full" value="{{old('price.'.$loop->index)}}" type="text" name="price[]">
              </div>

              <div class="col-span-1">
                <label class="block font-medium text-sm text-gray-700" for="">Discount</label>
                <input autocomplete="off" class="form-input rounded-md shadow-sm mt-1 block w-full" value="{{old('discount.'.$loop->index)}}" type="text" name="discount[]">
              </div>

              <div class="col-span-1 mx-auto">
                <label class="block font-medium text-sm text-gray-700" for="taxable[{{$loop->index}}]">Taxable</label>
                <div class="input-container">
                  <input autocomplete="off" type="hidden" name="taxable[{{$loop->index}}]" value="off" />
                  <input autocomplete="off" type="checkbox" class="toggle-input" id="taxable[{{$loop->index}}]" name="taxable[{{$loop->index}}]" value="on" @if(old('taxable.'.$loop->index) == 'on') checked @endif>
                  <label class="toggle switch" for="taxable[{{$loop->index}}]" style="margin-top: 10px;">
                    <div class="toggle-inner"></div>
                  </label>
                </div>
          </div>

                <div class=" deleteField col-span-1 mx-auto"> <button style="margin-top:30px;" class="inline-flex items-center px-4 py-2 border border-transparent rounded-md font-semibold text-xs text-white uppercase tracking-widest bg-red-600 hover:bg-red-500 transition duration-300 ease-in-out transform hover:-translate-y-1 hover:scale-115"><i class="fas fa-trash-alt fa-lg"></i> </button></div>
              </div>
          @endif
          @endforeach

jQuery:

$(document).ready(function() {
var max_fields = 100;
var wrapper = $(".container1");
var add_button = $(".add_form_field");

var x = 0;
$(add_button).click(function(e) {
    e.preventDefault();
    if (x < max_fields) {
        x++;
        $(wrapper).append('html here');
    }
});

【问题讨论】:

    标签: php laravel foreach


    【解决方案1】:

    这可能是由于您循环旧数据的方式。您不是遍历特定于您的表的记录子集,而是遍历整个输入数据。您已经注意到了,因此条件 (if) 检查以跳过您不需要的键,例如 _token

    不幸的是,如果像_token 这样的不需要的键恰好在循环的第二次运行(索引#1),则不会输出任何内容,并且将跳过该行。您可以通过确认old() 的输出来确认这一点,并在呈现任何内容之前查看它的顺序。

    一些更好的选择可能包括:

    1. 循环通过一个已知的表值:

      @for ($i = 0, $count = old('title'); $i < $count; $i++)
      

      这仅针对您的“标题”字段来计算有多少行,但如果您允许标题为空白并且后端未收到它们,则可能会产生不准确的结果。

    2. 为表单字段使用嵌套结构命名:

      <input name="rows[0][title]" value="{{ old('rows.0.title') }}" />
      <input name="rows[0][description]" value="{{ old('rows.0.description') }}" />
      

      这可能需要更多的工作才能让您的数据正确,并且可能会更改您的后端以使用新的层次结构。但是,它会简化您的模板逻辑:

      @foreach (old('rows') as $row)
        {{ $row['title'] }}<br>
        {{ $row['description'] }}
      @endforeach
      

    各有利弊,使用最适合您的应用程序或个人风格的。无论哪种方式,缩小你循环的数据范围,你就会成功。 :) 编码愉快!

    【讨论】:

    • 有道理,谢谢!我会在以后有机会时尝试实施它并回复您
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-23
    • 2015-08-12
    • 2021-01-31
    相关资源
    最近更新 更多