Директива selected
Директива selected в Blade предназначена для упрощения работы с выпадающими списками. Она принимает условие и, если оно возвращает true, добавляет атрибут selected к элементу option. Это особенно полезно при заполнении форм данными из базы данных или при сохранении состояния выбора после отправки формы.
Синтаксис
<option value="{{ $value }}" @selected($condition)>
{{ $label }}
</option>
Параметр $condition может быть любым выражением PHP, возвращающим логическое значение. Если условие истинно, атрибут selected будет добавлен к тегу.
Пример ⁅n="sect"⁆
Рассмотрим простой пример с фиксированным списком городов. Выберем город по умолчанию:
<select name="city">
<option value="moscow" @selected($defaultCity === 'moscow')>Москва</option>
<option value="spb" @selected($defaultCity === 'spb')>Санкт-Петербург</option>
<option value="kazan" @selected($defaultCity === 'kazan')>Казань</option>
</select>
Если в контроллере передать переменную $defaultCity со значением 'spb', то будет выбран Санкт-Петербург.
<?php
namespace AppHttpControllers;
use IlluminateHttpRequest;
class CityController extends Controller
{
public function index()
{
$defaultCity = 'spb';
return view('city', ['defaultCity' => $defaultCity]);
}
}
?>
Результат выполнения кода:
<select name="city">
<option value="moscow">Москва</option>
<option value="spb" selected>Санкт-Петербург</option>
<option value="kazan">Казань</option>
</select>
Пример ⁅n="sect"⁆
Используем директиву selected с данными из модели User. Выведем список ролей с выбором текущей роли пользователя:
<select name="role_id">
@foreach ($roles as $role)
<option value="{{ $role->id }}" @selected($role->id === $user->role_id)>
{{ $role->name }}
</option>
@endforeach
</select>
В контроллере передаём данные пользователя и список доступных ролей:
<?php
namespace AppHttpControllers;
use AppModelsUser;
use AppModelsRole;
use IlluminateHttpRequest;
class UserController extends Controller
{
public function edit($id)
{
$user = User::findOrFail($id);
$roles = Role::all();
return view('user.edit', ['user' => $user, 'roles' => $roles]);
}
}
?>
Результат выполнения кода для пользователя с ролью 2:
<select name="role_id">
<option value="1">Admin</option>
<option value="2" selected>Editor</option>
<option value="3">User</option>
</select>
Пример ⁅n="sect"⁆
Директиву selected можно использовать с более сложными условиями. Например, выберем несколько вариантов из многомерного массива:
<select name="categories[]" multiple>
@foreach ($categories as $category)
<option value="{{ $category->id }}" @selected(in_array($category->id, $selectedCategories))>
{{ $category->name }}
</option>
@endforeach
</select>
В контроллере формируем список выбранных категорий:
<?php
namespace AppHttpControllers;
use AppModelsCategory;
use IlluminateHttpRequest;
class ProductController extends Controller
{
public function filter(Request $request)
{
$categories = Category::all();
$selectedCategories = $request->input('categories', [1, 3, 5]);
return view('products.filter', [
'categories' => $categories,
'selectedCategories' => $selectedCategories
]);
}
}
?>
Результат выполнения кода для массива выбранных категорий [1, 3, 5]:
<select name="categories[]" multiple>
<option value="1" selected>Electronics</option>
<option value="2">Clothing</option>
<option value="3" selected>Books</option>
<option value="4">Food</option>
<option value="5" selected>Toys</option>
</select>
Смотрите также
-
директива
checked,
которая аналогично работает с атрибутомcheckedдля чекбоксов и радиокнопок -
директива
disabled,
которая условно добавляет атрибутdisabledк элементам форм -
директива
required,
которая добавляет атрибутrequiredк полям ввода -
директива
readonly,
которая условно добавляет атрибутreadonlyк полям ввода