Posted at

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

More than 1 year has passed since last update.

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


  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]]) !!}


参考

https://laravelcollective.com/docs/5.3/html#custom-macros