2011-03-28 113 views
4

我想知道Zend_Form如何驗證輸入,我的意思是它如何知道要驗證哪些輸入字段。我期待着php全局變量($ _ POST,$ _GET),並且我沒有看到任何設置爲標識符(例如)以便知道如何驗證。任何人都可以向我推薦這個東西的任何指南?zend表單驗證

+0

通常你傳遞值的數組形式 - $> isValid()的例如$形式 - >的isValid($ _ POST) – 2011-03-28 15:54:33

+6

請接受給定答案中的一個或指出爲什麼他們沒有人幫助回答你的問題,所以人們有機會更新他們的答案。謝謝。 – Gordon 2011-04-07 07:31:43

回答

1

看看Zend_Form quickstart,這是一個關於如何開始在Zend中處理表單的非常明智的例子。

驗證文本輸入如下:

$username = new Zend_Form_Element_Text('username'); 
// Passing a Zend_Validate_* object: 
$username->addValidator(new Zend_Validate_Alnum()); 
// Passing a validator name: 
$username->addValidator('alnum'); 
+0

我明白如何使用。我不明白Zend如何執行此任務。當我提交表單時,它如何知道要驗證的輸入字段? – 2011-03-28 09:58:13

+1

@aykut請認真閱讀鏈接教程。有一部分叫做*檢查表單是否有效*。 – fabrik 2011-03-28 10:03:41

8

嘛,找出最好的辦法是看code of Zend_Form

/** 
* Validate the form 
* 
* @param array $data 
* @return boolean 
*/ 
public function isValid($data) 
{ 
    if (!is_array($data)) { 
     require_once 'Zend/Form/Exception.php'; 
     throw new Zend_Form_Exception(__METHOD__ . ' expects an array'); 
    } 
    $translator = $this->getTranslator(); 
    $valid  = true; 
    $eBelongTo = null; 

    if ($this->isArray()) { 
     $eBelongTo = $this->getElementsBelongTo(); 
     $data = $this->_dissolveArrayValue($data, $eBelongTo); 
    } 
    $context = $data; 
    foreach ($this->getElements() as $key => $element) { 
     if (null !== $translator && $this->hasTranslator() 
       && !$element->hasTranslator()) { 
      $element->setTranslator($translator); 
     } 
     $check = $data; 
     if (($belongsTo = $element->getBelongsTo()) !== $eBelongTo) { 
      $check = $this->_dissolveArrayValue($data, $belongsTo); 
     } 
     if (!isset($check[$key])) { 
      $valid = $element->isValid(null, $context) && $valid; 
     } else { 
      $valid = $element->isValid($check[$key], $context) && $valid; 
      $data = $this->_dissolveArrayUnsetKey($data, $belongsTo, $key); 
     } 
    } 
    foreach ($this->getSubForms() as $key => $form) { 
     if (null !== $translator && !$form->hasTranslator()) { 
      $form->setTranslator($translator); 
     } 
     if (isset($data[$key]) && !$form->isArray()) { 
      $valid = $form->isValid($data[$key]) && $valid; 
     } else { 
      $valid = $form->isValid($data) && $valid; 
     } 
    } 

    $this->_errorsExist = !$valid; 

    // If manually flagged as an error, return invalid status 
    if ($this->_errorsForced) { 
     return false; 
    } 

    return $valid; 
} 

這意味着簡單地說,Zend_Form將遍歷覆蓋表單中所有已配置的元素,並將它們與傳遞給它的數組中的值進行比較。如果匹配,它將根據配置的驗證器驗證該單個值。

2

所以,你創建窗體的行爲,然後檢查是否有post | get數據。你可以在這裏檢查is_valid表格。您需要將$ _POST或$ _GET數據傳遞給isValid()函數。示例:

if ($request->isPost() && $form->isValid($request->getPost())) { 

isValid()是函數Zend_Form類。表單運行每個元素的所有驗證(只要你不設置停止在第一次驗證失敗),然後也爲子表單。

0

或者你可以使用:

$username_stringlength_validate = new Zend_Validate_StringLength(6, 20); 
    $username = new Zend_Form_Element_Text('username'); 
    $username->setLabel('Username: ') 
      ->addFilters(array('StringTrim', 'HtmlEntities')) 
      ->setAttrib('minlength', '6') 
      ->setAttrib('class', 'required') 
      ->removeDecorator('label') 
      ->removeDecorator('HtmlTag') 
      ->removeDecorator('DtDdWrapper') 
      ->setDecorators(array(array('ViewHelper'), array('Errors'))) 
      ->addValidator($username_stringlength_validate);