I realize this is an old thread, but I've created a validation function for Vehicle Identification numbers (VIN) following this example.
The problem is that when the user presses TAB to move to the next field the validation is bypassed. If the VIN is invalid and the user presses ENTER, the validation function is called and displays the toolTipMsg, so the validation function works.
How do I get the validation to be called when the user presses TAB???
- Code: Select all
$tableColumns['vin'] = array(
'display_text' => 'VIN',
'val_fun' => array(&$this,'validateVin'),
// 'input_info' => 'onfocusout="validateVin();"',
'perms' => 'AETV'
);
Later in the class is the code for the validation:
- Code: Select all
public static function validateVin($col,$val,$info){
$vin=strtoupper($val);
//17 Chars <> I,O,Q - Last 4 Numeric
if(preg_match('/[A-HJ-NPR-Z0-9]{13}[0-9]{4}/', $vin) === 1){
$sum = self::getNumVal($vin[0]) * 8;
$sum += self::getNumVal($vin[1]) * 7;
$sum += self::getNumVal($vin[2]) * 6;
$sum += self::getNumVal($vin[3]) * 5;
$sum += self::getNumVal($vin[4]) * 4;
$sum += self::getNumVal($vin[5]) * 3;
$sum += self::getNumVal($vin[6]) * 2;
$sum += self::getNumVal($vin[7]) * 10;
$sum += self::getNumVal($vin[9]) * 9;
$sum += self::getNumVal($vin[10]) * 8;
$sum += self::getNumVal($vin[11]) * 7;
$sum += self::getNumVal($vin[12]) * 6;
$sum += self::getNumVal($vin[13]) * 5;
$sum += self::getNumVal($vin[14]) * 4;
$sum += self::getNumVal($vin[15]) * 3;
$sum += self::getNumVal($vin[16]) * 2;
$checksum = $sum % 11; //Modulus
return $checksum == $vin[8] || ($checksum == 10 && $vin[8] == 'X');
}
// Create custom validation message and return false
$this->Editor->showDefaultValidationMsg = false;
$this->Editor->addTooltipMsg('Not A Valid Vin #');
return false;
}
private static function getNumVal($char){
if(in_array($char, ['A', 'J', '1'])) {return 1;}
elseif(in_array($char, ['B', 'K', 'S', '2'])) {return 2;}
elseif(in_array($char, ['C', 'L', 'T', '3'])) {return 3;}
elseif(in_array($char, ['D', 'M', 'U', '4'])) {return 4;}
elseif(in_array($char, ['E', 'N', 'V', '5'])) {return 5;}
elseif(in_array($char, ['F', 'W', '6'])) {return 6;}
elseif(in_array($char, ['G', 'P', 'X', '7'])) {return 7;}
elseif(in_array($char, ['H', 'Y', '8'])) {return 8;}
elseif(in_array($char, ['R', 'Z', '9'])) {return 9;}
elseif($char == 0) {return 0;}
}
function __construct()
...