Sunday
2
May
2010

Validation of two values or how to proove identical-ness

Hy interested ones,

today I integrated two improvements for Zend_Validate_Identical.

Zend_Validate_Identical is a validator which enables you to check if two values are identical.
Values means in this case string, integers, floats, or even objects.

A manual validation would look like this:

$valid = new Zend_Validate_Identical(array('token' => '1234'));
	
if ($valid->isValid($input)) {
    // let's go on
} else {
    // oops... not valid
}

Simple as is…

Now, when $input is the string “1234” we will get true. When it differs we will get false. This means even if we have a integer “1234” the validation will fail. The reason behind this behaviour is that Zend_Validate_Identical does a strict validation including the type of the input.

But sometimes it is wished and necessary to validate only the content regardless of it’s type.
Zend_Validate_Identical supports now also non-strict validation. See the following example:

$valid = new Zend_Validate_Identical(
    array('token' => '1234', 'strict' => false)
);
	
if ($valid->isValid($input)) {
    // let's go on
} else {
    // oops... not valid
}

As you can see the above example is nearly identical to the first example with one difference. We defined the property strict to be false. By using this option we said Zend_Validate_Identical to use non-strict validation.

In this case, when $input is a integer “1234” we will also get true in return and also when it’s a float “1234”.

Now what to do when you want to validate if two form elements are identical. Seems tricky as Zend_Validate_Identical has no connection to Zend_Form, and it would not know which two elements you want to validate.

Easy as is, you can now give the elements name as token which holds the token to validate against. What does this mean? Let’s see a little example:

<?php
error_reporting(E_ALL|E_STRICT);
ini_set('include_path',ini_get('include_path').PATH_SEPARATOR.'../library');
require_once('Zend/Loader/Autoloader.php');
$loader = Zend_Loader_Autoloader::getInstance();
print "<pre>";
	
$request = new Zend_Controller_Request_Http();
	
// setup the form
$form = new Zend_Form();
$form->setMethod(Zend_Form::METHOD_POST)
$form->addElement('password', 'password1');
$form->addElement('password', 'password2', array(
    'validators' => array(
        array('identical', false, array('token' => 'password1'))
    )
));
$form->addElement('submit', 'submit');
	
// check the form
if($request->isPost()) {
    $formData = $request->getPost();
    if($form->isValid($formData)) {
        $form->getValues();
        echo "FORM VALID";
    } else {
        print "\nVALIDATION FAILURE:";
        print_r($form->getMessages());
    }
}
print "</pre>";
?>
<html>
<head>
<title>Test</title>
</head>
<body>
<?php echo $form->render(new Zend_View());?>
</body>
</html>

You can run the above example standalone in your browser. It shows you the behaviour of Zend_Validate_Identical and how to combine it efficent within Zend_Form.

For us the important line is:

$form->addElement('password', 'password1');
$form->addElement('password', 'password2', array(
    'validators' => array(
        array('Identical', false, array('token' => 'password1'))
    )
));

As you see we added the Identical validator to the second element by using the first elements name as token.
This way the value of the first element is compared with the value of the second element.

Simple as is :-)

This is handy when you want to validate two user inputs. For example when your user has to enter his email adress two times to be sure he did not mistype it, or he has to enter the same password two times.

Note that these two described features are available within trunk and as with ZF 1.10.5 and NOT BELOW.

I hope you find this two features useful. More to come soon…

Greetings
Thomas Weidner
I18N Team Leader, Zend Framework

Zend Framework Advisory Board Member
Zend Certified Engineer for Zend Framework

Back to top
Sunday
17
January
2010

Translating validation messages

Hy interested ones,

many of you are using validators within Zend Framework.

As you know the returned error messages can be changed. This is very important for sites which are not delivered in english.
But they must translate all messages into their own language. This is a very tendious task.

Therefor I added today a new feature to Zend Framework. In fact it’s not really a new issue but more a long outstanding work :-)

Zend Framework comes now with translation resources.
These are pre-translated validation messages which are shipped as with release 1.10.

To use them you can simply do the following in your bootstrap:

$translator = new Zend_Translate(
    'array',
    '/resources/languages',
    $language,
    array('scan' => Zend_Translate::LOCALE_DIRECTORY)
);
Zend_Validate_Abstract::setDefaultTranslator($translator);

When $language would be “de” all validation message are returned in german.
This should save you a lot of work for your project.

Note that the resources are outside the ‘/library’ path.
And you can also change the existing resources to do your own translations.
This is much simpler and faster than creating a new translation file manually.

For more informations take a look into Zend Frameworks manual.

I hope you find this feature useful and
have fun with Zend Framework,

Greetings
Thomas Weidner
I18N Team Leader, Zend Framework

Zend Framework Advisory Board Member
Zend Certified Engineer for Zend Framework

Back to top
Saturday
2
January
2010

New Zend_Validate_NotEmpty implementation

First a happy new year to all reading my blog. :-)

I hope this year will become better than the last. Not that the last year was bad… it was really good. But things can always get better. ;-)

And now to business:

Today I added a completly new implementation for the “not empty” validator. Zend_Validate_NotEmpty worked in past only the “framework” way. It detected whitespaces as empty and excluded ‘0′. This collidates with how PHP’s empty() works.

The new implementation which is available with Zend Framework 1.10 allows you to customize this behaviour.
You are not only able to do validations conform to empty() but you are also able to customize which input to detect as empty and which not.

Let’s go into details:
Zend_Validate_NotEmpty allows to define a constant for each type which it has to accept.

$validator = new Zend_Validate_NotEmpty();
var_dump($validator->isValid('0'));

The above returns false.

Now let’s emulate PHP’s default behaviour:

$validator = new Zend_Validate_NotEmpty(Zend_Validate_NotEmpty::PHP);
var_dump($validator->isValid('0'));

As you will see, the above returns true.

So simply by defining the type you can change the behaviour of this validator.
The following types are accepted:
* BOOLEAN (true/false)
* INTEGER (0)
* FLOAT (0.0)
* STRING ('’)
* ZERO (’0′)
* EMPTY_ARRAY (array())
* NULL (null)
* PHP (emulates PHP’s empty() behaviour)
* SPACE (’ ‘)
* ALL (all above)

You can also give multiple types as array:

$validator = new Zend_Validate_NotEmpty(
    array(
        Zend_Validate_NotEmpty::INTEGER,
        Zend_Validate_NotEmpty::ZERO
    )
);

The above would only validate 0 and the string 0 as empty.
And for simplification you can also give a Zend_Config object.

This new behaviour fixes several problems and issues which have been experienced in past.
I hope you will find this new extension useful.

Have fun and a happy new year.

Greetings
Thomas Weidner
I18N Team Leader, Zend Framework

Zend Framework Advisory Board Member
Zend Certified Engineer for Zend Framework

Back to top