【发布时间】:2018-06-01 10:14:53
【问题描述】:
关于如何在表单提交后正确保留 Laravel 中的复选框字段,这里有很多问题( example, example, example ),这个问题与此无关。
请注意,我也很了解Laravel's old() method,以及it accepts a default value。我的问题是关于 old() 似乎不适用于复选框的特殊情况。
我正在处理一个编辑表单,更新数据库中已有的数据。表单最初将使用数据库中的值填充。
验证失败后重新填充表单输入的标准方法是使用old()。对于大多数输入类型,类似以下的工作:
<input type='text' name='unicorns' value='{{ old('unicorns', $model->unicorns) }}'>
在初始页面加载时(在提交表单之前),这可以正常工作。由于尚未提交任何内容,old('unicorns') 为null,因此将使用默认的$model->unicorns,文本字段的值反映了当前的数据库状态。
在提交新值但验证失败后,old('unicorns') 将成为新值,即使新值是空字符串,并且文本字段的值再次反映了提交的状态,正如我们所愿。
但是,当未选中的复选框根本没有出现在请求中时,这会破坏复选框。考虑:
<input type='checkbox' name='unicorns' value='1' @if old('unicorns', $model->unicorns) checked @endif>
在初始页面加载时,这工作正常,就像文本字段一样。但在验证失败后,对于复选框从初始状态更改的两种情况:
案例 1:DB 状态
0(未选中),已提交状态已选中。old('unicorns')将是1,所以测试评估true,复选框被选中 - OK!案例 2:DB 状态
1(选中),未选中提交状态。由于old('unicorns')为空,old()回退到默认值$model->unicorns(1),所以测试评估true,并且复选框被选中 - 但我们只是取消选中它!失败!
(其他2种情况没有问题,复选框没有从DB中的状态改变)。
如何解决?
我最初认为解决此问题的最佳方法是测试是否存在验证错误 - 如果是,请使用 old() 值,没有默认回退;如果没有,请使用 old() 和默认后备。测试验证失败的一种方法是检查$errors。这似乎可行,但它only works within a view AFAICT,如(来自 Laravel 文档):
注意:$errors 变量绑定到视图...
我想为此创建一个全局帮助器,而 $errors 不会在那里工作。无论如何,这种方法感觉......笨重且过于复杂。
我错过了什么吗?有没有一种简洁的 Laravel 方法来解决这个问题? old() 根本不适用于这种特殊情况,这似乎很奇怪。
这不是一个新问题,其他人是如何处理的?
【问题讨论】:
-
您使用的是哪种表格?是编辑表单还是新的空表单?
-
@Shubhampokhriyal 这是一个编辑表单;我认为这个问题已经说明了这一点(现有值
$model->unicorns混合在一起等),但我已经对其进行了更新以使其更加清晰。 -
@Shubhampokhriyal 好的 - 你能解释一下吗?验证失败后如何使用新状态重新填充复选框?
-
好的,我找到了一个链接,这可能会有所帮助stackoverflow.com/questions/23762841/…
-
@Shubhampokhriyal 这描述了在文本字段上使用
old(),使用表单模型绑定。我没有使用这些东西。
标签: php laravel laravel-5.2