使用 Laravel / Blade 中的旧输入定义所选选项

Define the selected option with the old input in Laravel / Blade

我有这个代码:

<select required="required" class="form-control" name="title">
    <option></option>
    @foreach ($titles as $key => $val)
        @if (stristr($key, 'isGroup'))
            <optgroup label="{{ $val }}">
        @else
        <option value="{{ $key }}">{{ $val }}</option>
        @endif
    @endforeach
    </select>

因此,当表格有错误时,我使用行 Redirect::route('xpto')->withInput()->withErrors($v)。但我无法重新填充 select 字段。例如,有什么方法可以不使用 JavaScript 来做到这一点?

解决方案是使用 Blade Directives - If Statements.

Input::old()$key 变量进行比较
@if (Input::old('title') == $key)
    <option value="{{ $key }}" selected>{{ $val }}</option>
@else
    <option value="{{ $key }}">{{ $val }}</option>
@endif

此外,您可以使用 ? 运算符来避免必须使用 @if @else @endif 语法。变化:

@if (Input::old('title') == $key)
      <option value="{{ $key }}" selected>{{ $val }}</option>
@else
      <option value="{{ $key }}">{{ $val }}</option>
@endif

只需:

<option value="{{ $key }}" {{ (Input::old("title") == $key ? "selected":"") }}>{{ $val }}</option>

经过一番尝试,我想到了这个,它似乎工作得非常好

<select name="options[]" id="options" class="form-control" multiple>
    @foreach($settings->includes->get('optionList') as $option)
        <option value="{{ $option->id }}" {{ (collect(old('options'))->contains($option->id)) ? 'selected':'' }}>{{ $option->name }}</option>
    @endforeach
</select>

我可能 100% 错误地利用了 collect 函数,但它在我的许多测试中都运行良好。在网站上看到其他一些帖子后,我看到有人建议利用 in_array($needle, $array) 函数,但在注意到如果我的 old('options') 为 null 后,它会出错,因为它requires in_array requires,打赌你猜到了一个数组。因此,在找到了这个虽然丑陋的解决方案的解决方案之后,我使用了 collect 方法,因为毕竟我们正确地使用了幼虫!好吧,无论如何,丑陋的解决方案如下

@if (old("options")){{ (in_array($option->id, old("options")) ? "selected":"") }}@endif

inline 但长话短说我看起来很丑的人我正在使用以下内容

{{ (collect(old('options'))->contains($option->id)) ? 'selected':'' }}

希望这对其他人有帮助!!

这似乎不适用于非多个 select 字段,但我会返回一个确实适用的字段。

<option value="{{ $key }}" {{ Input::old('title') == $key ? 'selected="selected"' : '' }}>{{ $val }}</option>

我这里的解决方案是循环,只是为了避免重复选项

                            <select class="form-control" name="status" >
                              <?php $lists = ['Current', 'Win', 'Lose']; ?>

                              @foreach($lists as $list)
                              <option value={{$list}} {{(old('status') == $list?'selected':'')}} >{{$list}}</option>
                              @endforeach

                            </select>
<select>
    @if(old('value') =={{$key}})
     <option value="value" selected>{{$value}}</option>
    @else
     <option value="value">{{$value}}</option>
    @endif
</select>
<select name="gender" class="form-control" id="gender">
                                <option value="">Select Gender</option>
                                <option value="M" @if (old('gender') == "M") {{ 'selected' }} @endif>Male</option>
                                <option value="F" @if (old('gender') == "F") {{ 'selected' }} @endif>Female</option>
                            </select>

我更改了代码以在标题值中包含 '',因为没有引号它无法工作

    <select class="form-control" name="team" id="team">
     <option value="">---------Choose Team---------</option>
           @foreach($teams as $team)
    <option value="{{$team->id}}" {{(old('team')==$team->id)? 'selected':''}}>{{$team->name}}</option>

    @endforeach
    </select>

    eg.<select name="title">
    <option value="1"  {{ old('title') == '1' ? 'selected' : '' }}>
        Item 1
    </option>
    <option value="2" {{ old('title') == '2' ? 'selected' : '' }}>
        Item 2
    </option>

    </select>

除了使用 Input class,您还可以使用 old() 帮助程序来缩短它。

<option {{ old('name') == $key ? "selected" : "" }} value="{{ $value }}">

好吧,我的 2 美分,使用 Laravel 的 old() 函数的默认值。

<select name="type">
    @foreach($options as $key => $text)
        <option @if((int) old('type', $selectedOption) === $key) selected @endif value="{{ $key }}">{{ $text }}</option>
    @endforeach
