2016-02-08 41 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

相關問題