Laravel の blade に form を設置するとよくあることですが、バリデーションでエラーになったときに、以前の入力状態を保持したいわけです。
だいたい、 old('name') を書いておけばいい感じになるんですが、checkbox は、そう簡単にはできなかったです。
とりあえず、保持するとかを考えずに、項目名の配列を @foreach で配置します。
@foreach($checks as $id => $c) <input id="check-{{ $id }}" type="checkbox" name="check[]" value="{{ $id }}" /> <label for="check-{{ $id }}">{{ $c }}</label> @endforeach
他の入力項目でバリデーションエラーが発生するようにして post してみましょう。
エラーが発生しなかったら、この入力フォームも戻ってきてくれませんので。
で、old がどうなっているかを表示するためのコードを追加しておきます。
@foreach($checks as $id => $c) <input id="check-{{ $id }}" type="checkbox" name="check[]" value="{{ $id }}" /> <label for="check-{{ $id }}">{{ $c }}</label> {{ is_array(old('check')) }} @endforeach
みたいにコードを追加してやると、各label のあとに 1 と表示されるのがわかります。
1ということは old('check') は、配列だということです。
では、checked をつけてやる input 要素はどれかという話です。
配列である old('check') 内に、 $id が含まれていれば、その要素は checked をつけないといけません。
とりあえず、含まれているかどうかを確認するために、申す少しコードを追加してみましょう。
old('check') が配列だったら、 in_array($id, old('check)) の値を表示します。
@foreach($checks as $id => $c) <input id="check-{{ $id }}" type="checkbox" name="check[]" value="{{ $id }}" /> <label for="check-{{ $id }}">{{ $c }}</label> {{ is_array(old('check')) }} @if(is_array(old('check))){{ in_array($id, old('check')) }}@endif @endforeach
これを書いて、checkbox に対してチェックを入れつつバリデーションエラーになるようにして post すると、チェックした要素の後ろに 1 が表示されるので、この条件を満たす input 要素に checked を追加すればいいですね。
old('check') が配列である場合、かつ、old('check') に checked をつければよいということです。
@foreach($checks as $id => $c) <input id="check-{{ $id }}" type="checkbox" name="check[]" value="{{ $id }}" @if(is_array(old('check)) && in_array($c, old('check'))) checked @endif /> <label for="check-{{ $id }}">{{ $c }}</label> {{ is_array(old('check')) }} @if(is_array(old('check))){{ in_array($c, old('check')) }}@endif @endforeach
不要なコードを消します。
@foreach($checks as $id => $c) <input id="check-{{ $id }}" type="checkbox" name="check[]" value="{{ $id }}" @if(is_array(old('check)) && in_array($c, old('check'))) checked @endif /> <label for="check-{{ $id }}">{{ $c }}</label> @endforeach
これで、バリデーションエラーになったときに、checkbox のチェック状態を保持できるようになりました。