5

我正在视图中创建一个复选框:

Form::checkbox('test', 'true', Input::old('test', true));

取消选中该框后,提交表单并被重定向回来:

return Redirect::back()->withInput()->withErrors($validation);

该复选框仍处于选中状态 - 大概是因为'test'它不存在,"Input::old"所以它正在恢复为默认值。

关于如何最好地实现这一目标的任何建议?

编辑:

我想出了一种有点老套的方法来获得我想要的结果:

$isChecked = true; // The default state
// Check if the form has been returned "withInput"
if(Input::old())
{
    $isChecked = Input::old('test', false); // If the field has old data available use that, otherwise it is unchecked
}
echo Form::checkbox('test', 'true', $isChecked);

我会将其写入一个函数以供重用,但这似乎有点痛苦,所以任何评论/建议都会很棒

编辑 2 抱歉,如果不清楚 - 澄清:

  1. 表单已选中复选框
  2. 我取消选中复选框并提交表单
  3. 表单未通过验证,因此我返回表单
  4. 该复选框已重新检查自身 - 根据用户提交的数据,我希望它不会被选中

我认为发生这种情况是因为如果未选中复选框,则该元素不包含在帖子数据中

4

8 回答 8

10

我有同样的问题。原来是因为我遵循了关于如何发布未选中复选框的说明,其中说:

echo Form::hidden('name', 0);
echo Form::checkbox('name', 1);

这样做的问题是,在表单验证失败时,如果选中该复选框,Laravel 将使用旧值重新填充“隐藏”和“复选框”字段,因此您的隐藏字段将始终提交 1 而不是 0。简单的解决方案就是为隐藏字段编写 HTML,而不是使用表单助手:

echo '<input type="hidden" name="name" value="0">';
echo Form::checkbox('name', 1);
于 2014-11-01T08:26:23.307 回答
5

这应该足够了

echo Form::checkbox('test', 'true', Input::old('test', true));

如果 Input::old() 不存在,它将返回 true,您的默认值。

于 2013-06-02T17:42:56.933 回答
2

复选框和会话不匹配是一个错误,已在 Laravel 4 中更正。以下代码应保留重定向复选框:

echo Form::checkbox('payment_method', 'credit');

对于分组复选框,请使用以下内容:

echo Form::checkbox('payment_method[]', 'credit');

这也应该有效。

**显然你会想用你自己的属性替换 payment_method 和 credit。

于 2013-10-03T06:20:43.697 回答
1

这对我来说也有点困惑。但这就是我所做的。

在我的控制器中,

Session::flash('test', Input::get('test') ? 'true' : 'false');

并且在视图中

<?php $test = Session::get('test'); ?>
<input type="checkbox" id="test" name="test" value="true" <?php echo is_null($test) ? 'checked' : ($test == 'true' ? 'checked' : ''); ?> />

因此,几乎可以使用额外的会话闪存数据来解决问题。

于 2013-08-21T12:48:58.110 回答
0

为什么不做这样的事情:

<?php $last_turnaround = (array) Input::old('turnaround'); ?>

{{ Form::checkbox( 'turnaround', 'normal', in_array('normal', $last_turnaround), array('id' => 'turnaround_normal', 'class' => 'turnaround')) }}

于 2013-08-05T17:55:53.840 回答
0

我对同一问题的解决方案:

1)从验证中删除复选框。从逻辑上讲,这没有什么区别。

2)在我的控制器更新函数中,我添加了一个 if 语句,该语句使用 isset 来确定是否发送了值(如果未发送,则未检查,因此为 false)。

if ($validation->passes())
{
    $xxx = $this->xxx->find($id);
    $xxx->update($input);
    if (!isset($input['checkbox_attribute'])) {
        $xxx->checkbox_attribute = false;
    }
    $xxx->save();
    return Redirect::to('xxx.show');
}
于 2013-09-01T22:18:06.767 回答
0

我也有同样的问题..

我这样修

Form::checkbox('test', 'true', Input::old() ? Input::old('test', false) : true);

希望有帮助..

于 2015-05-17T08:01:57.880 回答
0

我有同样的问题。我最终创建了这个辅助函数:

function is_checked(string $name, $value, $default) : string
{
    $current_defaults = Input::old() ? old($name, 0) : $default;
    return ($value == $current_defaults) ? 'checked' : '';
}

<input type="checkbox" name="is_acrive" value="1" 
       {{ is_checked('is_active', 1, $user->is_active) }}>

多个复选框版本:

function is_checked_multiple(string $name, $value, $defaults) : string
{
    $current_defaults = Input::old() ? old($name, []) : (array)$defaults;
    return in_array($value, $current_defaults) ? 'checked' : '';
}

@foreach ($plans as $plan)
    <input type="checkbox" name="plans[]" value="{{ $plan->id }}" 
           {{ is_checked_multiple('plans', $plan->id, $user->plans->pluck('id') }}>
@endforeach
于 2017-07-04T07:00:42.933 回答