我已经创建了一个动态表单来输入远足装备项目。 在开始时,用户看到的只是一个“选择齿轮类别”的下拉列表,根据所选的齿轮类别(例如:“避难所”)--另一个下拉列表显示给用户选择齿轮项目的类型(例如:“帐篷”)。 一旦做出选择,用户就会得到一个通用表单(比如价格,重量,品牌,名字等)+一个视图部分,该视图部分根据类型获取特殊功能(如果是帐篷,它会获取人的数量,如果是背包,则会获取承载量等)
具有特殊功能div的表单结构示例:
<div class="form-group col-md-6">
<select class="custom-select" name="manufacturer_id">
<option value="" selected>Brand</option>
@forelse ($manufacturers as $manufacturer)
<option value="{{ $manufacturer->id }}"
{{ (old("manufacturer_id") == $manufacturer->id ? "selected" : "") }}>
{{ $manufacturer->name }}</option>
@empty
<option>No manufacturers</option>
@endforelse
</select>
<small id="manufacturerHelp" class="form-text text-muted ">Not on our list? - <a
href="#" data-toggle="modal" data-target="#manuf_modal">Add
new</a>.</small>
@error('manufacturer_id')
<small class="text-danger">{{ $message }}</small>
@enderror
</div>
</div>
<div class="container pt-3" v-show="formDisplay" id="itemType"
style="background: #e1f7d5">
<!-- This div displays the partial view related to the sub category chosen -->
</div>
到目前为止还不错。 我设法通过控制器将数据分发到适当的表中。 下面是我的“存储”方法:
public function store(){
$data = request()->validate([
'gear_categories_id' => 'required',
'sub_categories_id' => 'required',
'name' => 'required',
'manufacturer_id' => 'required',
]);
$gearItem = auth()->user()->gearItem()->create($data);
$featureModel = SpecialFeature::where('sub_categories_id', $gearItem->sub_categories_id)->value('model_name');
$specialFeatures = 'App\\'.$featureModel;
$featuresData['gear_items_id'] = $gearItem->id;
$featureNames = SpecialFeature::where('sub_categories_id', $gearItem->sub_categories_id)->get();
foreach ($featureNames as $featureName) {
if (SpecialFeature::where('required', 0)->get()){
$featuresData[$featureName->feature_name] = request($featureName->feature_name);
} else {
$featuresData = request()->validate([
$featureName->feature_name => 'required'
]);
}
}
$specialFeatures::create($featuresData);
return redirect('/gearitem/'.$gearItem->id);
}
问题是,当我故意不在表单中填写必填字段时--而不是保持表单的显示稳定并显示消息错误--整个事情消失了,只剩下顶部的下拉(齿轮类别)你必须再次重新选择类别--才能看到错误。
另外,如果在获取的“special features”div(id=“itemType”)中有必需的字段,则当用户没有填写这些字段时,错误甚至不会显示出来。 完全忽略@错误! 我在这里做错了什么?
您试图像使用Javascript一样使用Laravel,这是行不通的。
Laravel将只在服务器上处理,这意味着在表单提交时,它通过路由重定向到服务器,在出错时,它将重定向回一个新加载的页面。
因此,当它返回时,它返回到初始的新鲜加载状态,并且因为您正在将表单动态地调用到服务器已经呈现的页面,并且发现不需要输出错误。
所以问题不在于Laravel删除了您的表单并且没有输出错误,而是在于您如何尝试用动态页面实现它。
有几种选择可以尝试做你想做的事情:-
您可以向页面添加一些逻辑,以便在重定向返回时查找一个额外的变量,该变量可以记住状态,加载表单并用数据和错误填充它。
对路由执行AJAX调用以进行验证,并使用javascript promise更新屏幕上的表单。
使用LiveWire之类的东西。