タイトルがわかりにくいので整理すると
- Laravel CollectiveのFormヘルパーでselectboxを実装すると「一番最初にvalueがnullでdisableでselectedなoption」が作れない
- 最終的に作りたいのは以下のような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]]) !!}
参考