Reputation: 1950
I am submitting an array of inputs to my controller like so:
<input id="box-1-nickname" name="box-nickname[]" class="form-control" type="text" placeholder="Required">
<input id="box-2-nickname" name="box-nickname[]" class="form-control" type="text" placeholder="Required">
I am doing some validation like this:
$validator = Validator::make(Input::all(), array(
'supplies-count' => 'required|in:0,1,2,3,4',
));
$arrayValidator = Validator::make(Input::all(), []);
$arrayValidator->each('box-nickname', ['required|min:1|max:60']);
if( $validator->fails() || $arrayValidator->fails() ) {
return Redirect::route('route-2')
->withErrors($arrayValidator)
->withInput();
}
The problem is when I try to check the errors like this it doesn't work:
if( $errors->has('box-1-nickname') ) { echo ' has-error'; }
Upvotes: 5
Views: 30811
Reputation: 421
To get the first validation error for an input array:
{{ $errors->first('input_array.*') }}
To check if there is an error within an input array:
@if($errors->has('input_array.*'))
<h1>There is an error in your input array</h1>
<ul>
@foreach($errors->get('input_array.*') as $errors)
@foreach($errors as $error)
<li>{{ $error }}</li>
@endforeach
@endforeach
</ul>
@endif
Other examples:
@error('input_array.*')
<div class="alert alert-danger">{{ $message }}</div>
@enderror
If you are validating an array form field, you may retrieve all of the messages for each of the array elements using the * character:
foreach ($errors->get('attachments.*') as $message) {
//
}
Hope it helps!
Upvotes: 15
Reputation: 424
You've probably long found a solution, but for anyone else who stumbles across this:
The validator uses array dot notation of the field array keys. For example box-nickname[0]
becomes box-nickname.0
Therefore if( $messages->has('box-nickname.0') ) { echo ' has-error'; }
should give you your desired result. However, you will need to dynamically generate the array key since as you've said, you won't know how many box-nicknames are being applied. I use this in my form view:
@if(!is_null(Input::old('box-nickname')))
@foreach(Input::old('box-nickname') as $n => $box-nickname)
@include('box-nickname-create-form-partial')
@endforeach
@endif
Then create a partial view called "box-nickname-create-form-partial.blade.php" or whatever you want to call it with the form field, which might look something like this:
<div class="form-group {!! $errors->has('box-nickname.'.$n) ? ' has-error' : '' !!}">
<input name="box-nickname[{{$n}}]" class="form-control" type="text" placeholder="Required">
</div>
I hope that's helpful.
Upvotes: 3
Reputation: 8528
$errors
is correct, but you should be checking for box-nickname
. As you can see you will run into the issue of not being able to identify what box is what because of the generic name. I think the easiest way to to give each input a unique name (eg. box-1
, box-2
)and do a for loop on the server side to retrieve inputs that start with box-
.
Upvotes: 0
Reputation: 6381
The errors are collected by name
property, not id
, and Laravel's default MessageBag variable is $messages
, not $errors
:
if( $messages->has('box-nickname') ) { echo ' has-error'; }
http://laravel.com/docs/4.2/validation#working-with-error-messages
Upvotes: 0