Zend表单验证

4

我想知道Zend_Form如何验证输入,我的意思是它如何知道要验证哪些输入字段。我查看了php全局变量($_POST,$_GET),并没有看到任何设置作为标识符(例如),以便知道如何进行验证。有人能否向我推荐任何关于这方面的指南?


通常情况下,您将一个值数组传递给$form->isValid(),例如 $form->isValid($_POST)。 - Adam Pointer
6
请接受所给出的答案之一,或指出为何它们都未能帮助您回答问题,以便人们有机会更新他们的答案。谢谢。 - Gordon
4个回答

8

要找出最佳选项,最好的方法是查看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类中的函数。表单会对每个元素运行所有验证(如果您没有设置在第一个验证失败时停止),然后再对子表单进行验证。


1

看看Zend_Form快速入门,这是一个非常好的例子,展示了如何在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');

我知道如何使用。我不明白Zend如何执行此任务。当我提交表单时,它如何知道要验证哪些输入字段? - aykut yaman
1
@aykut请仔细阅读链接的教程。有一个名为检查表单是否有效的部分。 - fabrik

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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接