10
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ラジオボタンのバリデーションエラー時の値の保持で悩んだ話

Posted at

背景

今回の共同開発においてラジオボタンを実装をする必要があったがラジオボタンを実装した経験がなくどのようにするのがわからず苦労したのでそのことについてまとめていく。

仕様

  • カテゴリーは「Laravel」「PHP」「Docker」「web基礎」とする。
  • バリデーションがエラーになった場合は画面をリダイレクトする。
  • この際に値を保持する。(これに悩まされた。)

ラジオボタンについて

サンプルコード

<input type="radio" name="example" value="サンプル">サンプル

<label>を用いれば丸い箇所だけではなく、文字の部分をクリックしても選択することができる。
この場合<input>idを、<label>forを用いてお互いを同じ名前で紐付けしておく必要がある。

type="radio" ・・・ radioを指定すると作成できる。
name=" " ・・・ 複数のラジオボタンを作成する場合同じ名前にすると他の部分を選択したときに自動的に選択が解除される。
value= " " ・・・ 選択されているときに送信される内容。必須。
checked ・・・ この属性が指定されたラジオボタンは最初から選択された状態になる。(グループの中で一つだけ)

実際のコード

create.php
<div class="form-check form-check-inline">
    <input class="form-check-input" type="radio" name="category_id" id="category1" value="1" {{ old('category_id') == 1 ? 'checked' : '' }}/>
    <label class="form-check-label" for="category1">Laravel</label>
</div>
<div class="form-check form-check-inline">
    <input class="form-check-input" type="radio" name="category_id" id="category2" value="2" {{ old('category_id') == 2 ? 'checked' : '' }}/>
    <label class="form-check-label" for="category2">PHP</label>
</div>
<div class="form-check form-check-inline">
    <input class="form-check-input" type="radio" name="category_id" id="category3" value="3" {{ old('category_id') == 3 ? 'checked' : '' }}/>
    <label class="form-check-label" for="category3">Docker</label>
</div>
<div class="form-check form-check-inline">
    <input class="form-check-input" type="radio" name="category_id" id="category4" value="4" {{ old('category_id') == 4 ? 'checked' : '' }}/>
    <label class="form-check-label" for="category4">web基礎</label>
</div>

バリデーションエラー時の値の保持

Laravelにおいてバリデーションエラー時の値の保持はグローバルヘルパ関数のoldを用いることで利用できる。

 <input type="text" name="title" value="{ old('フォームのキー名')}"

この場合ではold('title')とすれば入力されたタイトルが保持される。
ここまではわかっていたがラジオボタンの場合どうやって値を保持するのかがわからなく苦戦。最終的には三項演算子を用いるという答えにたどり着いた。

三項演算子とは

条件式 ? 真の場合 : 偽の場合

条件式を評価してその答えが真であれば真の場合の式を返し、偽の場合は偽の場合の式を返す。

example.php
<?php
  $var = 100;
  $str = ($var % 10 === 0) ? 10の倍数である : 10の倍数でない;
  echo $var."は".$srt;
 
 ///結果)100は10の倍数である
 ?>

つまりはIF文と同じだが、IF文と違って一文でまとめられてスッキリしており、加えて上記のように変数に代入することもできるメリットが有る。

実際に使ってみた

 <input class="form-check-input" type="radio" name="category_id" id="category1" value="1" {{ old('category_id') == 1 ? 'checked' : '' }}/>

ざっくりと表すと

{{ category_idが選択されているかいないか比較 ? checked : なにも選択しない }}

ということになる。三項演算子ってこういう風に使うのかと感動。

参考

10
7
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
10
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?