Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Class Members | File Members | Related Pages

abstract-field.inc.php

Go to the documentation of this file.
00001 <?php
00002 require_once('field.inc.php');
00003 
00009 abstract class AbstractField implements Field
00010 {
00011     public $name = ''; 
00012     protected $title = ''; 
00013     protected $value = ''; 
00014     protected $attribs = array(); 
00015     protected $required = false; 
00016     protected $regExp = ''; 
00017     protected $errorMessage = ''; 
00018     protected $hasError = false; 
00019     protected $parentForm = ''; 
00020     public $definition = '';
00021 
00022     
00035     public function __construct($name, Form &$parentForm, array $attribs = array())
00036     {
00037         $this->name = $name;
00038         $this->parentForm = $parentForm;
00039 
00040         $this->required = false;
00041         $this->parseExtras($attribs);
00042         $this->title = array_key_exists('title', $attribs) ? $attribs['title'] : ucwords(str_replace('_', ' ', $name));
00043         $this->errorMessage = "The $this->title field had an error.";
00044         
00045         if(!isset($this->attribs['id']))
00046             $this->attribs['id'] = $this->name;
00047 
00048         $this->hasError = null;
00049     }
00050 
00055     public function __get($name)
00056     {
00057         if(isset($this->$name) || is_null($this->$name))
00058             return $this->$name;
00059         else if(array_key_exists($name, $this->attribs))
00060             return $this->attribs[$name];
00061 
00062         return false;
00063     }
00064 
00070     public function __set($name, $value)
00071     {
00072         if($name == 'value')
00073             $this->setData($value);
00074         else if(isset($this->$name))
00075             $this->$name = $value;
00076         else
00077             $this->attribs[$name] = $value;
00078 
00079         return true;
00080     }
00081 
00085     public function validate()
00086     {
00087         $this->setDataFromRequest();
00088 
00089         $this->hasError = false;
00090         
00091         if($this->required && $this->value == null)
00092         {
00093             $this->hasError = true;
00094             $this->errorMessage = "The $this->title field is required.";
00095         }
00096         
00097         if($this->regExp && !$this->hasError)
00098         {
00099             list($this->regExp, $this->errorMessage) = 
00100                 array_values($this->convertSpecialRegex($this->regExp, $this->errorMessage));
00101 
00102             # Error if the string doesn't match the regex, or if the value is empty (required fields are handled above)
00103             $this->hasError = !((bool)preg_match($this->regExp, $this->value) || $this->value == null);
00104         }
00105     }
00106 
00107     public function getTitle()
00108     {
00109         if ($this->definition == '')
00110             return $this->title;
00111         else
00112             return "<acronym title=\"$this->definition\">$this->title</acronym>";
00113     }
00114 
00119     public function hasError()
00120     {
00121         if($this->hasError === null)
00122             throw new NotValidatedException($this);
00123 
00124         return (bool)$this->hasError;
00125     }
00126 
00131     public function forceError()
00132     {
00133         $this->hasError = true;
00134     }
00135 
00140     public function getSqlImpl()
00141     {
00142         return "$this->name = '$this->value'";
00143     }
00144 
00149     public function setData($value)
00150     {
00151         $this->value = $value;
00152     }
00153 
00157     public function getData()
00158     {
00159         return $this->value;
00160     }
00161 
00166     public function getJs()
00167     {
00168         return null; # No-Op
00169     }
00170 
00174     public function getCss()
00175     {
00176         return null; # No-Op
00177     }
00178 
00183     public function addAttributes(array $attr)
00184     {
00185         $this->attribs = array_merge($this->attribs, $attr);
00186     }
00187 
00188 
00193     protected function parseExtras(array $data)
00194     {
00195         $this->attribs = array(); # clear out any existing value
00196 
00197         foreach($data as $key => $value)
00198             $this->__set($key, $value);
00199     }
00200 
00201 
00206     protected function extrasAsAttributes()
00207     {
00208         $ret = array();
00209             
00210         foreach(array_change_key_case($this->attribs, CASE_LOWER) as $key => $value)
00211             $ret[] = "$key=\"$value\"";
00212         return implode(' ', $ret);
00213     }
00214 
00218     protected function setDataFromRequest()
00219     {
00220         if(isset($_REQUEST[$this->name]))
00221             $this->value = $_REQUEST[$this->name];
00222     }
00223 
00224     
00232     protected function convertSpecialRegex($regExp, $defaultError)
00233     {
00234         $error = $defaultError;
00235         switch($regExp)
00236         {
00237             case 'number':
00238                 $regExp = '/^-?[0-9]+$/';
00239                 $error = "The $this->title field must be a number.";
00240                 break;
00241 
00242             case 'float':
00243                 $regExp = '/^-?([0-9]*\.)?[0-9]+$/';
00244                 $error = "The $this->title field must be a number.";
00245                 break;
00246 
00247             case 'alpha':
00248                 $regExp = '/^[A-Za-z]*$/';
00249                 $error = "The $this->title field must consist of only alphabetic characters.";
00250                 break;
00251 
00252             case 'alphanumeric':
00253                 $regExp = '/^[A-Za-z0-9]*$/';
00254                 $error = "The $this->title field must consist of only alpha numeric characters.";
00255                 break;
00256             
00257             case 'email':
00258                 $regExp = '/^[a-z0-9]+([_\\.-][a-z0-9]+)*@([a-z0-9]+([\.-][a-z0-9]+)*)+\\.[a-z]{2,}$/i';
00259                 $error = "The $this->title field must be a real email.";
00260                 break;
00261         }
00262         
00263         return array('regexp' => $regExp, 'message' => $error);
00264     }
00265 
00270     protected static function assertAttributeIsArray(&$value)
00271     {
00272         if(!is_array($value))
00273             throw new InvalidAttributeValueException($value, 'An Array'); 
00274     }
00275 
00281     protected static function assertAttributeIsObject($type, &$value)
00282     {
00283         if(!($value instanceof $type))
00284             throw new InvalidAttributeValueException($value, $type); 
00285     }
00286 }
00287 ?>

Generated on Fri Oct 27 12:26:39 2006 for BaseJumper by doxygen 1.3.9.1