【问题标题】:Laravel 3 - How to validate checkbox array, for at least 1 checked?Laravel 3 - 如何验证复选框数组,至少选中 1 个?
【发布时间】:2013-04-25 22:55:42
【问题描述】:

我开始学习 Laravel 并且还在学习曲线上。现在我从 Laravel 3 开始,但一旦我开始工作,很可能会将我的项目切换到 Laravel 4。 现在的问题是,如何验证复选框数组,我想验证组内至少有 1 个启用(选中)。我在 Laravel 论坛的某个地方读到,我们只是使用必需的来验证它们,但是当我 dd(input::all()) 时,除了输入字段和复选框之外,我什么也没看到...

我的 Blade Create 复选框的一部分代码:

<label class="checkbox">{{ Form::checkbox('changeReasons[]', 'ckbCRCertification', Input::had('ckbCRCertification'), array('id' => 'ckbCRCertification')) }} Certification</label>
<label class="checkbox">{{ Form::checkbox('changeReasons[]', 'ckbCRDesignCorrection', Input::had('ckbCRDesignCorrection'), array('id' => 'ckbCRDesignCorrection')) }} Design Correction</label>

我的控制器(REST)代码是:

public function post_create()
{
    print "Inside the post_create()";
    // validate input
    $rules = array(
        'ecoNo'             => 'min:4',
        'productAffected'   => 'required',
        'changeReasons'     => 'required'
    );

    $validation = Validator::make(Input::all(), $rules);

    if($validation->fails())
    {
        return Redirect::back()->with_input()->with_errors($validation);
    }

    $eco = new Eco;

    $eco->ecoNo = Input::get('ecoNo');
    $eco->productAffected = Input::get('productAffected');

    $eco->save();

    return Redirect::to('ecos');
}

我还想知道验证失败后获取复选框状态的正确代码,我以为我在某处看到了Input::had(checkBoxName),但这似乎不起作用,我可能没有正确使用它,我'我对此有点困惑,因为我看到的所有示例都是用于输入,仅此而已。我假设 L4 中的验证大致相同,是吗?

【问题讨论】:

    标签: laravel laravel-3


    【解决方案1】:

    回到这个项目并进行更多研究,我发现解决这个问题的最佳方法如下。

    我的刀片视图:

    <div class="control-group row-fluid">
        <?php $arrChangeReasons =  Input::old('changeReasons', array()); // array of enable checkboxes in previous request ?>
    
        <label class="checkbox">{{ Form::checkbox('changeReasons[]', 'certification', in_array('certification', $arrChangeReasons)) }} Certification</label>
        <label class="checkbox">{{ Form::checkbox('changeReasons[]', 'designCorrection', in_array('designCorrection', $arrChangeReasons)) }} Design Correction</label>
    </div>
    

    刀片视图的解释是一个两步过程,验证发生后,如下:

    1. Input::old拉出复选框数组(在我的例子中是'changeReasons[]')
    2. 然后我们可以从该数组中搜索单个复选框并查看它们是否在其中,如果存在则将复选框更改为checked 状态。这就是 in_array() 函数的工作,返回 true/false 会改变复选框的状态。

    我的控制器 (REST) 代码与我一开始的问题中所写的完全一样。有关详细信息,定义 $rules = array('changeReasons' =&gt; 'required'); 将确保至少有 1 个复选框是 checked

    【讨论】:

      【解决方案2】:

      请记住,复选框需要像 . 如果 Checkbox 被选中 Input::get('foo') 将返回 1,但如果未选中则不会返回任何内容,因为它不在后数组中。

      我正在使用此代码:

      if(Input::get('foo')){
          $bar->is_foo = 1;
      }
      else{
          $bar->is_foo = 0;
      }
      

      【讨论】:

      • 或者你可以像Input::get('foo', 0);那样使用默认的回退
      • 好的,但是我如何将它交给我的Validator 检查并通过return Redirect::back()-&gt;with_input()-&gt;with_errors($validation); 返回我希望它成为我验证的一部分,而不是作为我无法返回的额外内容尽可能与输入同时进行
      • 我想我开始明白你为什么这样使用它了,现在你写的代码可以用于单个复选框名称,但在我的情况下,我使用复选框数组,所以我将如何检索我的复选框的 1 个实时代码被选中?我尝试了Input::get('changeReasons[ckbCRCertification]', 0) 之类的方法,但这不起作用,因为get 仅适用于单键而不适用于数组......那么如何知道我的复选框是否启用?
      • 我不确定,但由于控制器不知道您使用的是布尔类型,因此您必须手动进行。如果我错了,请纠正我。
      • 对此没有太多回应。我只是想知道如何查看我的复选框是否被 1 行代码激活...Input::get('changeReasons', 0) 这适用于我的一个简单复选框是复选框数组...那该怎么做呢?我不能接受你现在的回答..
      猜你喜欢
      • 2017-05-30
      • 2014-07-15
      • 2017-07-27
      • 1970-01-01
      • 1970-01-01
      • 2011-03-13
      • 2015-11-06
      • 1970-01-01
      • 2017-09-09
      相关资源
      最近更新 更多