Zend 表单验证 - NotEmpty + StringLength
Zend form validation - NotEmpty + StringLength
在表单元素中,我编辑了错误消息:
$this->addElement('text', 'type', array(
'label' => 'Type: ',
'class' => 'form-control',
'placeholder' => 'type',
'required' => true,
'validators' => array(
array('validator' => 'StringLength', 'options' => array('min' => 3, 'max' => 10, 'messages' => array('stringLengthTooShort' => 'The type is too short.', 'stringLengthTooLong' => 'The type is too long.')))
,array('validator' => 'NotEmpty', 'options' => array('messages' => array('isEmpty' => 'Type is required.')))
),
));
问题是,如果我发送空表格,两条消息都会显示(类型太短 + 类型是必需的。)。但在这种情况下,我只需要显示 NotEmpty 错误消息而不是 Stringlength (min length 3) 错误消息。所以我需要在 NotEmpty 验证之后验证 minlength 。谢谢
编辑:
我已经尝试更改调用 required 和 validators 的不同位置以及它们链的不同设置 true/false (下一个代码),但如果元素为空
它仍然向我显示两个错误消息
$this->addElement('text', 'type', array(
'label' => 'Type: ',
'class' => 'form-control',
'placeholder' => 'type',
'validators' => array(
array('validator' => 'NotEmpty',true, 'options' => array('messages' => array('isEmpty' => 'Type is requiredDDDD.'))),
array('validator' => 'StringLength',false, 'options' => array('min' => 3, 'max' => 10, 'messages' => array('stringLengthTooShort' => 'The type is too short.', 'stringLengthTooLong' => 'The type is too long.')))
),
'required' => true,
));
您可以尝试这样的操作:
评论第二个验证者
$this->addElement('text', 'type', array(
'label' => 'Type: ',
'class' => 'form-control',
'placeholder' => 'type',
'required' => true,
'validators' => array(
//array('validator' => 'StringLength', 'options' => array('min' => 3, 'max' => 10, 'messages' => array('stringLengthTooShort' => 'The type is too short.', 'stringLengthTooLong' => 'The type is too long.'))),
array('validator' => 'NotEmpty', 'options' => array('messages' => array('isEmpty' => 'Type is required.')))
),
));
并在isValid()
函数中添加验证器:
public function isValid($data) {
$etat_valid = parent::isValid($data);
$error = $this->getElement('type')->getMessages();
if (empty($error)){
$validator = new Zend_Validate_StringLength(array(
'min' => 3,
'max' => 10,
'messages' => array('stringLengthTooShort' => 'The type is too short.',
'stringLengthTooLong' => 'The type is too long.')
)
);
$etat_valid_type = $validator->isValid($data['type']);
if (!$etat_valid_type){
$this->getElement('type')->addErrors($validator->getMessages());
}
}
return $etat_valid && $etat_valid_type;
}
我最后一条评论的解决方案,如何为相同形式的更多元素添加 NotEmpty + 不同的 StringLength 验证器:
public function isValid($data) {
$etat_valid = parent::isValid($data);
$elements = Array(Array('name', 4, 9), Array('type', 3, 10), Array('type2', 2, 12));
for ($index = 0; $index < count($elements); $index++) {
$error = $this->getElement($elements[$index][0])->getMessages();
if (empty($error)) {
$validator = new Zend_Validate_StringLength(array(
'min' => $elements[$index][1],
'max' => $elements[$index][2],
)
);
$validator->setMessages(array(
Zend_Validate_StringLength::TOO_SHORT =>
'Too short: min '.$elements[$index][1].' chars.',
Zend_Validate_StringLength::TOO_LONG =>
'Too long: max '.$elements[$index][2].' chars.'
));
$etat_valid_type = $validator->isValid($data[$elements[$index][0]]);
if (!$etat_valid_type) {
$this->getElement($elements[$index][0])->addErrors($validator->getMessages());
}
}
}
return $etat_valid && $etat_valid_type;
}
非常感谢 Doydoy 的回答
在表单元素中,我编辑了错误消息:
$this->addElement('text', 'type', array(
'label' => 'Type: ',
'class' => 'form-control',
'placeholder' => 'type',
'required' => true,
'validators' => array(
array('validator' => 'StringLength', 'options' => array('min' => 3, 'max' => 10, 'messages' => array('stringLengthTooShort' => 'The type is too short.', 'stringLengthTooLong' => 'The type is too long.')))
,array('validator' => 'NotEmpty', 'options' => array('messages' => array('isEmpty' => 'Type is required.')))
),
));
问题是,如果我发送空表格,两条消息都会显示(类型太短 + 类型是必需的。)。但在这种情况下,我只需要显示 NotEmpty 错误消息而不是 Stringlength (min length 3) 错误消息。所以我需要在 NotEmpty 验证之后验证 minlength 。谢谢
编辑: 我已经尝试更改调用 required 和 validators 的不同位置以及它们链的不同设置 true/false (下一个代码),但如果元素为空
它仍然向我显示两个错误消息$this->addElement('text', 'type', array(
'label' => 'Type: ',
'class' => 'form-control',
'placeholder' => 'type',
'validators' => array(
array('validator' => 'NotEmpty',true, 'options' => array('messages' => array('isEmpty' => 'Type is requiredDDDD.'))),
array('validator' => 'StringLength',false, 'options' => array('min' => 3, 'max' => 10, 'messages' => array('stringLengthTooShort' => 'The type is too short.', 'stringLengthTooLong' => 'The type is too long.')))
),
'required' => true,
));
您可以尝试这样的操作:
评论第二个验证者
$this->addElement('text', 'type', array( 'label' => 'Type: ', 'class' => 'form-control', 'placeholder' => 'type', 'required' => true, 'validators' => array( //array('validator' => 'StringLength', 'options' => array('min' => 3, 'max' => 10, 'messages' => array('stringLengthTooShort' => 'The type is too short.', 'stringLengthTooLong' => 'The type is too long.'))), array('validator' => 'NotEmpty', 'options' => array('messages' => array('isEmpty' => 'Type is required.'))) ), ));
并在
isValid()
函数中添加验证器:public function isValid($data) { $etat_valid = parent::isValid($data); $error = $this->getElement('type')->getMessages(); if (empty($error)){ $validator = new Zend_Validate_StringLength(array( 'min' => 3, 'max' => 10, 'messages' => array('stringLengthTooShort' => 'The type is too short.', 'stringLengthTooLong' => 'The type is too long.') ) ); $etat_valid_type = $validator->isValid($data['type']); if (!$etat_valid_type){ $this->getElement('type')->addErrors($validator->getMessages()); } } return $etat_valid && $etat_valid_type; }
我最后一条评论的解决方案,如何为相同形式的更多元素添加 NotEmpty + 不同的 StringLength 验证器:
public function isValid($data) {
$etat_valid = parent::isValid($data);
$elements = Array(Array('name', 4, 9), Array('type', 3, 10), Array('type2', 2, 12));
for ($index = 0; $index < count($elements); $index++) {
$error = $this->getElement($elements[$index][0])->getMessages();
if (empty($error)) {
$validator = new Zend_Validate_StringLength(array(
'min' => $elements[$index][1],
'max' => $elements[$index][2],
)
);
$validator->setMessages(array(
Zend_Validate_StringLength::TOO_SHORT =>
'Too short: min '.$elements[$index][1].' chars.',
Zend_Validate_StringLength::TOO_LONG =>
'Too long: max '.$elements[$index][2].' chars.'
));
$etat_valid_type = $validator->isValid($data[$elements[$index][0]]);
if (!$etat_valid_type) {
$this->getElement($elements[$index][0])->addErrors($validator->getMessages());
}
}
}
return $etat_valid && $etat_valid_type;
}
非常感谢 Doydoy 的回答