From c2442640922e88e091c2b3958d61fe3d167248d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maur=C3=ADcio=20Meneghini=20Fauth?= Date: Sat, 21 Oct 2017 23:13:27 -0200 Subject: [PATCH] Port table/structure/display_structure to Twig MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: MaurĂ­cio Meneghini Fauth --- .../Table/TableStructureController.php | 20 +- libraries/classes/Template.php | 4 + libraries/classes/Twig/IndexExtension.php | 35 +++ libraries/classes/Twig/PartitionExtension.php | 35 +++ libraries/classes/Twig/UtilExtension.php | 9 + scripts/generate-twig-cache | 4 + .../table/structure/display_structure.phtml | 250 ------------------ .../table/structure/display_structure.twig | 224 ++++++++++++++++ 8 files changed, 328 insertions(+), 253 deletions(-) create mode 100644 libraries/classes/Twig/IndexExtension.php create mode 100644 libraries/classes/Twig/PartitionExtension.php delete mode 100644 templates/table/structure/display_structure.phtml create mode 100644 templates/table/structure/display_structure.twig diff --git a/libraries/classes/Controllers/Table/TableStructureController.php b/libraries/classes/Controllers/Table/TableStructureController.php index f6380266b7..75c36fb4a6 100644 --- a/libraries/classes/Controllers/Table/TableStructureController.php +++ b/libraries/classes/Controllers/Table/TableStructureController.php @@ -15,6 +15,7 @@ use PhpMyAdmin\CreateAddField; use PhpMyAdmin\Index; use PhpMyAdmin\Message; use PhpMyAdmin\ParseAnalyze; +use PhpMyAdmin\Partition; use PhpMyAdmin\Relation; use PhpMyAdmin\Sql; use PhpMyAdmin\SqlParser\Context; @@ -23,6 +24,7 @@ use PhpMyAdmin\SqlParser\Statements\CreateStatement; use PhpMyAdmin\SqlParser\Utils\Table as SqlTable; use PhpMyAdmin\Table; use PhpMyAdmin\Template; +use PhpMyAdmin\Tracker; use PhpMyAdmin\Transformations; use PhpMyAdmin\Url; use PhpMyAdmin\Util; @@ -1259,7 +1261,7 @@ class TableStructureController extends TableController return Template::get('table/structure/display_structure')->render( array( - 'HideStructureActions' => $HideStructureActions, + 'hide_structure_actions' => $HideStructureActions, 'db' => $this->db, 'table' => $this->table, 'db_is_system_schema' => $this->_db_is_system_schema, @@ -1272,11 +1274,23 @@ class TableStructureController extends TableController 'columns_with_unique_index' => $columns_with_unique_index, 'edit_view_url' => isset($edit_view_url) ? $edit_view_url : null, 'columns_list' => $columns_list, - 'tablestats' => isset($tablestats) ? $tablestats : null, + 'table_stats' => isset($tablestats) ? $tablestats : null, 'fields' => $fields, 'columns_with_index' => $columns_with_index, 'central_list' => $central_list, - 'comments_map' => $comments_map + 'comments_map' => $comments_map, + 'browse_mime' => $GLOBALS['cfg']['BrowseMIME'], + 'show_column_comments' => $GLOBALS['cfg']['ShowColumnComments'], + 'show_stats' => $GLOBALS['cfg']['ShowStats'], + 'relation_commwork' => $GLOBALS['cfgRelation']['commwork'], + 'relation_mimework' => $GLOBALS['cfgRelation']['mimework'], + 'central_columns_work' => $GLOBALS['cfgRelation']['centralcolumnswork'], + 'mysql_int_version' => $GLOBALS['dbi']->getVersion(), + 'pma_theme_image' => $GLOBALS['pmaThemeImage'], + 'text_dir' => $GLOBALS['text_dir'], + 'is_active' => Tracker::isActive(), + 'have_partitioning' => Partition::havePartitioning(), + 'partition_names' => Partition::getPartitionNames($this->db, $this->table), ) ); } diff --git a/libraries/classes/Template.php b/libraries/classes/Template.php index b3d6d52a3f..1202e8518a 100644 --- a/libraries/classes/Template.php +++ b/libraries/classes/Template.php @@ -10,7 +10,9 @@ namespace PhpMyAdmin; use PhpMyAdmin\Twig\CharsetsExtension; use PhpMyAdmin\Twig\CoreExtension; use PhpMyAdmin\Twig\I18nExtension; +use PhpMyAdmin\Twig\IndexExtension; use PhpMyAdmin\Twig\MessageExtension; +use PhpMyAdmin\Twig\PartitionExtension; use PhpMyAdmin\Twig\PhpFunctionsExtension; use PhpMyAdmin\Twig\PluginsExtension; use PhpMyAdmin\Twig\RelationExtension; @@ -69,7 +71,9 @@ class Template $twig->addExtension(new CharsetsExtension()); $twig->addExtension(new CoreExtension()); $twig->addExtension(new I18nExtension()); + $twig->addExtension(new IndexExtension()); $twig->addExtension(new MessageExtension()); + $twig->addExtension(new PartitionExtension()); $twig->addExtension(new PhpFunctionsExtension()); $twig->addExtension(new PluginsExtension()); $twig->addExtension(new RelationExtension()); diff --git a/libraries/classes/Twig/IndexExtension.php b/libraries/classes/Twig/IndexExtension.php new file mode 100644 index 0000000000..02aff6a7c4 --- /dev/null +++ b/libraries/classes/Twig/IndexExtension.php @@ -0,0 +1,35 @@ + array('html')) + ), + ); + } +} diff --git a/libraries/classes/Twig/PartitionExtension.php b/libraries/classes/Twig/PartitionExtension.php new file mode 100644 index 0000000000..9d30c005d1 --- /dev/null +++ b/libraries/classes/Twig/PartitionExtension.php @@ -0,0 +1,35 @@ + array('html')) + ), + ); + } +} diff --git a/libraries/classes/Twig/UtilExtension.php b/libraries/classes/Twig/UtilExtension.php index 000cc703ce..206eff8fd5 100644 --- a/libraries/classes/Twig/UtilExtension.php +++ b/libraries/classes/Twig/UtilExtension.php @@ -37,6 +37,10 @@ class UtilExtension extends Twig_Extension 'Util_escapeMysqlWildcards', 'PhpMyAdmin\Util::escapeMysqlWildcards' ), + new Twig_SimpleFunction( + 'Util_extractColumnSpec', + 'PhpMyAdmin\Util::extractColumnSpec' + ), new Twig_SimpleFunction( 'Util_formatByteDown', 'PhpMyAdmin\Util::formatByteDown' @@ -55,6 +59,11 @@ class UtilExtension extends Twig_Extension 'PhpMyAdmin\Util::getButtonOrImage', array('is_safe' => array('html')) ), + new Twig_SimpleFunction( + 'Util_getClassForType', + 'PhpMyAdmin\Util::getClassForType', + array('is_safe' => array('html')) + ), new Twig_SimpleFunction( 'Util_getDivForSliderEffect', 'PhpMyAdmin\Util::getDivForSliderEffect', diff --git a/scripts/generate-twig-cache b/scripts/generate-twig-cache index 9cdba5ade9..8eb8949653 100644 --- a/scripts/generate-twig-cache +++ b/scripts/generate-twig-cache @@ -7,7 +7,9 @@ require_once AUTOLOAD_FILE; use PhpMyAdmin\Twig\CharsetsExtension; use PhpMyAdmin\Twig\CoreExtension; use PhpMyAdmin\Twig\I18nExtension; +use PhpMyAdmin\Twig\IndexExtension; use PhpMyAdmin\Twig\MessageExtension; +use PhpMyAdmin\Twig\PartitionExtension; use PhpMyAdmin\Twig\PhpFunctionsExtension; use PhpMyAdmin\Twig\PluginsExtension; use PhpMyAdmin\Twig\RelationExtension; @@ -29,7 +31,9 @@ $twig = new Twig_Environment($loader, array( $twig->addExtension(new CharsetsExtension()); $twig->addExtension(new CoreExtension()); $twig->addExtension(new I18nExtension()); +$twig->addExtension(new IndexExtension()); $twig->addExtension(new MessageExtension()); +$twig->addExtension(new PartitionExtension()); $twig->addExtension(new PhpFunctionsExtension()); $twig->addExtension(new PluginsExtension()); $twig->addExtension(new RelationExtension()); diff --git a/templates/table/structure/display_structure.phtml b/templates/table/structure/display_structure.phtml deleted file mode 100644 index cde237768c..0000000000 --- a/templates/table/structure/display_structure.phtml +++ /dev/null @@ -1,250 +0,0 @@ - -
- - - "information_schema" /> - - "view" /> - - "table" /> - -
- - - render( - array( - 'db_is_system_schema' => $db_is_system_schema, - 'tbl_is_view' => $tbl_is_view, - 'show_column_comments' => $GLOBALS['cfg']['ShowColumnComments'] - ) - ); ?> - - - - NULL'; - } - } else { - $row['Default'] = htmlspecialchars($row['Default']); - } - - $field_name = htmlspecialchars($row['Field']); - $displayed_field_name = $field_name; - $comments = ''; //For column comments - // underline commented fields and display a hover-title (CSS only) - - if (isset($comments_map[$row['Field']])) { - $displayed_field_name = '' - . $field_name . ''; - $comments = htmlspecialchars($comments_map[$row['Field']]); - } - - if ($primary && $primary->hasColumn($field_name)) { - $displayed_field_name .= Util::getImage( - 'b_primary.png', __('Primary') - ); - } - if (in_array($field_name, $columns_with_index)) { - $displayed_field_name .= Util::getImage( - 'b_key.png', __('Index') - ); - } - ?> - - render( - array( - 'row' => $row, - 'rownum' => $rownum, - 'displayed_field_name' => preg_replace( - '/[\x00-\x1F]/', - '⁑', - $displayed_field_name - ), - 'type_nowrap' => Util::getClassForType($extracted_columnspec['type']), - 'extracted_columnspec' => $extracted_columnspec, - 'attribute' => $attribute, - 'tbl_is_view' => $tbl_is_view, - 'db_is_system_schema' => $db_is_system_schema, - 'url_query' => $url_query, - 'titles' => $titles, - 'table' => $table, - 'tbl_storage_engine' => $tbl_storage_engine, - 'field_charset' => $field_charset, - 'comments' => $comments, - 'show_column_comments' => $GLOBALS['cfg']['ShowColumnComments'], - 'relation_commwork' => $GLOBALS['cfgRelation']['commwork'], - 'relation_mimework' => $GLOBALS['cfgRelation']['mimework'], - 'browse_mime' => $GLOBALS['cfg']['BrowseMIME'] - ) - ); ?> - - render( - array( - 'extracted_columnspec' => $extracted_columnspec, - 'type' => (!empty($extracted_columnspec['print_type'])) ? $extracted_columnspec['print_type'] : ' ', - 'tbl_storage_engine' => $tbl_storage_engine, - 'primary' => $primary, - 'field_name' => $field_name, - 'url_query' => $url_query, - 'titles' => $titles, - 'row' => $row, - 'rownum' => $rownum, - 'columns_with_unique_index' => $columns_with_unique_index, - 'is_in_central_columns' => in_array($row['Field'], $central_list) ? true : false, - 'central_columns_work' => $GLOBALS['cfgRelation']['centralcolumnswork'], - 'table' => $GLOBALS['table'], - 'mysql_int_version' => $GLOBALS['dbi']->getVersion() - ) - ); ?> - - - - -
-
- render( - array( - 'pma_theme_image' => $GLOBALS['pmaThemeImage'], - 'text_dir' => $GLOBALS['text_dir'], - 'tbl_is_view' => $tbl_is_view, - 'db_is_system_schema' => $db_is_system_schema, - 'tbl_storage_engine' => $tbl_storage_engine, - 'central_columns_work' => $GLOBALS['cfgRelation']['centralcolumnswork'] - ) - ); ?> -
- -render(array( - 'db' => $GLOBALS['db'], - 'table' => $GLOBALS['table'], -)); ?> - - - -
- render(array( - 'columns_list' => $columns_list, - 'db' => $GLOBALS['db'], - 'table' => $GLOBALS['table'] - )); ?> - - - - - - - - -getMethod() == 'RANGE' - || $firstPartition->getMethod() == 'RANGE COLUMNS' - || $firstPartition->getMethod() == 'LIST' - || $firstPartition->getMethod() == 'LIST COLUMNS'; - $subParitions = $firstPartition->getSubPartitions(); - $hasSubPartitions = $firstPartition->hasSubPartitions(); - if ($hasSubPartitions) { - $firstSubPartition = $subParitions[0]; - } - - $actionIcons = array( - 'ANALYZE' => Util::getIcon('b_search.png', __('Analyze')), - 'CHECK' => Util::getIcon('eye.png', __('Check')), - 'OPTIMIZE' => Util::getIcon('normalize.png', __('Optimize')), - 'REBUILD' => Util::getIcon('s_tbl.png', __('Rebuild')), - 'REPAIR' => Util::getIcon('b_tblops.png', __('Repair')), - 'TRUNCATE' => Util::getIcon('b_empty.png', __('Truncate')), - ); - if ($rangeOrList) { - $actionIcons['DROP'] = Util::getIcon('b_drop.png', __('Drop')); - } - - echo Util::getDivForSliderEffect( - 'partitions', __('Partitions') - ); - - $tmp_partition_description = $firstPartition->getDescription(); - - $removeSQL = "ALTER TABLE " . Util::backquote($table) . " REMOVE PARTITIONING"; - $removeUrl = 'sql.php' . $url_query . '&sql_query=' . urlencode($removeSQL); - - echo Template::get('table/structure/display_partitions')->render( - array( - 'db' => $db, - 'table' => $table, - 'url_query' => $url_query, - 'partitions' => $partitions, - 'partition_method' => $firstPartition->getMethod(), - 'partition_expression' => $firstPartition->getExpression(), - 'has_description' => ! empty($tmp_partition_description), - 'has_sub_partitions' => $hasSubPartitions, - 'sub_partition_method' => $hasSubPartitions ? $firstSubPartition->getMethod() : null, - 'sub_partition_expression' => $hasSubPartitions ? $firstSubPartition->getExpression() : null, - 'action_icons' => $actionIcons, - 'range_or_list' => $rangeOrList, - 'remove_url' => $removeUrl, - ) - ); - else: - echo Template::get('table/structure/display_partitions')->render( - array( - 'db' => $db, - 'table' => $table, - ) - ); - endif; - ?> - - - - - - - - -
diff --git a/templates/table/structure/display_structure.twig b/templates/table/structure/display_structure.twig new file mode 100644 index 0000000000..dd2ad4e22b --- /dev/null +++ b/templates/table/structure/display_structure.twig @@ -0,0 +1,224 @@ +
+ {{ Url_getHiddenInputs(db, table) }} + +
+ + {# Table header #} + {% include 'table/structure/table_structure_header.twig' with { + 'db_is_system_schema': db_is_system_schema, + 'tbl_is_view': tbl_is_view, + 'show_column_comments': show_column_comments + } only %} + + {# Table body #} + {% set rownum = 0 %} + {% set columns_list = [] %} + {% for row in fields %} + {% set rownum = rownum + 1 %} + {% set columns_list = columns_list|merge([row['Field']]) %} + {% set field_charset = row['Collation'] %} + + {% set extracted_columnspec = Util_extractColumnSpec(row['Type']) %} + {% set attribute = extracted_columnspec['attribute'] %} + {% if strpos(row['Extra'], 'on update CURRENT_TIMESTAMP') + is not same as(false) %} + {% set attribute = 'on update CURRENT_TIMESTAMP' %} + {% endif %} + + {% if row['Default'] is not defined %} + {% if row['Null'] == 'YES' %} + {% set row = row|merge({'Default': 'NULL'}) %} + {% endif %} + {% else %} + {% set row = row|merge({'Default': row['Default']|e}) %} + {% endif %} + + {% set field_name = row['Field']|e %} + {% set displayed_field_name = field_name %} + {# For column comments #} + {% set comments = '' %} + {# Underline commented fields and display a hover-title (CSS only) #} + + {% if comments_map[row['Field']] is defined %} + {% set displayed_field_name -%} + + {{- field_name|raw -}} + + {%- endset %} + {% set comments = comments_map[row['Field']]|e %} + {% endif %} + + {% if primary and primary.hasColumn(field_name) %} + {% set displayed_field_name = displayed_field_name ~ Util_getImage( + 'b_primary.png', 'Primary'|trans + ) %} + {% endif %} + {% if field_name in columns_with_index %} + {% set displayed_field_name = displayed_field_name ~ Util_getImage( + 'b_key.png', 'Index'|trans + ) %} + {% endif %} + + {% include 'table/structure/table_structure_row.twig' with { + 'row': row, + 'rownum': rownum, + 'displayed_field_name': preg_replace( + '/[\x00-\x1F]/', + '⁑', + displayed_field_name + ), + 'type_nowrap': Util_getClassForType(extracted_columnspec['type']), + 'extracted_columnspec': extracted_columnspec, + 'attribute': attribute, + 'tbl_is_view': tbl_is_view, + 'db_is_system_schema': db_is_system_schema, + 'url_query': url_query, + 'titles': titles, + 'table': table, + 'tbl_storage_engine': tbl_storage_engine, + 'field_charset': field_charset, + 'comments': comments, + 'show_column_comments': show_column_comments, + 'relation_commwork': relation_commwork, + 'relation_mimework': relation_mimework, + 'browse_mime': browse_mime + } only %} + {% if not tbl_is_view and not db_is_system_schema %} + {% include 'table/structure/actions_in_table_structure.twig' with { + 'row': row, + 'rownum': rownum, + 'extracted_columnspec': extracted_columnspec, + 'type': extracted_columnspec['print_type'] is not empty ? extracted_columnspec['print_type'], + 'tbl_storage_engine': tbl_storage_engine, + 'primary': primary, + 'field_name': field_name, + 'url_query': url_query, + 'titles': titles, + 'columns_with_unique_index': columns_with_unique_index, + 'is_in_central_columns': row['Field'] in central_list ? true : false, + 'central_columns_work': central_columns_work, + 'table': table, + 'mysql_int_version': mysql_int_version + } only %} + {% endif %} + + {% endfor %} + +
+
+ {% include 'table/structure/check_all_table_column.twig' with { + 'pma_theme_image': pma_theme_image, + 'text_dir': text_dir, + 'tbl_is_view': tbl_is_view, + 'db_is_system_schema': db_is_system_schema, + 'tbl_storage_engine': tbl_storage_engine, + 'central_columns_work': central_columns_work + } only %} +
+ +{% include 'table/structure/move_columns_dialog.twig' with { + 'db': db, + 'table': table +} only %} +{# Work on the table #} + +{% if not tbl_is_view and not db_is_system_schema %} + {% include 'table/structure/add_column.twig' with { + 'columns_list': columns_list, + 'db': db, + 'table': table + } only %} +{% endif %} + +{# Displays indexes #} +{% if not tbl_is_view and not db_is_system_schema + and 'ARCHIVE' != tbl_storage_engine %} + {{ Index_getHtmlForDisplayIndexes() }} +{% endif %} + +{# Display partition details #} +{% if have_partitioning %} + {# Detect partitioning #} + {% if partition_names is not empty and partition_names[0] is not null %} + {% set partitions = Partition_getPartitions(db, table) %} + {% set first_partition = partitions[0] %} + {% set range_or_list = first_partition.getMethod() == 'RANGE' + or first_partition.getMethod() == 'RANGE COLUMNS' + or first_partition.getMethod() == 'LIST' + or first_partition.getMethod() == 'LIST COLUMNS' %} + {% set sub_partitions = first_partition.getSubPartitions() %} + {% set has_sub_partitions = first_partition.hasSubPartitions() %} + {% if has_sub_partitions %} + {% set first_sub_partition = sub_partitions[0] %} + {% endif %} + + {% set action_icons = { + 'ANALYZE': Util_getIcon('b_search.png', 'Analyze'|trans), + 'CHECK': Util_getIcon('eye.png', 'Check'|trans), + 'OPTIMIZE': Util_getIcon('normalize.png', 'Optimize'|trans), + 'REBUILD': Util_getIcon('s_tbl.png', 'Rebuild'|trans), + 'REPAIR': Util_getIcon('b_tblops.png', 'Repair'|trans), + 'TRUNCATE': Util_getIcon('b_empty.png', 'Truncate'|trans), + } %} + {% if range_or_list %} + {% set action_icons = action_icons|merge({'DROP': Util_getIcon('b_drop.png', 'Drop'|trans)}) %} + {% endif %} + + {{ Util_getDivForSliderEffect('partitions', 'Partitions'|trans) }} + + {% set remove_sql = 'ALTER TABLE ' ~ Util_backquote(table) ~ ' REMOVE PARTITIONING' %} + {% set remove_url = 'sql.php' ~ url_query ~ '&sql_query=' ~ remove_sql|url_encode %} + + {% include 'table/structure/display_partitions.twig' with { + 'db': db, + 'table': table, + 'url_query': url_query, + 'partitions': partitions, + 'partition_method': first_partition.getMethod(), + 'partition_expression': first_partition.getExpression(), + 'has_description': first_partition.getDescription() is not empty, + 'has_sub_partitions': has_sub_partitions, + 'sub_partition_method': has_sub_partitions ? first_sub_partition.getMethod(), + 'sub_partition_expression': has_sub_partitions ? first_sub_partition.getExpression(), + 'action_icons': action_icons, + 'range_or_list': range_or_list, + 'remove_url': remove_url + } only %} + {% else %} + {% include 'table/structure/display_partitions.twig' with { + 'db': db, + 'table': table + } only %} + {% endif %} + {# For closing Slider effect div #} + +{% endif %} + +{# Displays Space usage and row statistics #} +{% if show_stats %} + {{ table_stats|raw }} +{% endif %} +