人気のPHP WEBアプリケーションフレームワークLaravelのTipsを記録していきます

Laravelの Blade でドロップダウンリスト(selectボックス)の任意の項目だけ選択不可能にする

● 1. Laravelの Blade でドロップダウンリスト(selectボックス)の全体を選択不可能にする

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 になります。

● 2. Laravelの Blade でドロップダウンリスト(selectボックス)の任意の項目だけ選択不可能にする

全体じゃなくて特定の <option>項目だけ選択できないようにしたいという時がたまにあります。 その場合は以下のようにフォームマクロを作成すると簡単にできます。

2-1. FormMacroServiceProvider の作成

次のコマンドを実行します

php artisan make:provider FormMacroServiceProvider

コマンドが実行されると app/Providers/FormMacroServiceProvider.php が自動生成されます。

2-2. FormMacroServiceProvider.phpにファイルを追記する

boot() メソッド内に以下を追加します

    public function boot()
    {
        // この行を追記する ↓
        require base_path() . '/resources/macros/selectbox.php';
    }

2-3. config/app.php の providers に登録する

  'providers' => [
        // この行を追記する ↓
        App\Providers\FormMacroServiceProvider::class,
  ]

2-4. macros ディレクトリを作成する

mkdir ./resources/macros

2-5. ファイル /resources/macros/selectbox.php を以下の内容で保存する

<?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;
});

2-6. Bladeテンプレートに記述する

今まではこのように記述してドロップダウンリストを生成していたと思いますが次のように書き換えます

{{Form::select('size', ['L' => 'Large', 'M' => 'Medium', 'S' => 'Small'], 'S')}}

   ↓

{!! Form::mySelectBox('size', ['L' => 'Large', 'M' => 'Medium', 'S' => 'Small'], 'S', [], ['L' => 'disabled']) !!}

このようなドロップダウンリストが生成されます。 (Largeだけ選択出来ないようになりました)

添付ファイル1
No.1392
12/13 15:02

edit

添付ファイル