Как отобразить выбранное значение в раскрывающемся списке, используя Laravel после проверки из запроса? - PullRequest
0 голосов
/ 27 мая 2020

Привет, ребята, я новичок в использовании laravel, и у меня возникают некоторые проблемы при использовании запроса на проверку полей:

  1. Контроллер имеет две модели и загружает информацию об устройстве в раскрывающийся список:
    use App\Channel;  //channel model
    use App\Device;   //device model
    public function create()
    {
        return view('partials.channels.create',[
            'channel' => new Channel,
            'devices' => Device::latest()
        ]);
    }
    public function store(SaveChannelRequest $request)
    {
        Channel::create($request->validated());
        return redirect()->route('channels.index');
    }
  1. Запрос «SaveChannelReques» содержит некоторые правила для добавления информации в базу данных, проверки работают нормально, но при возврате ошибки я не могу загрузить раскрывающийся список:
    public function rules()
    {
        $bypass = $this->channel->id ?? "";
        $rules = [
            'channel' => 'required|unique:channels,channel,'.$bypass.',id',
            'name' => 'required|unique:channels,name,'.$bypass.',id',
            'device' => 'required',
            'description' => 'required',
            'latitude' => 'nullable',
            'longitude' => 'nullable',
            'elevation' => 'nullable',
            'field1' => 'nullable',
        ];
        return $rules;
    }
Просмотр:
<form class="bg-white shadow rounded py-3 px-4" method="POST" action="{{ route('channels.store') }}">
<div class="form-group">
    <label for="device">{{ __('Device') }}</label>
    <select id="device" name="device" class="form-control @error('device') is-invalid @enderror" autocomplete="device">
        <option value="" selected >@lang('Choose')...</option>
        @foreach($devices as $device)
            <option value="{{ old('device', $device->name) }}">{{ old('device', $device->name) }}</option>
        @endforeach
    </select>
    @error('device')
    <span class="invalid-feedback" role="alert">
        <strong>{{ $message }}</strong>
    </span>
    @enderror
</div>
<div class="form-row">
    <div class="form-group col-md-6">
        <label for="channel">{{ __('Channel') }}</label>
        <input id="channel" type="text" class="form-control bg-light shadow-sm @error('channel') is-invalid @enderror" name="channel" value="{{ old('channel', $channel->channel) }}" autocomplete="channel" autofocus>
        @error('channel')
        <span class="invalid-feedback" role="alert">
            <strong>{{ $message }}</strong>
        </span>
        @enderror
    </div>
    <div class="form-group col-md-6">
        <label for="name">{{ __('Name') }}</label>
        <input id="name" type="text" class="form-control bg-light shadow-sm @error('name') is-invalid @enderror" name="name" value="{{ old('name', $channel->name) }}" autocomplete="name" autofocus>
        @error('name')
        <span class="invalid-feedback" role="alert">
            <strong>{{ $message }}</strong>
        </span>
        @enderror
    </div>
</div>
</form>
Изображения

Загрузка страницы в порядке

Поля проверки в порядке

Нет загрузить данные после запроса проверки

Ответы [ 2 ]

1 голос
/ 27 мая 2020

Проблема заключается в вашей обработке old('device', $device->name)
Помните, что должны быть выбраны, их значение представляет собой базовое внутреннее значение

Итак, давайте посмотрим на

    <select id="device" name="device" class="form-control @error('device') is-invalid @enderror" autocomplete="device">
        <option value="" selected >@lang('Choose')...</option>
        @foreach($devices as $device)
            <option value="{{ old('device', $device->name) }}">{{ old('device', $device->name) }}</option>
        @endforeach
    </select>

Первоначально , 'device' пусто, поэтому вы создаете список выбора, который выглядит как

<option value="" selected>...</option>
<option value="{{ $device->name }}>{{ $device->name }}</option>

с выбранной пустой опцией

Однако при ошибке проверки ваш код становится следующим

<option value="" selected>...</option>
<option value="{{ old('device') }}>{{ old('device' }}</option>

, при этом ни один из них не выбран, и все они содержат одинаковые value и display

Итак, вы хотите сделать следующее

  <select id="device" name="device" class="form-control @error('device') is-invalid @enderror" autocomplete="device">
        <option value="">@lang('Choose')...</option>
        @foreach($devices as $device)
            <option {{ old('device') == $device->name ? 'selected="selected"' : '' }} value="{{ $device->name }}">{{ $device->name }}</option>
        @endforeach
    </select>
0 голосов
/ 27 мая 2020

Используйте при ошибке для загрузки правильного значения в раскрывающемся списке:

@foreach($devices as $device) 
   @ if (old('device' ) == $device->name)
        <option value="{{ $device->name}}" selected>{{ $device->name}}</option>
    @else
        <option value="{{ $device->name}}">{{ $device->name}}</option>
    @endif
@endforeach
...