オブジェクト指向とかデザインパターンとか開発プロセスとかツールとか

satoshi's ソフトウェア開発

js






当サイトはアフィリエイト広告を利用してます。

Laravel

Laravelのbladeに設置したformでcheckboxにold値を反映させる方法

更新日:


 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 のチェック状態を保持できるようになりました。







-Laravel
-, , , ,

Copyright© satoshi's ソフトウェア開発 , 2024 All Rights Reserved Powered by STINGER.