我正在使用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');
//在应用程序中导致冲突,并且不允许对错误消息进行精细控制。
有人有什么想法吗?
本
答案 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.');