Index: trunk/core/units/admin/admin_events_handler.php =================================================================== diff -u -r7887 -r7991 --- trunk/core/units/admin/admin_events_handler.php (.../admin_events_handler.php) (revision 7887) +++ trunk/core/units/admin/admin_events_handler.php (.../admin_events_handler.php) (revision 7991) @@ -53,17 +53,29 @@ echo 'error: no table name specified'; return ; } - - if (!preg_match('/^'.preg_quote(TABLE_PREFIX, '/').'(.*)/', $table_name)) { + + if (TABLE_PREFIX && !preg_match('/^'.preg_quote(TABLE_PREFIX, '/').'(.*)/', $table_name)) { + // table name without prefix, then add it $table_name = TABLE_PREFIX.$table_name; } + if (!$this->Conn->TableFound($table_name)) { + // table with prefix doesn't exist, assume that just config prefix passed -> resolve table name from it + $table_name = $this->Application->getUnitOption(substr($table_name, strlen(TABLE_PREFIX)), 'TableName'); + } + $table_info = $this->Conn->Query('DESCRIBE '.$table_name); // 1. prepare config keys + $id_field = ''; $fields = Array(); $float_types = Array ('float', 'double', 'numeric'); foreach ($table_info as $field_info) { + if (preg_match('/l[\d]+_.*/', $field_info['Field'])) { + // don't put multilingual fields in config + continue; + } + $field_options = Array (); // 1. get php field type by mysql field type @@ -76,49 +88,78 @@ $default_value = $field_info['Default']; if (in_array($php_type, $float_types)) { - // this is float number, add formatter + // this is float number if (preg_match('/'.$db_types.'\([\d]+,([\d]+)\)/i', $field_info['Type'], $regs)) { + // size is described in structure -> add formatter $field_options['formatter'] = 'kFormatter'; $field_options['format'] = '%01.'.$regs[1].'f'; $default_value = 0; } + else { + // no size information, just convert to float + $default_value = (float)$default_value; + } } + if (preg_match('/varchar\(([\d]+)\)/i', $field_info['Type'], $regs)) { + $field_options['max_len'] = (int)$regs[1]; + } + if ($field_info['Null'] != 'YES') { $field_options['not_null'] = 1; } if ($field_info['Key'] == 'PRI') { $default_value = 0; - $config['IDField'] = "'".$field_info['Field']."'"; + $id_field = $field_info['Field']; } - $field_options['default'] = $default_value; - - // format config keys - $ret = ''; - foreach ($field_options as $key_name => $key_value) { - if (!preg_match('/^[-\d]+$/', $key_value)) { - // if not only digits are present, then treat as string - $key_value = "'".$key_value."'"; - } - - $ret .= "'".$key_name."' => ".$key_value.', '; + if ($php_type == 'int' && ($field_info['Null'] != 'YES' || is_numeric($default_value))) { + // is integer field AND not null + $field_options['default'] = (int)$default_value; } + else { + $field_options['default'] = $default_value; + } - $fields[ $field_info['Field'] ] = 'Array('.rtrim($ret,',').')'; + $fields[ $field_info['Field'] ] = $this->transformDump($field_options); } - - $config['Fields'] = $fields; - - echo 'Close Window
'; - $ret = print_r($config, true); - $ret = preg_replace( Array('/\[(.*)\]/',"/(.*)\)/"), Array("'\\1'",'\\1),'), $ret); - print_pre($ret, '', true); + $ret = stripslashes(var_export($fields, true)); + $ret = preg_replace("/'(.*?)' => 'Array \((.*?), \)',/", "'\\1' => Array (\\2),", $ret); + $ret = preg_replace("/\n '/", "\n\t'", $ret); + $ret = "'IDField' => '".$id_field."',\n'Fields' => A".substr($ret, 1).','; + + ob_start(); + ?> + + + Table "<?php echo $table_name; ?>" Structure + + + Close Window
+ highlightString($ret); ?> +
Close Window
+ + + status = erSTOP; } + function transformDump($dump) + { + if (is_array($dump)) { + $dump = var_export($dump, true); + } + + $dump = preg_replace("/,\n[ ]*/", ', ', $dump); + $dump = preg_replace("/array \(\n[ ]*/", 'Array (', $dump); // replace array start + $dump = preg_replace("/,\n[ ]*\),/", "),", $dump); // replace array end + + return $dump; + } + /** * Refreshes ThemeFiles & Theme tables by actual content on HDD *