protected static function resolveColumnTypeAndLengthFromRules($modelClassName, $member, array $rules, &$type, &$length, &$notNull, &$default, &$messageLogger) { $suitableModelClassName = static::findSuitableModelClassName($modelClassName); if (!$suitableModelClassName) { $messageLogger->addErrorMessage(Zurmo::t('Core', 'Unable to find a suitable non-abstract class for' . ' validators against {{model}}', array('{{model}}' => $modelClassName))); return; } $model = $suitableModelClassName::model(); $yiiValidators = CValidator::$builtInValidators; $yiiValidatorsToRedBeanValidators = RedBeanModel::getYiiValidatorsToRedBeanValidators(); foreach ($rules as $validatorMetadata) { assert('isset($validatorMetadata[0])'); assert('isset($validatorMetadata[1])'); $validatorName = $validatorMetadata[1]; $validatorParameters = array_slice($validatorMetadata, 2); if (isset($yiiValidators[$validatorName])) { $validatorName = $yiiValidators[$validatorName]; } if (isset($yiiValidatorsToRedBeanValidators[$validatorName])) { $validatorName = $yiiValidatorsToRedBeanValidators[$validatorName]; } if (!@class_exists($validatorName)) { continue; } $validator = CValidator::createValidator($validatorName, $model, $member, $validatorParameters); switch ($validatorName) { case 'RedBeanModelTypeValidator': case 'TypeValidator': case 'CTypeValidator': if (in_array($validator->type, array('blob', 'boolean', 'date', 'datetime', 'longblob', 'string', 'float', 'integer', 'time', 'text', 'longtext'))) { if (!isset($type) || $validator->type == 'float') { $type = $validator->type; } } break; case 'CBooleanValidator': $type = 'boolean'; break; case 'CStringValidator': if (!isset($type) || $type == 'string') { static::resolveStringTypeAndLengthByMaxLength($type, $length, $validator->max); } break; case 'CUrlValidator': $type = 'string'; if (!isset($length)) { $length = 255; } break; case 'CEmailValidator': $type = 'string'; if (!isset($length)) { $length = 255; } break; case 'RedBeanModelNumberValidator': case 'CNumberValidator': if ((!isset($type) || $type == 'integer') && !isset($validator->precision)) { static::resolveIntegerTypeByMinAndMaxValue($type, $validator->min, $validator->max); } break; case 'RedBeanModelDefaultValueValidator': case 'CDefaultValueValidator': // Left here for future use if we want to set defaults on db level too. //$default = 'DEFAULT ' . $validator->value; break; case 'RedBeanModelRequiredValidator': case 'CRequiredValidator': //$notNull = 'NOT NULL'; // Not Coding Standard // Left here for future use if we want to set required on db level too. break; case 'RedBeanModelUniqueValidator': case 'CUniqueValidator': static::registerUniqueIndexByMemberName($member, $modelClassName); break; } } // we have a string and we don't know anything else about it, better to set it as text. if ($type == 'string' && !isset($length)) { $type = 'text'; } }