当当前输入等于数组内的值时,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>&nbsp;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-&gt;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(带有输入文本的复选框)的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 验证在更新相同的唯一值时抛出错误

Laravel 验证:存在附加列条件 - 自定义验证规则

如果 Laravel 中的值不为空,如何验证输入字段

为啥 ofstream 在存储字符串的值时会避免前 4 个字符?

Laravel 表单请求动态字段在重定向时消失

如何使用 proengsoft/laravel-jsvalidation 和 Laravel 5 验证数组输入