2010-08-11 103 views
5

我想在使用ViewScript的表單之前顯示所有表單錯誤。這是我目前想我ViewScript中使用的代碼:在ViewScript中顯示Zend_Form表單錯誤

<div class="errors"> 
<?php echo $this->formErrors($this->element->getMessages()); ?> 
</div> 

這個調用給我一個錯誤信息:

警告:用htmlspecialchars()預計參數1是字符串,數組給出

我見過這個相同的代碼建議其他地方,但它不適合我。如果我打印出$ this-> element-> getMessages(),我會看到以下錯誤消息:

Array([myField] => Array([isEmpty] => Value是必需的, t空))

任何想法?

回答

7

getMessages()返回一個表單元素名稱數組作爲鍵,每個鍵都包含該元素的錯誤數組。所以基本上,而不是交給了formErrors視圖助手:

Array ([isEmpty] => Value is required and can't be empty) 

你交作業:

Array ([myField] => Array ([isEmpty] => Value is required and can't be empty)) 

你會想要做這樣的事情,而不是:

$arrMessages = $this->myForm->getMessages(); 
foreach($arrMessages as $field => $arrErrors) { 
    echo sprintf(
     '<ul><li>%s</li>%s</ul>', 
     $this->myForm->getElement($field)->getLabel(), 
     $this->formErrors($arrErrors) 

    ); 
} 
+2

最後我做類似的事情,但我喜歡你的更好的解決方案。奇怪的是,沒有可用的函數來處理像這樣的所有形式錯誤,只能一次處理一個字段。 – 2010-08-13 15:07:13

-1

由於Mark指出在他的回答中,getMessages()返回一個表單元素名稱數組作爲鍵,每個元素包含該元素的錯誤數組;他的解決方案是:

$arrMessages = $this->myForm->getMessages(); 
foreach($arrMessages as $field => $arrErrors) { 
    echo sprintf(
     '<ul><li>%s</li>%s</ul>', 
     $this->myForm->getElement($field)->getLabel(), 
     $this->formErrors($arrErrors) 

    ); 
} 

這個工作,只要getMessages()導致二維數組。但是,如果表單基於由Doctrine(或某個其他插件)生成的關係數據集,則與字段關聯的錯誤消息可能也是一個數組,並且上面的代碼會崩潰,因爲它將$arrErrors當作字符串處理成爲一個數組。

要捕獲錯誤消息,如果有第二個數據集,我們可以引入嵌套在第一個foreach語句中的foreach語句,但當getMessages()產生二維數組時,這不起作用;如果數據集超過兩層,它也不會起作用。

在關係數據場景,我們不知道該錯誤消息有多深的來源,可擴展的解決方案是

$arrMessages = $this->myForm->getMessages(); 
print_r ($arrMessages);