メインコンテンツへスキップ

blocs/blocs: 選択肢フォーム(radio / checkbox / select)

blocs/blocs: 選択肢フォーム(radio / checkbox / select)

selectradiocheckbox は、テンプレートから選択肢(menu)を JSON キャッシュに登録し、表示・保存・確認画面のラベル変換に使われます。定義ファイル自動生成(No.3.1)以外で手書きテンプレートを作る場合の記法です。

共通の仕組み

コンパイル時に <select> / <option> / <input type="radio|checkbox"> を解析し、menu キーへ選択肢一覧を保存します。確認画面でのラベル表示は No.2.2 の val() / data-val の menu 変換が使われます。

複数 checkbox の値は、保存時にタブ区切り\t)の1文字列にまとめられます(BaseprepareRequest())。

select(プルダウン)

<select> 内の <option> から選択肢が抽出されます。

<select name="category" class="form-control">
    <option value="">選択してください</option>
    <option value="a">カテゴリA</option>
    <option value="b">カテゴリB</option>
</select>

動的に選択肢を追加する場合は addOption()(No.5.2)を併用します。

radio(単一選択)

<div class="form-check">
    <input class="form-check-input" type="radio" name="type" value="a" id="type_a">
    <label class="form-check-label" for="type_a">タイプA</label>
</div>
<div class="form-check">
    <input class="form-check-input" type="radio" name="type" value="b" id="type_b">
    <label class="form-check-label" for="type_b">タイプB</label>
</div>

編集画面で初期選択を付けるには checked 属性を data-attribute で付与します(develop の form.html 参照)。

checkbox(複数選択)

name は配列形式(name[])にします。

<div class="form-check">
    <input class="form-check-input" type="checkbox" name="role[]" value="admin" id="role_admin">
    <label class="form-check-label" for="role_admin">管理者</label>
</div>
<div class="form-check">
    <input class="form-check-input" type="checkbox" name="role[]" value="member" id="role_member">
    <label class="form-check-label" for="role_member">メンバー</label>
</div>

DB には "admin\tmember" のようにタブ区切りで保存するのが BLOCS 管理画面の慣例です(No.1.2 の role カラム参照)。

checked / selected の自動付与

コンパイル後の PHP では Common::addChecked() が呼ばれ、現在の値と一致する radio / checkbox に checked、select の option に selected が付与されます。コントローラーから $val に値を渡すか、編集画面で old() / モデル値がセットされていれば反映されます。

バリデーション

選択肢にも No.2.10 の data-validate(コメント記法)が使えます。

<!-- !category="required" data-lang="カテゴリは必須です。" -->
<select name="category">...</select>
@error("category") <div class="invalid-feedback">{{ $message }}</div> @enderror

関連ナレッジ