Laravel Dcat实现表单内选择不同的类型,显示相关必填的字段
效果
$this->radio('type', '选择类型')
->options([1 => '所有用户', 2 => '部分用户', 3 => '指定会员卡类型'])
->default(1)
->required()
->when(2, function (Form $form) {
$form->file('member_file', '会员手机号文档')
->accept('xls,xlsx,csv')
->rules('mimes:xls,xlsx,csv');
})
->when(3, function (Form $form) {
$form->select('vip_type', '会员卡类型')
->options(WatchVipLevel::query()
->pluck('name', 'level')
->all());
});
when中无法增加required验证,换一种方式实现
protected function validateInput(array $input): \Illuminate\Contracts\Validation\Validator
{
$rules = [
'type' => 'required|integer|in:1,2,3',
];
switch ($input['type']) {
case 2:
$rules['member_file'] = 'required|file|mimes:xls,xlsx,csv';
break;
case 3:
$rules['vip_type'] = 'required|integer|exists:public-watch.watch_vip_level_config,level';
break;
}
$messages = [
'member_file.required' => '请上传文件',
'vip_type.required' => '请选择会员卡',
];
return Validator::make($input, $rules, $messages);
}
$validator = $this->validateInput($input);
if ($validator->fails()) {
return $this->response()->error($validator->errors()->first());
}
大佬指点后的做法
$this->radio('type', '选择类型')
->options([1 => '所有用户', 2 => '部分用户', 3 => '指定会员卡类型'])
->default(1)
->required()
->when(2, function (Form $form) {
$form->file('member_file', '会员手机号文档')
->accept('xls,xlsx,csv')
->rules('required_if:type,2|mimes:xls,xlsx,csv', ['required_if' => '请上传导入文件', 'mimes' => '文件格式错误'])
->setLabelClass(['asterisk']);
})
->when(3, function (Form $form) {
$form->select('vip_type', '会员卡类型')
->options(WatchVipLevel::query()->pluck('name', 'level')->all())
->rules('required_if:type,3', ['required_if' => '请选择会员卡'])
->setLabelClass(['asterisk']);;
});
本作品采用《CC 协议》,转载必须注明作者和本文链接