如何使用zend表单比较两个文本字段之间的值?

时间:2013-02-21 07:21:48

标签: php zend-framework zend-form zend-form-element

我有一个包含2个文本字段的表单,即minimum-amount&最大金额。我想知道是否可以将文本字段“最小金额”中的值与文本字段“最大金额”中的值进行比较反之亦然,在Zendform中使用验证器。

2 个答案:

答案 0 :(得分:3)

您需要为此创建自定义验证。

我认为这篇文章中的功能可以帮助你My_Validate_FieldCompare

答案 1 :(得分:1)

只需创建自己的验证器,验证器的isValid方法将获取验证器附加到的字段的值加上表单的整个上下文,这是所有其他表单字段的值数组。另外,你可以向验证器添加函数来设置上下文字段,如果它应该更小,相等,更大或甚至传递一个函数来比较......

这里是一些示例代码(未测试)

<?php

namespace My\Validator;

class MinMaxComp extends AbstractValidator
{
    const ERROR_NOT_SMALLER = 'not_smaller';
    const ERROR_NOT_GREATER = 'not_greater';
    const ERROR_CONFIG = 'wrong_config';

    const TYPE_SMALLER = 0;
    const TYPE_GREATER = 1;

    protected $messageTemplates = array(
        self::ERROR_NOT_SMALLER => "Blah",
        self::ERROR_NOT_GREATER => "Blah",
        self::WRONG_CONFIG => "Blah",
    );

    protected $type;
    protected $contextField;

    public function setType($type)
    {
        $this->type = $type;
    }

    public function setContextField($fieldName)
    {
        $this->contextField = $fieldName;
    }

    public function isValid($value, $context = null)
    {
        $this->setValue($value);

        if (!is_array($context) || !isset($context[$this->contextField])) {

            return false;
        }

        if ($this->type === self::TYPE_SMALLER) {

            if (!$result = ($value < $context[$this->contextField])) {

                $this->error(self::ERROR_NOT_SMALLER);
            }

        } else if ($this->type === self::TYPE_GREATER) {

            if (!$result = ($value > $context[$this->contextField])) {

                $this->error(self::ERROR_NOT_GREATER);
            }

        } else {

            $result = false;
            $this->error(self::ERROR_CONFIG);
        }

        return $result;
    }
}