Zend_Form -> Nicely change setRequired() validate

2019-03-08 19:32发布

问题:

Say I create a text element like this:

$firstName = new Zend_Form_Element_Text('firstName');
$firstName->setRequired(true);

Whats the best way to change the default error message from:

Value is empty, but a non-empty value is required

to a custom message? I read somewhere that to replace the message, just use addValidator(..., instead (NO setRequired), like this:

$firstName = new Zend_Form_Element_Text('firstName');
$firstName->addValidator('NotEmpty', false, array('messages'=>'Cannot be empty'));

but in my testing, this doesn't work - it doesn't validate at all - it will pass with an empty text field. Using both (addValidator('NotEmp.. + setRequired(true)) at the same time doesn't work either - it double validates, giving two error messages.

Any ideas?

Thanks!

回答1:

An easier way to set this "site-wide" would be to possibly do the following in a bootstrap or maybe a base zend_controller:

<?php    
$translateValidators = array(
                        Zend_Validate_NotEmpty::IS_EMPTY => 'Value must be entered',
                        Zend_Validate_Regex::NOT_MATCH => 'Invalid value entered',
                        Zend_Validate_StringLength::TOO_SHORT => 'Value cannot be less than %min% characters',
                        Zend_Validate_StringLength::TOO_LONG => 'Value cannot be longer than %max% characters',
                        Zend_Validate_EmailAddress::INVALID => 'Invalid e-mail address'
                    );
    $translator = new Zend_Translate('array', $translateValidators);
    Zend_Validate_Abstract::setDefaultTranslator($translator);
?>


回答2:

Give this a shot:

$firstName = new Zend_Form_Element_Text('firstName');
$firstName->setLabel('First Name')
          ->setRequired(true)
          ->addValidator('NotEmpty', true)
          ->addErrorMessage('Value is empty, but a non-empty value is required.');

The key is that "true" on the validator if you set that to true, it'll kill the other validations after it. If you add more than one validation method, but set that to false, it will validate all methods.



回答3:

Zend_Form sets the required validation error as 'isEmpty', so you can override its message using setErrorMessages(). For example:

//Your Required Element
$element->setRequired(true)->setErrorMessages(array(
'isEmpty'=>'Please fill this field'
));

It worked for me, using ZF 1.11



回答4:

Try

->addValidator('Digits', false);

or

->addValidator('Digits');

You assume that to check Digits it has to have a string length anyway.

Also, I like to do some custom error messages like this:

$firstName->getValidator('NotEmpty')->setMessage('Please enter your first name');

This allows you to "get" the validator and then "set" properties of it.



回答5:

Try the following.

$subjectElement->setRequired(true)->addErrorMessage('Please enter a subject for your message');

This worked form me.



回答6:

But try this:

$firstName->setRequired(true)
          ->addValidator('NotEmpty', false, array('messages' => 'bar'))
          ->addValidator('Alpha', false, array('messages'=>'Must contain only letters'));

If left empty and submitted, itll give two messages bar & '' is an empty string. Its that second message thats coming from setRequired(true) thats the problem



回答7:

if you put:

$element->setRequired(false);

the validations don't work at all, you have to define:

$element->setAllowEmpty(false);

in order to get the correct behavior of the validations.



回答8:

Try this..

$ausPostcode = new Zend_Form_Element_Text('aus_postcode'); $ausPostcode->setLabel('Australian Postcode')
->setRequired(true)
->addValidator('StringLength', false, array(4, 4))
->addValidator(new Zend_Validate_Digits(), false)
->getValidator('digits')->setMessage('Postcode can only contain digits');

This sets the custom error message only for the Digits validator.



回答9:

One small issue. This code:

$zipCode->setLabel('Postal Code')
        ->addValidator('StringLength', true, array( 5, 5 ) )
        ->addErrorMessage('More than 5')
        ->addValidator('Digits', true)
        ->addErrorMessage('Not a digit');

Will generate both error messages if either validation fails. Isn't is supposed to stop after the first fails?



回答10:

use a zend translator with zend_validate.php from

ZendFramework-1.11.3\resources\languages\en\Zend_Validate.php and then modify this file how you need

and then modify it accordingly to your needs