当用户提交表单时,如果有任何错误,则应使用提交的值填充字段,以便用户不需要再次插入这些值。这工作正常,但选择字段不起作用。
我有以下代码:
<form method="post" class="clearfix" action="{{route('post.store')}}" enctype="multipart/form-data">
<div class="form-row">
<div class="form-group">
<label for="event_categories">Categories</span></label>
<select required multiple class="form-control" name="categories[]" id="categories">
@foreach($categories as $category)
<option value="{{$category->id}}">{{$category->name}}</option>
@endforeach
</select>
</div>
</div>
<form>
如果在提交表单后出现任何错误,您知道为什么选择的类别不会出现吗?
答案 0 :(得分:0)
你可以使用laravel文档 https://laravel.com/docs/5.6/requests#old-input
检索旧输入
要从先前的请求中检索闪存输入,请在Request实例上使用旧方法。旧方法将从会话中提取先前闪存的输入数据:
cli
Laravel还提供全球老帮手。如果要在Blade模板中显示旧输入,则使用旧帮助程序会更方便。如果给定字段不存在旧输入,则返回null:
username = $request->old('username');
答案 1 :(得分:0)
如果你使用@old作为select中的第一个选项呢?在@foreach循环之前
答案 2 :(得分:0)
您需要在选项上设置selected
属性:
<option value="{{$category->id}}" {{ in_array($category->id, old('categories')) ? 'selected' : '' }}>{{$category->name}}</option>
答案 3 :(得分:0)
您必须指定在加载页面时最初应选择<option>
,方法是为其提供适当的属性:
<option selected>...</option>
在您提供的代码中,selected
属性永远不会应用于您的任何<option>
,因此当您加载页面时,浏览器永远不会将它们设置为selected
。< / p>
当您被重定向回表单时,浏览器不知道使用上一个请求提交了哪些数据(提交表单时发出的POST请求),因此它无法自动将任何选项设置为{{ 1}},除非在应用程序返回的HTML响应中明确告知。
当验证失败时,Laravel会自动将提交的表单数据闪存到会话中,因此您可以在以下请求中检索它并使用此信息呈现表单,向浏览器指示selected
s中的哪一个以前<option>
(如果有的话)。
您可以使用Laravel的old()
帮助程序访问使用上一个请求提交的数据。
要获取为字段提交的值,请将字段的selected
传递给帮助程序:
name
由于PHP将您的字段值解释为数组,<input name="something" value="{{ old('something', 'optional fallback value') }}">
将返回值数组或old('categories')
。
现在,对于每个选项,检查循环中当前选项的值是否出现在旧值数组中,如果出现,则应用null
属性:
selected
在调用@foreach ($categories as $category)
<option {{ in_array($category->id, old('categories', [])) ? 'selected' : '' }} value="{{ $category->id }}">
{{ $category->name }}
</option>
@endforeach
帮助器中包含第二个参数非常重要,它将空数组(old()
)设置为回退值。这可以防止它在前一个请求的数据中找不到指定键时返回[]
,这会导致in_array()
抛出错误。
此外,您在标签中有一个错误的结束null
标记:
</span>