Настраиваемое сообщение Laravel для точечной нотации с подстановочными знаками (*) - PullRequest
1 голос
/ 29 июня 2019

При определении валидации для, скажем, элементов формы, имеющих одинаковое имя массива, мы используем подстановочный знак (*) с точечной нотацией

Допустим, у вас есть форма, как показано:

<input type="text" name="client_type[]" class="form-control" value="Panelist" readonly>
<input type="number" name="commission_percentage[]" class="form-control">

<input type="text" name="client_type[]" class="form-control" value="Non Panelist" readonly>
<input type="number" name="commission_percentage[]" class="form-control">

Чтобы проверить поле commission_percentage, мы сделаем это в классе запроса формы:

public function rules()
{
   $rules = [];

   $rules['commission_percentage.*'] = 'required';

   return $rules;
}

Из приведенной выше формы, отправка ее в пустом виде приведет к появлению следующего сообщения об ошибке проверки:

The commission_percentage.0 field is required. 
The commission_percentage.1 field is required

Сообщение об ошибке проверки будет повторяться дважды, поскольку массив commission_percentage из формы имеет 2 значения. Теперь представьте случай, когда массив имеет несколько значений, сообщение об ошибке проверки будет повторяться каждый раз!

Так что вопрос: есть ли обходной путь для этого, чтобы вместо повторяющегося сообщения об ошибке валидации n количество раз, у нас было одно сообщение об ошибке валидации, которое будет выводиться и представлять все элементы в одном массиве

Спасибо.

Ответы [ 2 ]

0 голосов
/ 29 июня 2019

Итак, ответ @ nakov выше вдохновил это решение:

Я использую ajax, чтобы опубликовать мою форму.Чтобы избежать сообщений об ошибках проверки +n для значений одного и того же массива:

$.ajax({
        url: postUrl,
        type: 'POST',
        data: formData,
        cache: false,
        contentType: false,
        processData: false
    })
    .done(function( data ) {
     //
    })
    .fail(function(data) {
        if( data.status === 422 ) 
        {
            var errorResponse = JSON.parse(data.responseText);

            var errors= '';
            errors += '<ul>';
            var commissionError = '';

            $.each( errorResponse.errors, function( key, value ) {       


                if (key.indexOf('commission_percentage') > -1)
                {
                    commissionError  = value;

                }
                else
                {
                    errors += '<li>' + value + '</li>';
                }
            });

            commissionError = '<li>' + commissionError + '</li>';
            errors = errors + commissionError;
            errors += '</ul>';

            $('#role-errors').children('.alert').html(errors).css({ 'display':'block', 'padding': '1rem' });
        }

Итак, я определил переменную commissionError, проверил наличие ключа commission_percentage, как определено в моей формезапросите правило, захватите значения, которые соответствуют, и отобразите его вне моего цикла следующим образом:

commissionError = '<li>' + commissionError + '</li>';

Затем объедините с основной строкой errors, как показано:

errors = errors + commissionError;

И это все!Теперь все обязательные атрибуты в commission_percentage представлены одним сообщением об ошибке проверки.Ухоженная!

0 голосов
/ 29 июня 2019

Я думаю, что вы можете переопределить метод сообщений в запросе формы и добавить одно сообщение, например:

public function messages()
{
    return [
        'commission_percentage.*' => 'Your field is required'
    ];
}

Затем, чтобы использовать его в представлении, вы должны исключить его из цикла $errors->any(), но получить его как одну ошибку, подобную этой:

@if ($errors->has('commission_percentage.*'))
    <div class="help-block">
        <ul role="alert">
           <li>{{ $errors->first('commission_percentage.*') }}</li>
        </ul>
    </div>
@endif
...