00001 <?php 00002 00027 require_once 'Zend/Validate/Abstract.php'; 00028 00029 00036 class Zend_Validate_Barcode_Ean13 extends Zend_Validate_Abstract 00037 { 00042 const INVALID = 'invalid'; 00043 00048 const INVALID_LENGTH = 'invalidLength'; 00049 00054 const NOT_NUMERIC = 'ean13NotNumeric'; 00055 00061 protected $_messageTemplates = array( 00062 self::INVALID => "'%value%' is an invalid EAN-13 barcode", 00063 self::INVALID_LENGTH => "'%value%' should be 13 characters", 00064 self::NOT_NUMERIC => "'%value%' should contain only numeric characters", 00065 ); 00066 00075 public function isValid($value) 00076 { 00077 if (!is_string($value) || !ctype_digit($value)) { 00078 $this->_error(self::NOT_NUMERIC); 00079 return false; 00080 } 00081 00082 $this->_setValue($value); 00083 if (strlen($value) !== 13) { 00084 $this->_error(self::INVALID_LENGTH); 00085 return false; 00086 } 00087 00088 $barcode = strrev(substr($value, 0, -1)); 00089 $oddSum = 0; 00090 $evenSum = 0; 00091 00092 for ($i = 0; $i < 12; $i++) { 00093 if ($i % 2 === 0) { 00094 $oddSum += $barcode[$i] * 3; 00095 } elseif ($i % 2 === 1) { 00096 $evenSum += $barcode[$i]; 00097 } 00098 } 00099 00100 $calculation = ($oddSum + $evenSum) % 10; 00101 $checksum = ($calculation === 0) ? 0 : 10 - $calculation; 00102 00103 if ($value[12] != $checksum) { 00104 $this->_error(self::INVALID); 00105 return false; 00106 } 00107 00108 return true; 00109 } 00110 }