zend表单验证

时间:2011-03-28 09:29:39

标签: php validation zend-framework zend-form

我想知道Zend_Form如何验证输入,我的意思是它如何知道要验证的输入字段。我查看了php全局($ _ POST,$ _GET),我没有看到任何设置为标识符(例如),以便知道如何验证。有谁能建议我这方面的任何指南?

4 个答案:

答案 0 :(得分: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将遍历表单中所有已配置的元素,并将它们与传递给它的数组中的值进行比较。如果匹配,它将根据配置的验证器验证单个值。

答案 1 :(得分:2)

所以,你在行动中创建表单然后检查是否有post | get data。你可以在这里查看is_valid表格。您需要将$ _POST或$ _GET数据传递给isValid()函数。例如:

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

isValid()是函数Zend_Form类。 Form运行每个元素的所有验证(如果你没有设置为在第一次验证中停止失败),然后也运行子表单。

答案 2 :(得分: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');

答案 3 :(得分: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);