LoginSignup
12
14

More than 5 years have passed since last update.

Laravelで、チェックボックスをPOSTした後の old() 問題

Last updated at Posted at 2017-07-04

これで3時間くらいハマった。

前提

Laravel 5.1

問題

下記のようなチェックボックスを含む値をPOSTする状況でデフォルト値の設定に悩む。

  • users の編集画面
  • users.is_active = 1 から users.is_active = 0 に変更する
  • users.is_active 用のチェックボックスをONからOFFに変更してPOST
  • 別の項目でバリデーションに引っかかり、入力画面に戻る
  • users.is_active 用のチェックボックスはOFFになっていてほしい

残念ながら、チェックボックスはONになっている。

<input type="checkbox" {{ (old('is_active', $user->is_active) ? 'checked' : '' }}>

としても、 old('is_active', $user->is_active) は、チェックボックスをOFFにしていると old('is_active')null のため、デフォルトの $user->is_active が呼ばれてチェックが付いてしまう。

これと同じ問題。

解決策

Laravel Collective とか使えばいいのだろうか。試していないが同じ問題が起きそうなのでやめた。

ちょっとださいが、仕方がないので下記ヘルパーを作って解決した。

app/helpers.php
function is_checked(string $name, $value, $default) : string
{
    $current_defaults = Input::old() ? old($name, 0) : $default;
    return ($value == $current_defaults) ? 'checked' : '';
}
resources/views/user/edit.blade.php
<input type="checkbox" name="is_acrive" value="1" 
       {{ is_checked('is_active', 1, $user->is_active) }}>

Multiple checkbox version:

app/helpers.php
function is_checked_multiple(string $name, $value, $defaults) : string
{
    $current_defaults = Input::old() ? old($name, []) : (array)$defaults;
    return in_array($value, $current_defaults) ? 'checked' : '';
}
resources/views/user/plans/edit.blade.php
@foreach ($plans as $plan)
    <input type="checkbox" name="plans[]" value="{{ $plan->id }}" 
           {{ is_checked_multiple('plans', $plan->id, $user->plans->pluck('id') }}>
@endforeach

== の曖昧比較なのは、 old() の値は文字列になるから。

追記

@nunulk さんのご指摘の通り、 laravelcollective/html では問題なく動作することを確認できました。
記述も短くなるしこれ使った方がいいな・・・

12
14
1

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
12
14