【Laravel-admin】チェックボックスがcheckedにならない不具合対応

laravel-adminのformに不具合がありましたので
内容と解決策を備忘録がてらメモ
laravel:6.20
laravel-admin:1.7
どうやら、前回修正した内容では不十分だったようです。
laravel-admin 編集画面でcheckboxをchekcedにする

Laravel-admin不具合の内容

会員登録などでチェックボックスを用いた会員属性を設定したとします。
下記のように登録フォームを作成し、登録を完了します。
Laravel-admin formでのチェックボックス登録
DBには正しく登録されていることを確認
次に編集画面に遷移してみると
Laravel-admin formでのチェックボックス登録後

なぜか

最初のチェックボックスにのみチェックが入らない
formの処理が怪しいので、確認していきます。

解決方法

最初のチェックボックスのみ、chekedがついておりません。
すべての項目にチェックを付けた場合、DB上は下記のように登録されております。
["0","1","2"]
「0」の場合にチェックがつかないということですね。

ソース

こちらが修正前のソース
修正箇所を明示するために不自然に改行しております。
4行目辺りがcheckedの判定ロジックであることが分かります。
ここで使っている「array_filter」を調べてみると、第二引数の説明で

コールバック関数が与えられなかった場合、arrayのエントリの中で空のものはすべて削除されます。

と記述があります。これが原因ですね。
「0」が空と判断されて、削除されているようです。
ということで、第二引数にコールバック関数を与えます。
<input type="checkbox" name="{{$name}}[]" value="{{$option}}" class="{{$class}}" 
{{ false !== array_search($option, 
array_filter(old($column, $value ?? []))) 
|| (in_array($option, $checked)) ?'checked':'' }} {!! $attributes !!} />{{$label}}
各数字に対してtrueを返してくれればなんでもいいのですが
今回はis_numericを利用しました。
<input type="checkbox" name="{{$name}}[]" value="{{$option}}" class="{{$class}}" 
{{ false !== array_search($option, 
array_filter(old($column, $value ?? []),'is_numeric')) 
|| (in_array($option, $checked)) ?'checked':'' }} {!! $attributes !!} />{{$label}}
これで問題なく選択済み項目については「checked」がつくようになりました。

コメントを残す