LoginSignup
6

More than 5 years have passed since last update.

posted at

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

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

  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
What you can do with signing up
6