我正在使用Laravel 5.3.18构建一个允许用户输入一个或多个日期的表单。我还使用Laravel Collective中的HTML / Form库以及FormRequest对象来验证字段。我的问题是当用户动态添加更多日期输入(通过JavaScript)并提交表单时,如果它没有通过验证,则动态地"添加的数据(和输入)不会在表单上重新显示。
我的问题是:Laravel是否处理此用例?如果是这样,我怎样才能做到这一点(或者我做错了什么)?非常感谢您的见解和帮助!
以下是最初生成日期输入的实际代码片段:
@foreach ($eventDates as $index=>$eventDate)
<div class="form-group{{ $errors->has('eventDates.'.$index.'.start_datetime') ? ' has-error' : '' }}" id="{{ 'event_date_group_'.$index }}">
{!! Form::label('eventDates['.$index.'][start_datetime]', 'Event Dates (Day '.($index + 1).')', ['class' => 'col-md-4 control-label']) !!}
<div class="col-md-3">
{!! Form::text('eventDates['.$index.'][start_datetime]', $eventDate['start_datetime'], ['id' => 'start_datetime_'.$index, 'class' => 'datetimepicker form-control']) !!}
@if ($errors->has('eventDates.'.$index.'.start_datetime'))
<span class="help-block"><strong>{{ $errors->first('eventDates.'.$index.'.start_datetime') }}</strong></span>
@endif
</div>
</div>
@endforeach
生成这个:
<div class="form-group" id="event_date_group_0">
<label for="eventDates[0][start_datetime]" class="col-md-4 control-label">Event Dates (Day 1)</label>
<div class="col-md-3">
<input id="start_datetime_0" class="datetimepicker form-control" name="eventDates[0][start_datetime]" type="text">
</div>
</div>
因此,如果用户动态创建另一个日期输入,它将如下所示:
<div class="form-group" id="event_date_group_0">
<label for="eventDates[0][start_datetime]" class="col-md-4 control-label">Event Dates (Day 1)</label>
<div class="col-md-3">
<input id="start_datetime_0" class="datetimepicker form-control" name="eventDates[0][start_datetime]" type="text">
</div>
</div>
<div class="form-group" id="event_date_group_1">
<label for="eventDates[1][start_datetime]" class="col-md-4 control-label">Event Dates (Day 2)</label>
<div class="col-md-3">
<input id="start_datetime_1" class="datetimepicker form-control" name="eventDates[1][start_datetime]" type="text">
</div>
</div>
这是我的FormRequest对象的一部分:
public function rules() {
return [
'name' => 'required|max:100',
'eventDates.*.start_datetime' => 'required',
'eventDates.*.end_datetime' => 'required',
...
];
}
public function messages() {
return [
'eventDates.*.start_datetime.required' => 'Start date/time is required.',
'eventDates.*.end_datetime.required' => 'End time is required.',
...
];
}
最后,验证有效。错误消息显示日期输入。实际上,如果我动态创建额外日期输入。填写所有内容,但只将动态日期输入留空,验证将失败,表单将重新显示,但动态输入和数据不会显示。我还在模板中放入了以下调试语句,以查看数组中有多少元素返回,并且它总是只显示1。
<p>Number of Dates: {{ count($eventDates) }}</p>