2012-04-27 55 views
1

我正在爲表單設置單個錯誤消息,但仍然驗證每個字段。在Zend表單驗證中只顯示一個錯誤

該表格是一個包含10個問題的調查。他們每個人都以同樣的方式驗證(->setRequired(true))。所以基本上,我只是爲了驗證每個問題都有答案,並在表單頂部顯示一條消息,如果其中一條沒有回答。

我已經嘗試過幾種解決方案並獲得了相同的結果。我的錯誤被添加到表單中,但也顯示了所有單個錯誤。

這是我在它最新的擊打:

public function isValid($data) 
{ 
    $errors = 0; 

    parent::isValid($data); 

    foreach ($this->getElements() as $element) { 

     if ($element->hasErrors()) { 

      $element->clearErrorMessages(); 

      $element->setErrors(array()); 

      $errors++; 
     } 
    } 

    if (count($errors) > 0) { 
     $this->setErrorMessages(array('Please answer all questions before proceeding.')); 
     return false; 
    } 

    return true; 
} 

任何人都可以揭示這是爲什麼不工作,我會期待一些輕?必須有一個更優雅的方式來做到這一點。

編輯:

這是我結束了。可能與大多數情況有點不同,因爲我的表單元素是基於一系列問題動態填充的,但總體思路應該適用。通常情況下,你可以只計數無線電元素的數量,但在我的情況下,而不是循環遍歷元素和檢查類型,這是更容易計數我的問題。

public function isValid($data) 
{ 
    $valid_values = 0; 

    parent::isValid($data); 

    foreach ($this->getValues() as $value) { 
     if ($value >= 1 && $value <= 10) { 
      $valid_values++; 
     } 
    } 

    if ($valid_values <> count($this->_questions)) { 
     $this->setErrorMessages(array('Please answer all questions before proceeding.')); 
     return false; 
    } 

    return true; 
} 

仍然不確定這是最優雅的方式,但它適用於我的特殊情況。

+0

自己找出來,但沒有足夠的代表發佈我的答案。 :( – Luke 2012-04-27 21:50:35

回答

0

我看到它的方式,如果每個字段只有一個驗證器,爲什麼不在管理器中管理它,而不是重寫isValid?

if ($form->isValid($_POST)) { /* success */ } else { /* error as at least one field is missing */ }

+0

好主意,但是,我最終確認了多件事情,所以我想出了一個isValid()方法的解決方案。更新了我的問題。我想我可以在控制器中做到這一點,但我另外我不確定我怎麼可以隱藏元素錯誤,但仍然顯示一個錯誤,說明整個表單驗證失敗。我想這是我正在努力的一部分,我原來的問題的原因。 – Luke 2012-05-01 03:01:00

0

您可以通過在創建它從表單元素中去掉「錯誤」裝飾消除錯誤的元素。這將驗證所有元素,但不會產生任何錯誤消息。但是你必須不能在表單元素中顯示錯誤。你必須找到其他方式來反饋錯誤。

0

你可以從每個元素中刪除Error修飾符(所以這些錯誤不會顯示)。然後添加一個自定義裝飾器到表單(!),檢查$form->isValid()(雖然在裝飾器本身,它會是$this->getElement()->isValid();類型的混淆,getElement()返回裝飾器所連接的實體),然後渲染你的單個消息(可能高於你的表格,使用默認放置PREPEND)。

聽起來好像你已經處理了第二部分(在表單級別呈現單條消息),所以從元素本身中簡單地刪除Error裝飾器應該爲你完成這項工作。