</select>
      <select class="form-control" name="kategori_id">
        <option value="">-- PILIH --</option>
        @foreach($kategori as $id => $nama)
            @if(old('kategori_id', $produk->kategori_id) == $id )
            <option value="{{ $id }}" selected>{{ $nama }}</option>
            @else
            <option value="{{ $id }}">{{ $nama }}</option>
            @endif
        @endforeach
        </select>

Laravel 6 或以上: 只需使用 old() 函数,例如 @if (old('cat')==$cat->id),它将为您完成剩下的工作。

它是如何工作的: select 标签将 selected 选项值存储到它的 name 属性中,如果你 select 任何它将存储到 cat 中的选项。第一次加载页面时,cat 中没有任何内容,当用户选择一个选项时,该 selected 选项的值存储到 cat 中,因此当用户被重定向时 old( ) 函数从 cat.

中提取先前的值
 {!!Form::open(['action'=>'CategoryController@storecat', 'method'=>'POST']) !!}
        <div class="form-group">
            <select name="cat" id="cat" class="form-control input-lg">
                <option value="">Select App</option>
                @foreach ($cats as $cat)
                    @if (old('cat')==$cat->id)
                        <option value={{$cat->id}} selected>{{ $cat->title }}</option>
                    @else
                        <option value={{$cat->id}} >{{ $cat->title }}</option>
                    @endif
                @endforeach
            </select>
        </div>

        <div class="from-group">
            {{Form::label('name','Category name:')}}
            {{Form::text('name','',['class'=>'form-control', 'placeholder'=>'Category name'])}}
        </div>
    <br>
    {!!Form::submit('Submit', ['class'=>'btn btn-primary'])!!}
    {!!Form::close()!!}

这对你有帮助,如果存在则与旧值进行比较,如果不存在则与默认值进行比较

<select name="select_name">
    @foreach($options as $key => $text)
       <option {{ ($key == old('select_name',$default))?'selected':'' }}> {{ $text }} </option>
    @endforeach
</select>

$default 是从控制器注入到视图的值

<select style="width: 100%;" name="id_driver" id="id_driver" >
  <option value="" @if (old('id_driver') == "")  selected @endif>Select</option>
  @foreach(\App\Driver::all() as $driver)
    <option value="{{$driver->id}}" @if (old('id_driver') == $driver->id)  
        selected  @endif >(#{{$driver->id}}) {{$driver->business_name}}
    </option>
  @endforeach
</select>

考虑到用户也想编辑他们之前的输入,

<select name="title">
  @foreach ($titles as $key => $value)
    <option value="{{$value->id}}" {{(old('title', $user->title_id) == $value->id ? 'selected' : '')}} > {{$value->name}} </option>
  @endforeach
</select>

old('title', $user->title_id) returns 用户保存 title_id 第一次,如果验证失败它 returns 用户选择title_id。然后如果它与当前选项id匹配,则它被选中。

许多答案演示了使用三元运算符的一个衬里,但我认为使用 @if 更具可读性,至少对于初学者而言。如果没有 else 语句,以下内容就足够了。

 <option value="{{ $key }}" @if(old('title')===$key) selected @endif>{{ $val }}</option>

Laravel 8.59.0 的简洁明了的用法示例(使用旧的预选编辑表单)

您可以将它用于您的编辑页面。它带有来自数据库的默认选择,如果您提交了未通过验证的表单,则会通过包含 old.

返回答案
<select name="brand_id">
    @foreach ($brands as $brand)
        <option value="{{ $brand->id }}" @if ($product->brand_id === $brand->id || old('brand_id') === $brand->id) selected @endif>{{ $brand->title }}</option>
    @endforeach
</select>

通过错误验证实现改进 CodeToLife 的答案,如下所示

<div class="form-group row">
    <label for="person-field" class="col-md-4 col-form-label text-right">First Person</label>
    <div class="col-md-6">
        <select id="person-field" class="custom-select select2 @error('person') is-invalid @enderror" name="person" required>
            <option></option>
            @foreach(\App\User::all() as $user)
                <option value="{{$user->id}}" @if (old('person') == $user->id) selected  @endif>{{$user->name}}
                </option>
            @endforeach
        </select>
        @error('person')
        <span class="invalid-feedback" role="alert">
            <strong>{{ $message }}</strong>
        </span>
        @enderror
    </div>
</div>

Laravel 9 Checked / Selected / Disabled

<select name="version">
    @foreach ($product->versions as $version)
        <option value="{{ $version }}" @selected(old('version') == $version)>
            {{ $version }}
        </option>
    @endforeach
</select>