当当前输入等于数组内的值时,Laravel 验证 required_if(带有输入文本的复选框)
Posted
技术标签:
【中文标题】当当前输入等于数组内的值时,Laravel 验证 required_if(带有输入文本的复选框)【英文标题】:Laravel validate required_if when current input equals to a value that is inside an array (checkbox with input text) 【发布时间】:2019-03-03 22:07:14 【问题描述】:我得到了一个带有复选框列表的表单。最后一个说“其他”,点击后会启用输入文本。
我有这条规则,用户最多可以检查三个选项。
如您所知,复选框存储在数组中。
如果用户在不输入输入的情况下选中“其他”选项,我想通过错误消息(验证)提示用户,他们也需要输入输入文本。
这里是options_list.blade.php
查看:
@section('content')
@if($errors->any())
<div class="alert alert-danger" role="alert">
<strong><i class="fas fa-exclamation-triangle"></i> Warning</strong>: The following errors have been found:
<ul>
@foreach($errors->all() as $error)
<li> $error </li>
@endforeach
</ul>
</div>
@endif
<div class="card">
<div class="card-body">
<div class="shadow p-3 mb-5 bg-white rounded">--Referencias: https://getbootstrap.com/docs/4.1/utilities/shadows/--
<p class="h6">
Here goes the question text
</p>
<p class="text-primary">You can choose up to three options</p>
</div>
<div class="shadow">
<form action=" route('survey1.post',$token) " method="post" id="myForm">
<div class="col-lg">
@foreach($lineasdeinvestigacion as $lineadeinvestigacion)
<div class="custom-control custom-checkbox my-1 mr-sm-2">
<input type="checkbox" class="custom-control-input" id="customControlInline $loop->index + 1 " name="lineasdeinvestigacion[]" value=" $lineadeinvestigacion->linea " old('lineasdeinvestigacion') && in_array($lineadeinvestigacion->linea,old('lineasdeinvestigacion')) ? 'checked' : (isset($encuesta) && ($encuesta->fortalecer_linea_1 == $lineadeinvestigacion->linea || $encuesta->fortalecer_linea_2 == $lineadeinvestigacion->linea || $encuesta->fortalecer_linea_3 == $lineadeinvestigacion->linea)) ? 'checked' : '' >
<label class="custom-control-label" for="customControlInline $loop->index + 1 "> $lineadeinvestigacion->linea </label>
</div>
@endforeach
<div class="custom-control custom-checkbox my-1 mr-sm-2">
<input type="checkbox" class="custom-control-input" id="customControlInlineOtro" name="lineasdeinvestigacion[]" value="other" old('lineasdeinvestigacion') && in_array('other',old('lineasdeinvestigacion')) ? 'checked' : (isset($encuesta) && ($encuesta->fortalecer_linea_1 == 'other' || $encuesta->fortalecer_linea_2 == 'other' || $encuesta->fortalecer_linea_3 == 'other')) ? 'checked' : '' >
<label class="custom-control-label" for="customControlInlineOtro">Other</label>
<input placeholder="" type="text" class="form-control form-control-sm" id="fortalecer_otro" name="fortalecer_otro" maxlength="255" value=" old('fortalecer_otro') ? old('fortalecer_otro') : '' " disabled>
</div>
@include('path.to.partials.buttons._continue')-- includes @csrf --
</div>
</form>
</div>
</div>
</div>
@endsection
这里是optionsController.php
:
public function store(Token $token, Request $request)
//dd($request->lineasdeinvestigacion);
//Validating input data
$this->validate($request,[
'lineasdeinvestigacion' => 'nullable|max:3',
'fortalecer_otro' => 'required_if:lineasdeinvestigacion.*,other|max:255',
],[
'lineasdeinvestigacion.max' => 'You cannot choose more than :max options.',
]);
这是从复选框列表 (dd($request->lineasdeinvestigacion);
) 中选择的值数组:
array:4 [▼
0 => "Procesos socio-culturales"
1 => "Ciencia, Innovación tecnológica y Educación"
2 => "Nuevas formas de movilidad"
3 => "other"
]
但是,验证不应该工作,因为它允许输入文本@ 987654331为空,当检查“其他”#customControlInlineOtro
Checkbox选项时。
解决方法
我认为一种解决方法是将数组的最后一项分开,因为要验证的输入,如果 last 项(复选框)具有other
值,并将其添加为另一个要验证的元素,如this answer 中所述。
或者在this one,它谈到验证最后一个。就我而言,我必须计算项目的数量,然后指出要验证数字 x,这将是最后一个项目......
我该如何解决这个问题?有什么想法吗?
已解决
我已经意识到,感谢second link,我应该count the number of items in an array,然后在验证规则中指出,检查值是否为other
,然后应用required_if
:
if($request->lineasdeinvestigacion)
$otro_item = count($request->lineasdeinvestigacion) - 1;
echo '<p>"other" is the item: '.$otro_item.'</p>';
else
echo '<p>Nothing was selected in the checkboxes list</p>';
//dd($request->lineasdeinvestigacion);
//Validating input data
$this->validate($request,[
'lineasdeinvestigacion' => 'nullable|max:3',
'fortalecer_otro' => 'required_if:lineasdeinvestigacion.'.$otro_item.',otro|max:255',
],[
'lineasdeinvestigacion.max' => 'No puede elegir más de :max opciones.',
]);
这样就成功了。
【问题讨论】:
【参考方案1】:我已经意识到,感谢second link,我应该count the number of items in an array,然后在验证规则中指出,检查值是否为other
,然后应用required_if
:
if($request->lineasdeinvestigacion)
$otro_item = count($request->lineasdeinvestigacion) - 1;
echo '<p>"other" is the item: '.$otro_item.'</p>';
else
echo '<p>Nothing was selected in the checkboxes list</p>';
//dd($request->lineasdeinvestigacion);
//Validating input data
$this->validate($request,[
'lineasdeinvestigacion' => 'nullable|max:3',
'fortalecer_otro' => 'required_if:lineasdeinvestigacion.'.$otro_item.',otro|max:255',
],[
'lineasdeinvestigacion.max' => 'No puede elegir más de :max opciones.',
]);
这样就成功了。
【讨论】:
以上是关于当当前输入等于数组内的值时,Laravel 验证 required_if(带有输入文本的复选框)的主要内容,如果未能解决你的问题,请参考以下文章