public static function getFieldType($type)
{
if (empty($type)) {
return null;
}
// Remove parentheses, indicating field options / size (they don't matter in type detection)
if (strpos($type, '(') === false) {
$type .= '()';
}
list($type, $parameters) = explode('(', $type);
$detectedType = null;
$detectedParameters = null;
$type = strtolower($type);
switch (trim($type)) {
case 'varchar':
case 'text':
case 'char':
case 'character varying':
case 'nvarchar':
case 'nchar':
$detectedType = 'Text';
break;
case 'smalltext':
case 'longtext':
case 'mediumtext':
$detectedType = 'Text';
break;
case 'date':
case 'datetime':
case 'time':
case 'year':
case 'timestamp':
case 'timestamp without time zone':
case 'timestamp with time zone':
$detectedType = 'Calendar';
break;
case 'tinyint':
case 'smallint':
$detectedType = 'Checkbox';
break;
case 'int':
case 'integer':
case 'bigint':
// Because the Integer field is rendered in Joomla! as a drop-down list. Ugh!!!
$detectedType = 'Numeric';
break;
case 'float':
case 'double':
case 'currency':
$detectedType = 'Numeric';
break;
case 'enum':
$detectedType = 'GenericList';
$parameters = trim($parameters, "\t\n\r\v )");
$detectedParameters = explode(',', $parameters);
$detectedParameters = array_map(function ($x) {
return trim($x, "'\n\r\t\v");
}, $detectedParameters);
$temp = array();
foreach ($detectedParameters as $v) {
$temp[$v] = $v;
}
$detectedParameters = $temp;
break;
}
// Sometimes we have character types followed by a space and some cruft. Let's handle them.
if (is_null($detectedType) && !empty($type)) {
list($type, ) = explode(' ', $type);
switch (trim($type)) {
case 'varchar':
case 'text':
case 'char':
case 'character varying':
case 'nvarchar':
case 'nchar':
$detectedType = 'Text';
break;
case 'smalltext':
case 'longtext':
case 'mediumtext':
$detectedType = 'Text';
break;
case 'date':
case 'datetime':
case 'time':
case 'year':
case 'timestamp':
$detectedType = 'Calendar';
break;
case 'tinyint':
case 'smallint':
$detectedType = 'Checkbox';
break;
default:
$detectedType = 'Integer';
break;
}
}
// If all else fails assume it's a Text and hope for the best
if (empty($detectedType)) {
$detectedType = 'Text';
}
return array('type' => $detectedType, 'params' => $detectedParameters);
}