00001 <?php 00008 class SSNField extends CollectionField 00009 { 00016 public function __construct($name, Form &$parentForm, array $attribs = array()) 00017 { 00018 $attribs['fields'] = array( 00019 array('TextField', "${name}_1", array('size' => 3, 'regExp' => '/^[0-9]{3}$/', 'maxlength' => 3)), 00020 array('LabelField', "${name}_dash1", array('text' => '-')), 00021 array('TextField', "${name}_2", array('size' => 2, 'regExp' => '/^[0-9]{2}$/', 'maxlength' => 2)), 00022 array('LabelField', "${name}_dash2", array('text' => '-')), 00023 array('TextField', "${name}_3", array('size' => 4, 'regExp' => '/^[0-9]{4}$/', 'maxlength' => 4)) 00024 ); 00025 00026 parent::__construct($name, $parentForm, $attribs); 00027 00028 $this->autoAdvance = true; 00029 } 00030 00035 public function validate() 00036 { 00037 # call parent to validate individual text fields 00038 parent::validate(); 00039 00040 # If any of the sub fields have input automatically all sub fields _must_ have input 00041 if(!$this->allFieldsHaveData() && !$this->noFieldsHaveData()) 00042 { 00043 $this->hasError = true; 00044 $this->errorMessage = "The $this->title field must be a valid SSN number."; 00045 } 00046 } 00047 00048 00053 public function getData() 00054 { 00055 $ret = $this->fields[0]->getData() . '-' . $this->fields[2]->getData() . '-' . $this->fields[4]->getData(); 00056 00057 # Check for empty values 00058 if($ret == '--') 00059 return null; 00060 00061 return $ret; 00062 } 00063 00064 00069 public function setData($data) 00070 { 00071 # This nasty huge regex matches 123-45-6789, 123 45 6789, and 123456789 00072 if(preg_match('/(^|\s)(00[1-9]|0[1-9]0|0[1-9][1-9]|[1-6]\d{2}|7[0-6]\d|77[0-2])(-?|[\. ])([1-9]0|0[1-9]|[1-9][1-9])\3(\d{3}[1-9]|[1-9]\d{3}|\d[1-9]\d{2}|\d{2}[1-9]\d)($|\s|[;:,!\.\?])/', $data, $matches)) 00073 { 00074 $this->fields[0]->setData($matches[2]); 00075 $this->fields[2]->setData($matches[4]); 00076 $this->fields[4]->setData($matches[5]); 00077 } 00078 elseif($data != '') 00079 throw new InvalidValueException(); 00080 } 00081 00085 public function getSqlImpl() 00086 { 00087 return "$this->name = '" . $this->getData() . "'"; 00088 } 00089 } 00090 ?>