Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Starting pass through validation handling.
Implemented phone, and postal pass throughs.
Adding tests.
  • Loading branch information
markstory committed Nov 11, 2009
1 parent c5a4191 commit 63ee8f0
Show file tree
Hide file tree
Showing 2 changed files with 70 additions and 2 deletions.
38 changes: 36 additions & 2 deletions cake/libs/validation.php
Expand Up @@ -672,12 +672,16 @@ function phone($check, $regex = null, $country = 'all') {
if (is_null($_this->regex)) {
switch ($_this->country) {
case 'us':
case 'all':
case 'can':
// includes all NANPA members. see http://en.wikipedia.org/wiki/North_American_Numbering_Plan#List_of_NANPA_countries_and_territories
default:
$_this->regex = '/^(?:\+?1)?[-. ]?\\(?[2-9][0-8][0-9]\\)?[-. ]?[2-9][0-9]{2}[-. ]?[0-9]{4}$/';
break;
}
}
if (empty($_this->regex)) {
return $_this->_pass('phone', $check, $country);
}
return $_this->_check();
}

Expand All @@ -698,6 +702,9 @@ function postal($check, $regex = null, $country = null) {
if (is_array($check)) {
$_this->_extract($check);
}
if (empty($country)) {
$_this->country = 'us';
}

if (is_null($_this->regex)) {
switch ($_this->country) {
Expand All @@ -715,11 +722,13 @@ function postal($check, $regex = null, $country = null) {
$_this->regex = '/^[1-9]{1}[0-9]{3}$/i';
break;
case 'us':
default:
$_this->regex = '/\\A\\b[0-9]{5}(?:-[0-9]{4})?\\b\\z/i';
break;
}
}
if (empty($_this->regex)) {
return $_this->_pass('postal', $check, $country);
}
return $_this->_check();
}

Expand Down Expand Up @@ -834,6 +843,31 @@ function userDefined($check, $object, $method, $args = null) {
return call_user_func_array(array(&$object, $method), array($check, $args));
}

/**
* Attempts to pass unhandled Validation locales to a class starting with $classPrefix
* and ending with Validation. For example $classPrefix = 'nl', the class would be
* `NlValidation`.
*
* @param string $method The method to call on the other class.
* @param mixed $check The value to check or an array of parameters for the method to be called.
* @param string $classPrefix The prefix for the class to do the validation.
* @return mixed Return of Passed method, false on failure
* @access protected
**/
function _pass($method, $check, $classPrefix) {
$className = ucwords($classPrefix) . 'Validation';
if (!class_exists($className)) {
trigger_error(sprintf(__('Could not find %s class, unable to complete validation.', true), $className), E_USER_WARNING);
return false;
}
if (!method_exists($className, $method)) {
trigger_error(sprintf(__('Method %s does not exist on %s unable to complete validation.', true), $method, $className), E_USER_WARNING);
return false;
}
$check = (array)$check;
return call_user_func_array(array($className, $method), $check);
}

/**
* Runs a regular expression match.
*
Expand Down
34 changes: 34 additions & 0 deletions cake/tests/cases/libs/validation.test.php
Expand Up @@ -41,6 +41,25 @@ function customValidate($check) {
}
}

/**
* TestNlValidation class
*
* Used to test pass through of Validation
*
* @package cake.tests.cases.libs
*/
class TestNlValidation {
/**
* postal function, for testing postal pass through.
*
* @param string $check
* @return void
*/
function postal($check) {
return true;
}
}

/**
* Test Case for Validation Class
*
Expand Down Expand Up @@ -1998,6 +2017,21 @@ function testPostal() {
$this->assertTrue(Validation::postal('13089-3333'));
}

/**
* test the pass through calling of an alternate locale with postal()
*
* @return void
**/
function testPassThroughMethod() {
$this->assertTrue(Validation::postal('text', null, 'testNl'));

$this->expectError('Could not find AUTOFAILValidation class, unable to complete validation.');
Validation::postal('text', null, 'AUTOFAIL');

$this->expectError('Method phone does not exist on TestNlValidation unable to complete validation.');
Validation::phone('text', null, 'testNl');
}

/**
* testSsn method
*
Expand Down

0 comments on commit 63ee8f0

Please sign in to comment.