2016-02-08 38 views
0

我正在构建一个名册系统作为一个侧面项目,并且在其中一个页面上,您可以更改某人工作的常规时间。required_without_all验证器一遍又一遍地重复出现错误消息

在页面上,我有一个星期的每一天的复选框,然后您可以通过并选择该人工作的适当天数。

他们需要工作至少一天,所以至少有一个复选框需要在提交时进行检查。

为了测试这个,我使用了Laravel验证器的required_without_all规则。

它可以很好地工作,但是如果没有选中框,它会将您重定向回7次并吐出相同的错误消息(因为每周有7个复选框)。

我正在使用自定义错误消息,所以这就是为什么错误消息是相同的,但即使我没有,我不会希望类似的错误消息反复重复。

这是我的验证的样子:

$validator = Validator::make($request->all(), [ 
      'mondayCheckbox' => 'required_without_all:tuesdayCheckbox,wednesdayCheckbox,thursdayCheckbox,fridayCheckbox,saturdayCheckbox,sundayCheckbox', 
      'tuesdayCheckbox' => 'required_without_all:mondayCheckbox,wednesdayCheckbox,thursdayCheckbox,fridayCheckbox,saturdayCheckbox,sundayCheckbox', 
      'wednesdayCheckbox' => 'required_without_all:mondayCheckbox,tuesdayCheckbox,thursdayCheckbox,fridayCheckbox,saturdayCheckbox,sundayCheckbox', 
      'thursdayCheckbox' => 'required_without_all:mondayCheckbox,tuesdayCheckbox,wednesdayCheckbox,fridayCheckbox,saturdayCheckbox,sundayCheckbox', 
      'fridayCheckbox' => 'required_without_all:mondayCheckbox,tuesdayCheckbox,wednesdayCheckbox,thursdayCheckbox,saturdayCheckbox,sundayCheckbox', 
      'saturdayCheckbox' => 'required_without_all:mondayCheckbox,tuesdayCheckbox,wednesdayCheckbox,thursdayCheckbox,fridayCheckbox,sundayCheckbox', 
      'sundayCheckbox' => 'required_without_all:mondayCheckbox,tuesdayCheckbox,wednesdayCheckbox,thursdayCheckbox,fridayCheckbox,saturdayCheckbox', 
      'effective_from' => 'date', 
      ], [ 
      'mondayCheckbox.required_without_all' => 'Surely they are working at least one day!', 
      'tuesdayCheckbox.required_without_all' => 'Surely they are working at least one day!', 
      'wednesdayCheckbox.required_without_all' => 'Surely they are working at least one day!', 
      'thursdayCheckbox.required_without_all' => 'Surely they are working at least one day!', 
      'fridayCheckbox.required_without_all' => 'Surely they are working at least one day!', 
      'saturdayCheckbox.required_without_all' => 'Surely they are working at least one day!', 
      'sundayCheckbox.required_without_all' => 'Surely they are working at least one day!', 
      'effective_from.date' => 'You have provided an invalid date for when their hours are effective from!', 
      ]); 

     if ($validator->fails()) 
     { 
      return Redirect::back() 
       ->withErrors($validator) 
       ->withInput(); 
     } 

所以,如果没有框是在提交检查,错误Surely they are working at least one day!如图7倍。

我喜欢这个页面上显示的错误:

@if (count($errors) > 0) 
    <div class="alert alert-danger"> 
     <p><b>There were some problems:</b></p> 
     <ul> 
      @foreach ($errors->all() as $error) 
       <li>{{ $error }}</li> 
      @endforeach 
     </ul> 
    </div> 
@endif 

反正有没有只得到它显示一次?

+0

怎么样一个小黑客?使用jQuery或Javascript,如果任何复选框被选中,您可以设置隐藏输入的值,否则值为无。因此,现在在您的验证器中,您可以检查隐藏的输入字段,然后根据该字段进行响应。这将只显示一条消息。 –

+0

来自required_without_all的文档:“只有当所有其他指定字段不存在时,验证字段必须存在”。所以从技术上讲,这可能不是以“不”开头的理想验证者?你是否开心使用自定义验证器功能,我们可以采取刺探的方式。这样比这更容易。 – Theson

+0

@JilsonThomas我对一个小小的黑客开放,我的JavaScript/jQuery知识不是很好 - 你能告诉我一个如何做到这一点的例子吗? @ihatehandles'required_without_all'似乎非常适合,例如其中一个字段需要存在,当其他指定字段都不存在时。我非常乐意尝试创建一个自定义的 - 你将如何解决这个问题? – James

回答

1

有很多方法可以解决这个问题。由于JS黑客是在桌子上也一样,我们也可以从叶片端进来,这样做(随意使用自己喜欢的数组操作功能):

<ul> 

    <li> 
     {{-- Show error message only once --}} 
     @if($errors->has('mondayCheckbox') || $errors->has('tuesdayCheckbox') || $errors->has('wednesdayCheckbox') || $errors->has('thursdayCheckbox') || $errors->has('fridayCheckbox') || $errors->has('saturdayCheckbox') || $errors->has('sundayCheckbox')) 
      Surely they are working at least one day! 
     @endif 
    </li> 

    @foreach ($errors->all() as $error) 

     {{-- Show other errors not related to the checkboxes --}} 
     @unless($error == 'Surely they are working at least one day!') 
      <li> 
       {{ $error }} 
      </li> 
     @endunless 

    @endforeach 
</ul> 

另一种方式是对付在你的验证器中的Illuminate\Contracts\Support\MessageBagAfter Validation Hook并清理那里。

+0

我得到了这个与@JilsonThomas小提琴的改编版本,https://jsfiddle.net/krg553Lk/,但我真的很喜欢这种方法作为它不需要额外的隐藏字段。我已经切换回使用原始验证器和这个小刀片黑客。干得不错! – James

+0

谢谢,是的小提琴也是一个不错的尝试。干杯 – Theson

相关问题