/**
  * @return array validation rules for model attributes.
  */
 public function rules()
 {
     if (!self::$_rules) {
         $required = array();
         $numerical = array();
         $float = array();
         $decimal = array();
         $safe = array();
         $rules = array();
         $model = self::getFields();
         foreach ($model as $field) {
             $field_rule = array();
             array_push($safe, $field->varname);
             if ($field->required == BaseCccfCustomField::REQUIRED_YES) {
                 array_push($required, $field->varname);
             }
             if ($field->field_type == 'FLOAT') {
                 array_push($float, $field->varname);
             }
             if ($field->field_type == 'DECIMAL') {
                 array_push($decimal, $field->varname);
             }
             if ($field->field_type == 'INTEGER') {
                 array_push($numerical, $field->varname);
             }
             if ($field->field_type == 'VARCHAR' || $field->field_type == 'TEXT') {
                 $field_rule = array($field->varname, 'length', 'max' => $field->field_size, 'min' => $field->field_size_min);
                 if ($field->error_message) {
                     $field_rule['message'] = UserModule::t($field->error_message);
                 }
                 array_push($rules, $field_rule);
             }
             if ($field->other_validator) {
                 if (strpos($field->other_validator, '{') === 0) {
                     $validator = (array) CJavaScript::jsonDecode($field->other_validator);
                     foreach ($validator as $name => $val) {
                         $field_rule = array($field->varname, $name);
                         $field_rule = array_merge($field_rule, (array) $validator[$name]);
                         if ($field->error_message) {
                             $field_rule['message'] = UserModule::t($field->error_message);
                         }
                         array_push($rules, $field_rule);
                     }
                 } else {
                     $field_rule = array($field->varname, $field->other_validator);
                     if ($field->error_message) {
                         $field_rule['message'] = UserModule::t($field->error_message);
                     }
                     array_push($rules, $field_rule);
                 }
             } elseif ($field->field_type == 'DATE') {
                 if ($field->required) {
                     $field_rule = array($field->varname, 'date', 'format' => array('yyyy-mm-dd'));
                 } else {
                     $field_rule = array($field->varname, 'date', 'format' => array('yyyy-mm-dd', '0000-00-00'), 'allowEmpty' => true);
                 }
                 if ($field->error_message) {
                     $field_rule['message'] = UserModule::t($field->error_message);
                 }
                 array_push($rules, $field_rule);
             }
             if ($field->match) {
                 $field_rule = array($field->varname, 'match', 'pattern' => $field->match);
                 if ($field->error_message) {
                     $field_rule['message'] = UserModule::t($field->error_message);
                 }
                 array_push($rules, $field_rule);
             }
             if ($field->range) {
                 $field_rule = array($field->varname, 'in', 'range' => self::rangeRules($field->range));
                 if ($field->error_message) {
                     $field_rule['message'] = UserModule::t($field->error_message);
                 }
                 array_push($rules, $field_rule);
             }
         }
         array_push($rules, array(implode(',', $required), 'required'));
         array_push($rules, array(implode(',', $numerical), 'numerical', 'integerOnly' => true));
         array_push($rules, array(implode(',', $float), 'type', 'type' => 'float'));
         array_push($rules, array(implode(',', $decimal), 'match', 'pattern' => '/^\\s*[-+]?[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?\\s*$/'));
         array_push($rules, array(implode(',', $safe), 'safe'));
         self::$_rules = $rules;
     }
     return self::$_rules;
 }