【问题标题】:unchecked checkbox with "Input::old()"带有“Input::old()”的未选中复选框
【发布时间】:2013-05-28 20:29:31
【问题描述】:

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

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

我会把它写成一个函数以供重用,但这似乎有点痛苦,所以任何 cmets/suggestions 都会很棒

编辑 2 对不起,如果不清楚 - 澄清:

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

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

【问题讨论】:

    标签: checkbox laravel laravel-4


    【解决方案1】:

    我遇到了同样的问题。原来是因为我遵循了关于如何发布未选中复选框的说明,上面写着:

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

    【讨论】:

    • 遵循了什么指示?
    • 这里的评论中提到了这一点:flynsarmy.com/2015/02/…
    • Tnx,这为我解决了问题。使用 (old('active', $slide->active ?? 1) == 1) ? true : false,基本上是说:如果 oldInput > Slide > 1 == 1,则为 true,否则为 false。 “??”可以用作 isset 的简写,当某些东西不可用时提供替代值。
    【解决方案2】:

    这就够了

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

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

    【讨论】:

    • 感谢您的回复,但是您对此进行了测试吗?如果我取消选中该复选框并提交,然后在重新加载表单时检查它 - 我相信因为 Input::old('test') 不存在
    • @GuyIncognito 之所以有效,是因为 Laravel 的表单构建器会检查会话以及是否存在任何旧表单数据。 if (isset($this-&gt;session) &amp;&amp; ! $this-&gt;oldInputIsEmpty() &amp;&amp; is_null($this-&gt;old($name))) return false;laravel 4.2.x-dev 版本中的 FormBuilder.php 第 639 行
    【解决方案3】:

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

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

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

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

    这也应该有效。

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

    【讨论】:

      【解决方案4】:

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

      在我的控制器中,

      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' : ''); ?> />
      

      所以,几乎是使用额外的会话闪存数据来解决。

      【讨论】:

        【解决方案5】:

        为什么不这样做:

        &lt;?php $last_turnaround = (array) Input::old('turnaround'); ?&gt;

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

        【讨论】:

          【解决方案6】:

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

          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');
          }
          

          【讨论】:

            【解决方案7】:

            我有同样的问题..

            我是这样解决的

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

            希望有帮助..

            【讨论】:

              【解决方案8】:

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

              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
              

              【讨论】:

              • 我正在尝试您的第一个功能,但出现错误Class 'Input' not found
              • Input 已弃用。请改用Request 或request()。
              猜你喜欢
              • 2018-08-06
              • 1970-01-01
              • 2013-06-08
              • 1970-01-01
              • 2016-01-17
              • 2012-06-05
              • 2013-09-23
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多