BETA

laravel5.8¦複数チェックボックスでoldを使用してバリデーションエラー時にcheckedをつける

投稿日:2020-04-03
最終更新:2020-04-02

bladeファイルのチェックボックスに難航したのでまとめ‥

やりたいこと

・チェックボックスは複数
・バリデーションエラーになった場合にチェックボックスの内容をチェックしたままにしたい

参考にさせていただきました!
Laravel チェックボックスのchecked="checked"はどうやって表示させるの?

環境
・laravel 5.8
・php 7.2

チェックボックスのデータについて

今回のチェックボックス用のデータですがDBにあるデータを使用しており、キーがid/値が名前の連想配列を使用しています。

$allRoomTypes = array(  
  1 => Single,  
  2 => Double,  
  3 => Twin,  
  4 => Triple,  
  5 => Suite,  
  6 => Connecting rooms  
);  

is_arrayとin_arrayをつかう

調べるとよくでてきますね!name=type[]とします。

{{ is_array(old(‘type’)) && in_array($id, old(‘type’), true)? ‘checked=“checked”’ : ‘’ }}  

oldだとstringになってしまうようで、特に何もおこらず、
in_arrayの中で型をin_array($id, (int)old(‘type’), true)のように指定するとエラーになります( ´ ` )

in_array() expects parameter 2 to be array, int given  

ハイ...
色々試行錯誤してみたもののうまくいかず、期待していた動作になりませんでした( ´ ` )

修正してみた

is_arrayとin_arrayでうまくいかなかったので、is_arrayとarray_keysにしました。

 @foreach($allRoomTypes as $id => $allRoomType)  
   <input type="checkbox" name="type[]" id="{{ $allRoomType }}" value="{{ $id }}"@if($errors->any()){{ is_array(old('type')) && array_keys(old('type'), $id)? 'checked="checked"' : '' }}@endif/>  
   <label for="{{ $allRoomType }}">{{ $allRoomType }}</label>  
 @endforeach  

蛇足ですが、、、
編集画面のときはDBに保存してある値を表示させ、バリデーションエラー時は直前の入力内容を反映させたいですよね🐍
その時は$roomTypesにDBに保存している値を入れておいてin_arrayで比較したところできました👌

  @foreach($allRoomTypes as $id => $allRoomType)  
    <input type="checkbox" name="type[]" id="{{$allRoomType}}" value="{{ $id }}"  
@if($errors->any()){{ is_array(old('type')) && array_keys(old('type'), $id)? 'checked="checked"' : '' }}@else{{ in_array($id, $roomTypes, true)? 'checked="checked"' : '' }}@endif/>  
    <label for="{{$allRoomType}}">{{ $allRoomType }}</label>  
  @endforeach  

 

🐍🐍🐍    

bladeのチェックチェックなかなか厄介ですね( ´ ` )
なんとか今回はつけたのですが、もっといい方法がある気がする‥

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

メモしていきますφ('ᴗ'」)

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう