Zend框架1:两个相关字段的表单验证

时间:2015-12-25 12:01:28

标签: php forms validation zend-framework

我的ZF1表单有fieldland和fieldnumber,它们彼此相关,我需要检查两者是否都没有填充。怎么做这个验证?在ZF1表单中没有方法setValidatorGroup。那还有其他选择吗?

表单在xml中定义,因此fielddefinition类似于:

    <klant_mobiel_land>
        <type>text</type>
        <options>
            <label>Mobiel landcode, abonneenummer:</label>
            <maxlength>5</maxlength>
            <size>5</size>
            <validators>
                <telefoonnummerlandcodecinco>
                   <validator>TelefoonnummerLandcodeCinco</validator>
                </telefoonnummerlandcodecinco>
            </validators>
        </options>
    </klant_mobiel_land>
    <klant_mobiel_nummer>
        <type>text</type>
        <options>
            <maxlength>10</maxlength>
            <size>15</size>
        </options>
    </klant_mobiel_nummer>

我希望需要一个验证组,首先,是选项吗?第二,如何在xml中定义?也许是这样的事情:

  <validationgroups>
        <mobilephone_group>
            <elements>
                <klant_mobiel_nr>klant_mobiel_nummer</klant_mobiel_nr>
                <klant_mobiel_land>klant_mobiel_land</klant_mobiel_land>
            </elements>
            <validators>
                <neitherorbothfields>
                    <validator>neitherorbothfields</validator>
                </neitherorbothfields>
            </validators>
        </mobilephone_group>
    </validationgroups>

验证器本身,如何将两个值传递给它?也许是这样的事情:

class Zend_Validate_NeitherOrBothFields extends Zend_Validate_Abstract
{
     public function isValid($value, $context = null)
    {
        if (mytestToSeeIfNeitherOrBothAreFilled) {
            $this->_error('Only one of the two fields has been filled, fill either none or both', $value);
            return false;
        };
        return true;
    }

最好的问候,Tim van Steenbergen,tieka.nl

2 个答案:

答案 0 :(得分:0)

通常,验证器使用可选的$context var,正如您在上面指出的那样。但是您将验证器附加到单个字段(因此任何验证失败也将附加到该字段)。

标准示例是一个注册表单,其中征求password值和confirm_password值。验证程序可以附加到password字段,验证程序的isValid($value, $context = null)方法会将$value$context['confirm_password']进行比较。然后,失败将在password字段上设置错误,然后在视图脚本或表单装饰器中引用该错误。

答案 1 :(得分:0)

您可以拥有自定义验证器,并使用isValid可用的第二个参数来使其他帖子字段如下:

class Zend_Validate_NeitherOrBothFields  extends Zend_Validate_Abstract
{
    public function isValid($value, $context = NULL) {
       // in $context you will have all data from post which you can use to validate and do the stuffs you want and the end you can set the error message and return true/false
        if ($context['password'] !== $context['confirm_password']) {
            $this->_error('some message');
            return false; 
        }
        return true;
    }
}

然后在你的Zend Form中将这个验证器绑定到你的一个字段(比如密码)