使用 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')->withInput()->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->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 中的旧输入定义所选选项的主要内容,如果未能解决你的问题,请参考以下文章