LaravelCollective の Form::select の 4番目の引数に配列を渡す事で実現できます。
{{ Form::select($name, $select_loop, $selected_value, ['class' => 'my_css_class', 'disabled' => 'disabled']) }}
{{ Form::select('size', ['L' => 'Large', 'S' => 'Small'], 'S', ['disabled' => 'disabled']) }}
引数4番目の配列に 'disabled' => 'disabled' を指定するだけでOKです。
これだけで、ドロップダウンリスト全体が disabled になります。
全体じゃなくて特定の <option>項目だけ選択できないようにしたいという時がたまにあります。 その場合は以下のようにフォームマクロを作成すると簡単にできます。
次のコマンドを実行します
php artisan make:provider FormMacroServiceProvider
コマンドが実行されると app/Providers/FormMacroServiceProvider.php が自動生成されます。
boot() メソッド内に以下を追加します
public function boot()
{
// この行を追記する ↓
require base_path() . '/resources/macros/selectbox.php';
}
'providers' => [
// この行を追記する ↓
App\Providers\FormMacroServiceProvider::class,
]
mkdir ./resources/macros
<?php
Form::macro('mySelectBox', function ($name, $list = [], $selected = null, array $selectAttributes = [], array $optionsAttributes = []) {
$html = '<select name="' . $name . '"';
foreach ($selectAttributes as $k => $v) {
$html .= ' ' . $k . '="' . $v . '"';
}
$html .= ">\n";
foreach ($list as $value => $text) {
$html .= '<option value="' . $value . '"';
if (strcmp($value, $selected) == 0) {
$html .= ' selected="selected"';
}
if (isset($optionsAttributes[$value])) {
$html .= ' ' . $optionsAttributes[$value];
}
$html .= '>' . $text . "</option>\n";
}
$html .= '</select>';
return $html;
});
今まではこのように記述してドロップダウンリストを生成していたと思いますが次のように書き換えます
{{Form::select('size', ['L' => 'Large', 'M' => 'Medium', 'S' => 'Small'], 'S')}}
↓
{!! Form::mySelectBox('size', ['L' => 'Large', 'M' => 'Medium', 'S' => 'Small'], 'S', [], ['L' => 'disabled']) !!}
このようなドロップダウンリストが生成されます。 (Largeだけ選択出来ないようになりました)