00001 <?php 00002 00027 require_once 'Zend/Validate/Abstract.php'; 00028 00029 00036 class Zend_Validate_Barcode_UpcA extends Zend_Validate_Abstract 00037 { 00042 const INVALID = 'invalid'; 00043 00048 const INVALID_LENGTH = 'invalidLength'; 00049 00055 protected $_messageTemplates = array( 00056 self::INVALID => "'%value%' is an invalid UPC-A barcode", 00057 self::INVALID_LENGTH => "'%value%' should be 12 characters", 00058 ); 00059 00068 public function isValid($value) 00069 { 00070 if (!is_string($value)) { 00071 $this->_error(self::INVALID); 00072 return false; 00073 } 00074 00075 $this->_setValue($value); 00076 if (strlen($value) !== 12) { 00077 $this->_error(self::INVALID_LENGTH); 00078 return false; 00079 } 00080 00081 $barcode = substr($value, 0, -1); 00082 $oddSum = 0; 00083 $evenSum = 0; 00084 00085 for ($i = 0; $i < 11; $i++) { 00086 if ($i % 2 === 0) { 00087 $oddSum += $barcode[$i] * 3; 00088 } elseif ($i % 2 === 1) { 00089 $evenSum += $barcode[$i]; 00090 } 00091 } 00092 00093 $calculation = ($oddSum + $evenSum) % 10; 00094 $checksum = ($calculation === 0) ? 0 : 10 - $calculation; 00095 00096 if ($value[11] != $checksum) { 00097 $this->_error(self::INVALID); 00098 return false; 00099 } 00100 00101 return true; 00102 } 00103 }