【问题标题】:How to keep value of selected option after form is submitted in Laravel form如何在 Laravel 表单中提交表单后保留所选选项的值
【发布时间】:2023-04-04 08:50:02
【问题描述】:

当用户在页面刷新时按国家/地区搜索时,我想这样做。结果页面以将所选国家/地区保留在表单上的选项中。

这就是我填充下拉列表的地方

@foreach ($countries as $country)
        <option value="{!! $country->id !!}">{!! $country->name !!}</option>
@endforeach

这是我尝试过的,但似乎不正确,因为未选择该值

@foreach ($countries as $country)
    <option value="{!! $country->id !!}"  @if( old('country->id')  == $country->id) selected="selected" @endif>{!! $country->name !!}</option>
@endforeach

这里有什么诀窍?

这是控制器

public function search(Request $request)
{

    $searchText = strip_tags($request['q']);
    $seachLocation = strip_tags($request['l']);


    $columns =['alias','description','address1','address2','address3'];

    $query = Item::select('*');

    $query->where( 'title', 'like', '%'.$searchText.'%');

    foreach( $columns as $column) {
        $query->orWhere( $column, 'like', '%'.$searchText.'%', '%'.$seachLocation.'%');
    }

    $query->orWhereHas('category',function( $query ) use (  $searchText ) {
        $query->where('title', 'like', '%'.$searchText.'%' );
    });

    $query->orWhereHas('country',function( $query ) use (  $searchText ) {
        $query->where('name', 'like', '%'.$searchText.'%' );
    });

    $items = $query->paginate(5);
    $searchQuery = $searchText;
    $searchQueryLoc = $seachLocation;

    return view('search', compact('items','searchQuery','seachLocation'));
}

【问题讨论】:

  • 你试过添加 getOldInput(); ?> 并检查值 country->id 是否可用?
  • 不,我应该在哪里添加这个?
  • 在您的视野中。添加 getOldInput()); ?> 并提交页面并发布结果。
  • 它显示array(0) { },顺便说一句,上面的代码我正在尝试(我的第二次狙击)它总是显示默认选择的数据库中具有最大 ID 的国家/地区。
  • 提交表单后是array(0) {}吗?如果是这样,您是否使用旧输入重定向到视图?请添加您重定向的控制器部分

标签: php laravel laravel-5.2


【解决方案1】:

要使用 old() 帮助器,您的表单输入需要有一个名称。

然后,您使用输入的名称作为 old() 助手中的参数来获取旧值。

所以像old('country-&gt;id') 这样使用它是行不通的;你需要使用old('nameAttributeOfInput')

假设此输入的name 属性为country_id 的完整示例:

@foreach ($countries as $country)
    <option value="{!! $country->id !!}"  @if( old('country_id')  == $country->id) selected="selected" @endif>{!! $country->name !!}</option>
@endforeach

作为旁注,请注意{!! !!} 不会转义放置在页面上的值,这可能具有潜在危险。使用转义值的{{ }} 可能会更好,也更安全。

【讨论】:

  • 谢谢,但仍不显示所选国家/地区。我的选择名称有name="l",所以我的整个代码是:&lt;option value="{!! $country-&gt;id !!}" @if( old('l') == $country-&gt;id) selected="selected" @endif&gt;{!! $country-&gt;name !!}&lt;/option&gt;
  • 您的表单使用什么方法?您能向我们展示更多您的表格吗?
【解决方案2】:

我建议您使用 session 来存储选定的国家/地区。例如:

session()->put('forms.country', $request->get('country'));

那么你的html应该变成:

<option value="{{ $country->id }}"  @if( session('forms.country')  == $country->id) selected="selected" @endif>{{ $country->name }}</option>

【讨论】:

  • 谢谢。我已经在返回视图之前将 session()-put... 添加到我的控制器中,但仍然在加载带有结果的页面时,选项下拉列表获得默认值
  • 你在用同样的方法搜索吗?
  • 是的,我的问题是整个搜索功能
  • 我建议您将搜索的部分放在单独的部分中并仅显示。例如: if ($request->has('mode')) { // 你搜索的代码在这里。 }
  • 您始终可以为此使用中间件。在中间件中,您需要检查当前页面 url 是否与搜索页面 url 不匹配。如果不匹配,则应清除会话
【解决方案3】:

您可以在表单的字段中使用 Laravel 内置的 old() 来保存提供的值。

 @if( old('field_name') == $country->id) selected="selected" @endif

【讨论】:

  • @James 的答案是完全一样的,我写的那是行不通的。
猜你喜欢
  • 2020-04-10
  • 2019-09-11
  • 2016-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-03
  • 2023-03-14
相关资源
最近更新 更多