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

Posted

技术标签:

【中文标题】使用 Laravel / Blade 中的旧输入定义所选选项【英文标题】:Define the selected option with the old input in Laravel / Blade 【发布时间】:2015-05-22 18:50:05 【问题描述】:

我有这个代码:

<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')-&gt;withInput()-&gt;withErrors($v) 行。但我无法重新填充选择字段。例如,有什么方法可以在不使用 javascript 的情况下做到这一点?

【问题讨论】:

【参考方案1】:

此外,您可以使用? 运算符来避免使用@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>

【讨论】:

【参考方案2】:

解决方案是使用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

【讨论】:

我想问这是不是问题所在。 "repopulate the select""show selected option" 是有区别的。尝试在以后更清楚地解释您的问题。 用选定的选项重新填充选择。 我知道,我很高兴你能成功,但你的标题和问题的描述有些矛盾。 我觉得现在可以了 :) @Christopher 输入名称是这样的数组呢 title[] 我们应该怎么做?我做同样的事情它不起作用。【参考方案3】:

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

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

【讨论】:

【参考方案4】:
<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>

【讨论】:

虽然此代码可以解决问题,including an explanation 说明如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提出问题的人。请编辑您的答案以添加解释,并说明适用的限制和假设。 由于某种原因,三元运算符对我不起作用,而这确实起作用了。 按预期工作!【参考方案5】:

玩了一会儿后,我想出了这个,它似乎工作得很好

<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% 错误,但它在我的许多测试中都运行良好。在看到网站上的其他一些帖子后,我看到有人建议使用 in_array($needle, $array) 函数,但在注意到如果我的 old('options') 为 null 它会出错,因为它需要 in_array 需要,打赌你猜到了一个数组。因此,在找到解决方案后,尽管很丑陋,但我使用了 collect 方法,因为毕竟我们使用 larval 是对的!无论如何,丑陋的解决方案如下

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

内联但对我来说看起来很丑的人,长话短说我使用以下代替

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

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

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

【讨论】:

【参考方案6】:

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

    <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>

【讨论】:

【参考方案7】:

Laravel 6 或更高版本: 只需使用 old() 函数,例如 @if (old('cat')==$cat->id),它会为你完成剩下的工作。

它的工作原理: select标签将选择的选项值存储到其名称属性中,如果您选择任何选项,它将存储到cat强>。第一次加载页面时,cat 内没有任何内容,当用户选择一个选项时,该选项的值将存储到 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()!!

【讨论】:

【参考方案8】:
<option value=" $key "  Input::old('title') == $key ? 'selected="selected"' : '' > $val </option>

【讨论】:

【参考方案9】:
      <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>

【讨论】:

【参考方案10】:

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

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

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

【讨论】:

@RJFares 只有在没有old('select_name') 的情况下才能使用$default【参考方案11】:

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>

【讨论】:

【参考方案12】:

我的解决方案是循环,以避免重复选项

                            <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>

【讨论】:

【参考方案13】:

好吧,我的 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>

【讨论】:

【参考方案14】:
<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>

【讨论】:

【参考方案15】:

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

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

【讨论】:

我完全同意你的观点,但我认为你应该使用相等运算符(==)而不是相同的(===)它才能工作!【参考方案16】:
<select>
    @if(old('value') ==$key)
     <option value="value" selected>$value</option>
    @else
     <option value="value">$value</option>
    @endif
</select>

【讨论】:

这感觉有点开销,因为您可以改用 old('foo') == $foo-&gt;foo_id ? ' selected="selected' : '' 。请始终为您的标签属性设置一个值!【参考方案17】:

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

<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) 第一次返回用户保存的title_id,如果验证失败则返回用户选择的title_id。然后如果它与当前选项 id 匹配,则它被选中。

【讨论】:

【参考方案18】:

通过如下错误验证实现改进 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 / Blade 中的旧输入定义所选选项的主要内容,如果未能解决你的问题,请参考以下文章

使用来自数据库 Laravel Blade 的数据填充单选按钮

将 Laravel 中的表单值传递给 Blade 模板

Laravel 8 中的动态相关下拉菜单

Laravel 中的 Blade 模板与普通 php

在 Laravel Blade 模板中添加图像输入元素

php Laravel Blade:输入组件