在這裏採取的最簡單的方法是使用一個簡單的自定義Zend的驗證,這將解析輸入元素作爲整個數組PHP把它看成這樣你就能夠自動執行以下。
- 獨立驗證每個輸入元素並顯示與每個元素關聯的錯誤消息。
- 返回一個可解析數組來重建剛剛提交的表單。
對於使用此來解析與可能的數組作爲一個值的輸入和驗證的每個元素和再生的確切形式提交,用相同的任意字段中Zend_Validator
class Validate_InputArray extends Zend_Validate_Abstract
{
const INVALID = 'invalid';
const ERROR = 'error';
/**
* Failed array elements used to regenerate same elements
* on next form build
*
*/
protected $_elements = array();
protected $_messageTemplates = array(
self::INVALID => "Could not locate post element %value%",
self::ERROR => "YOUR ERROR MESSAGE|%value% is required"
);
public function __construct()
{}
public function isValid($element)
{
if (!$_POST[$element]) {
$this->_error(self::INVALID);
return false;
}
$elements = array();
if (is_array($_POST[$element])) {
$fail = false;
foreach ($_POST[$element] as $k => $v) {
if (!$this->_validateElement($v)) {
$this->_error(self::ERROR);
$elements[$k] = self::ERROR;
}
}
$this->_setElements($elements);
if ($fail) {
return false;
}
} else {
if (!$this->_validateElement($_POST[$element])) {
$this->_error(self::ERROR);
$elements[0] = self::ERROR;
$this->_setElements($elements);
return false;
}
}
}
protected function _setElements($elements)
{
$this->_elements = $elements;
return $this;
}
public function getElements()
{
return $this->_elements;
}
private function _validateElement($value)
{
// do your validation here
// return true/false
}
}
現在的代碼。
$fail = false;
if ($this->getRequest()->isPost()) {
require 'Validate_InputArray.php';
$validator = new Validate_InputArray();
$elements = array();
if (!$validator->isValid($validator)) {
$fail = true;
foreach ($validator->getElements() as $k => $v) {
$elements[$k] = $v;
}
}
}
if ($fail) {
$messages = $validator->getMessages();
foreach ($elements as $k => $v) {
// Add custom methods here
$element = $form->createElement('text', 'elementName[]');
$element->addErrorMessages($messages[$k]);
}
} else {
$form->addElement('elementName[]');
}
這將允許您驗證任意數量的任意輸入元素的需要,無需子的形式,或擔心需要,如果當一個任意元素驗證失敗並重新添加表單元素需要在客戶端進行重建。
感謝您長時間的回答,我會在幾天內嘗試。 – erenon 2009-12-23 15:41:02
完全沒問題,讓我知道它是怎麼回事;) – nwhiting 2009-12-23 18:30:30