【问题标题】:zend form validationZend 表单验证
【发布时间】:2011-03-28 09:29:38
【问题描述】:

我想知道 Zend_Form 如何验证输入,我的意思是它如何知道要验证哪些输入字段。我查看了 php globals($_POST, $_GET) 并且我没有看到任何设置为标识符(例如)以了解如何验证。任何人都可以向我推荐这方面的任何指南吗?

【问题讨论】:

  • 通常你将一组值传递给 $form->isValid() 例如 $form->isValid($_POST)
  • 请接受给定的答案之一,或指出为什么他们都没有帮助回答您的问题,以便人们有机会更新他们的答案。谢谢。

标签: php validation zend-framework zend-form


【解决方案1】:

嗯,找出答案的最佳选择是查看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】:

    因此,您在操作中创建表单,然后检查是否有发布|获取数据。您可以在此处查看 is_valid 表格。您需要将 $_POST 或 $_GET 数据传递给 isValid() 函数。示例:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 我了解如何使用。我不明白 Zend 是如何执行这项任务的。当我提交表单时,它如何知道要验证的输入字段?
      • @aykut 请仔细阅读链接教程。有一个部分叫做检查表单是否有效
      【解决方案4】:

      或者你可以使用:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多