使用Zend_Form_Element_Select时,访问InArray验证程序的自定义错误消息

时间:2009-08-24 11:22:27

标签: php zend-framework zend-form

我正在使用Zend Framework 1.62(因为我们正在将完成的产品部署到Red Hat实例,它没有足够的PHP版本来支持> ZF1.62)。

使用Zend Form创建表单时,我添加了一个select元素,添加了一些多选项。 我使用Zend Form作为对象内验证层,通过它传递对象值并使用isValid方法确定所有值是否都在正常参数范围内。

Zend_Form_Element_Select完全按预期工作,如果输入的任何其他值不是我添加的多选项之一,则显示无效。

当我想在某个时刻显示表单时出现问题,我无法编辑由ZF自动添加的预先注册的“InArray”验证器创建的错误消息。我知道我可以禁用此行为,但除了错误消息之外它还可以正常工作。我尝试了以下内容:

$this->getElement('country')->getValidator('InArray')->setMessage('The country is not in the approved lists of countries');

// Doesn't work at all.

$this->getElement('country')->setErrorMessage('The country is not in the approved lists of countries');

//在应用程序中导致冲突,并且不允许对错误消息进行精细控制。

有人有什么想法吗?

3 个答案:

答案 0 :(得分:1)

我通常根据以下示例设置验证器:

$this->addElement('text', 'employee_email', array(
            'filters'    => array('StringTrim'),
            'validators' => array(                
                array('Db_NoRecordExists', false, array(
                    'employees',
                    'employee_email',
                    'messages' => array(Zend_Validate_Db_Abstract::ERROR_RECORD_FOUND => 'A user with email address %value% already exists')
                ))
            ),
            'label'     => 'Email address',
            'required'  => true,
            ));

元素选项中的验证器数组可以采用验证器名称(字符串)或数组。

传递数组时,第一个值是名称,第三个值是验证器的选项数组。您可以在此选项数组中为元素指定包含自定义消息的关键消息。

答案 1 :(得分:1)

如果您使用Zend_Form_Element_Select(或任何Multi子类),则在验证时,只有在没有存在的情况下才会自动添加InArray验证器。

您可以将验证器设置为:

$options = array(...);
$this->addElement('select', 'agree', array(
    'validators' => array(
        array('InArray', true, array(
            'messages' => array(
                Zend_Validate_InArray::NOT_IN_ARRAY => 'Custom message here',
             ),
             'haystack' => array_keys($options),
        )),
    'multiOptions' => $options,
));

然后将使用您的验证器而不是自动附加的验证器。

答案 2 :(得分:0)

$el = $this->addElement($name, $label, $require, 'select');

$validator = new Zend_Validate_InArray(array_keys(AZend_Geo::getStatesList()));
$validator->setMessage('Invalid US State.');

$el
->setMultiOptions(AZend_Geo::getStatesList())
->setRegisterInArrayValidator(false)

->addValidator($validator)

->addFilter(new Zend_Filter_StringToUpper())
->addFilter(new T3LeadBody_Filter_SetNull())

->setDescription('US State. 2 char.');