6
3

More than 3 years have passed since last update.

ラジオボタンやチェックボックスを三項演算子でcheckedを維持する。LaravelのBlade対応。validationでのリダイレクトでも維持

Last updated at Posted at 2021-05-22

結論はこれ

<input type="radio" name="test" value="1"
        {{ old("test") == 1 ? "checked" : "" }} />

結論上の通りです。
{{ }}の中に三項演算子の内容を記述する。

{{ 条件 ? true : false }}

old()でリダイレクト前の回答を取得しています。

{{ old('nameの名前') ? "checked" : "何もしない" }}

他の書き方を知る

@ifを使う

@ifを使う
@if(条件) checked @enfif 
@ifを使った場合
<input type="radio" name="test" value="1" @if(old("test") == 1) checked @endif />

nameが配列の場合

下記のように、nameを配列で管理したい場合がある。

nameが配列の場合
<input type="checkbox" name="test_ids[]" value="{{ $test_id }}">

この場合はどうすればよいでしょうか?

STEP1:条件を入れる

三項演算子の場合
<input type="checkbox" name="test_ids[]" value="{{ $test_id }}" 
 {{ in_array((int)$testId, old('test_ids')) ? checked : "" }}>
@ifの場合
<input type="checkbox" name="test_ids[]" value="{{ $test_id }}" 
 @if(in_array((int)$testId, old('test_ids')) checked @endif>

- ポイント:[]はいらない。old('配列')で配列を取得
- in_array(配列に含まれているか確認したいターゲット, 配列)でtrue, falseでチェック

STEP2:old()の引数を増やす

old()ですが、投稿後は表示可能ですが、投稿する前はデータがないので表示できず、エラーの原因になります。
そのため、第二引数にデフォルト値を追加します

old()の理解を深める
old(表示させたいname, デフォルト値第一引数がない場合に使用)

この第二引数は、editなどの編集画面でよく使います。

@ifの場合
<input type="checkbox" name="test_ids[]" value="{{ $test_id }}" 
 @if(in_array((int)$testId, old('test_ids', $data['test_ids'])) checked @endif>

こうすることで、old('test_ids')がnullでも$data['test_ids']があるので、in_array()が実行されます。
しかし、まだエラーの要因があります

STEP3:型を揃える

コードの補完性を高めるために、型を指定したいはずです。その手順をお伝えしていきます

in_arrayの型まで厳密にさせる
in_array(配列に含まれているか確認したいターゲット, 配列, true)

trueを入れない場合、 "=="で実行されます。文字の場合は文字数がintとされてしまいます。
つまり、通って欲しく無い場合も通過します
なので、 型まで厳密にチェックする"==="を利用したいです。そこでtrueを追加します

@ifの場合
<input type="checkbox" name="test_ids[]" value="{{ $test_id }}" 
 @if(in_array((int)$testId, old('test_ids', $data['test_ids']), true) checked @endif>

これで型までチェックされるようになります。
そうするとエラーが発生します。

配列の型を指定する(キャスト)

old('name')で取得した値はstring型です。
なので、

配列によって型が違う
old('test_ids', $data['test_ids'])
// old('string型の配列', 'int型の配列')

のように、配列の中身の値が、"string"と"int"で違う場合があります。
こうなると

in_arrayの型まで厳密にさせる
in_array(配列に含まれているか確認したいターゲットint型, old("string"の配列, intの配列), true)

のように、第一引数がint型の場合、old('test_ids')で取得した配列はstring型のためエラーになります。

なので、配列の型を決めます。

array_mapを理解する
array_map(実行したい関数, 対象の配列)
int型にしたい場合はintval()を実行
array_map('intval', 対象の配列)
array_map('intval', old('test_ids', $data['test_ids']))
string型にしたい場合はstrval()を実行
array_map('strval', 対象の配列)
array_map('strval', old('test_ids', $data['test_ids']))

これで配列の中身を一気にキャスト(型指定)します

ターゲットの型を指定する(キャスト)

配列の中身の型を指定できたところで、ターゲットの中身もキャストしていきましょう

() 対象の値

で型指定します。

intの場合
(int)$testId
stringの場合
(string) $testId

これでターゲットの型を指定できます。
簡単ですよね

これらを合算します

最終的にこうなる
<input type="checkbox" name="test_ids[]" value="{{ $test_id }}" 
 @if(in_array((int)$testId, array_map('intval',old('test_ids', $data['test_ids']))) checked @endif>

これで

 @if(in_array'int型のターゲット', 'int型の配列') checked @endif

が成立します。

初期値でもチェックされますし、oldで投稿後の値でもチェックされます

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3