LoginSignup
6

More than 5 years have passed since last update.

LaravelのFormヘルパーでセレクトボックスにdisabledの選択肢を追加する

Posted at

タイトルがわかりにくいので整理すると

  1. Laravel CollectiveのFormヘルパーでselectboxを実装すると「一番最初にvalueがnullでdisableでselectedなoption」が作れない
  2. 最終的に作りたいのは以下のようなHTMLだが、これだとold()処理をいちいち書くのはめんどくさい
<select name="color" multiple>
  <option value="" disabled selected>選択してください。</option>
  <option value="red">Red</option>
  <option value="blue">Blue</option>
  <option value="green">Green</option>
</select>

Form::macro()を使うといいらしい。

サービスプロバイダーを追加する

$ php artisan make:provider FormMacroServiceProvider
app/Providers/FormMacroServiceProvider.php
<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class FormMacroServiceProvider extends ServiceProvider
{
  /**
   * Bootstrap the application services.
   * @return void
   */
  public function boot()
  {
    // 追記
    require base_path() . '/resources/macros/selectbox.php';
  }

  /**
   * Register the application services.
   * @return void
   */
  public function register()
  {
    //
  }
}
config/app.php
  'providers' => [
    App\Providers\FormMacroServiceProvider::class,
  ]

macroの作成

resources/macros/selectbox.php
<?php
Form::macro('mySelectBox', function($name, $options, $attributes = []) {
  $old = old(preg_replace('/(\[\])\z/', '', $name));

  $html = '<select name="' . $name . '"';
  foreach($attributes as $attribute => $value) {
    $html .= ' ' . $attribute . '="' . $value . '"';
  }
  $html .= '><option value="" disabled selected>選択してください。</option>';

  foreach($options as $value => $text) {
    $html .= '<option value="' . $value . '"';

    if(is_array($old)) {
      $html .= (in_array($value, $old) ? ' selected="selected"' : '');
    } else {
      $html .= ($value == $old ? ' selected="selected"' : '');
    }

    $html .= '>' . $text . '</option>';
  }

  $html .= '</select>';

  return $html;
});

作ったmacroを使う

{!! Form:: mySelectBox('colors[]', ['Red' => 'red', 'Blue' => 'blue', 'Green' => 'green', ['multiple' => true]]) !!}

参考

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