Laravel validate required_if, когда текущий ввод равен значению, которое находится внутри массива (флажок с вводимым текстом) - PullRequest
0 голосов
/ 28 сентября 2018

Я получил форму со списком флажков.Последний из них говорит «прочее», при нажатии входной текст включается.

У меня есть это правило, где пользователь может проверить до трех вариантов.

Как вы уже знаете, флажкихранится в массиве.

Если пользователь выберет опцию "other", не вводя введенные данные, я хочу предложить пользователю с помощью сообщения об ошибке (проверка), что ему нужно ввести текст ввода,а также.

Вот 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->lineasdeinvestigacion);):

array:4 [▼
  0 => "Procesos socio-culturales"
  1 => "Ciencia, Innovación tecnológica y Educación"
  2 => "Nuevas formas de movilidad"
  3 => "other"
]

Однако проверка не работает должным образом, так как позволяет пустому входному тексту #fortalecer_otro, когда "other" #customControlInlineOtroфлажок установлен.


Путь к решению

Я думаю, что одним из обходных путей было бы отделить последний элемент массива, так как вход для проверки,если элемент last (флажок) имеет значение other, и добавьте его как другой элемент в bПодтверждено, как указано в этом ответе .

Или в этом , речь идет о проверке последнего.В моем случае мне нужно было бы подсчитать количество элементов, а затем указать, чтобы подтвердить число x, которое будет последним элементом ...


Как это исправить?Есть идеи?


Решено

Я понял, благодаря второй ссылке , что я должен посчитать количествоэлементы в массиве и затем указывают в правилах проверки, какой элемент проверяет, имеет ли значение 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 Ответ

0 голосов
/ 29 сентября 2018

Я понял, благодаря второй ссылке , что я должен посчитать количество элементов в массиве и затем указать в правилах проверки, какой элемент проверяет, является ли значение 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.',
        ]);

И это сработало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...