From b3b3d5efd2a5e8d1beb40134700fb2daeff51556 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maur=C3=ADcio=20Meneghini=20Fauth?= Date: Tue, 26 Nov 2019 20:57:50 -0300 Subject: [PATCH] Move db designer entry point logic to a controller MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: MaurĂ­cio Meneghini Fauth --- .../Database/DesignerController.php | 243 ++++++++++++++++++ libraries/entry_points/database/designer.php | 221 ---------------- libraries/routes.php | 7 +- services_controllers.yml | 10 + 4 files changed, 258 insertions(+), 223 deletions(-) create mode 100644 libraries/classes/Controllers/Database/DesignerController.php delete mode 100644 libraries/entry_points/database/designer.php diff --git a/libraries/classes/Controllers/Database/DesignerController.php b/libraries/classes/Controllers/Database/DesignerController.php new file mode 100644 index 0000000000..790f0f17bf --- /dev/null +++ b/libraries/classes/Controllers/Database/DesignerController.php @@ -0,0 +1,243 @@ +databaseDesigner = $databaseDesigner; + $this->designerCommon = $designerCommon; + } + + /** + * @return void + */ + public function index(): void + { + global $db, $script_display_field, $tab_column, $tables_all_keys, $tables_pk_or_unique_keys; + global $success, $page, $message, $display_page, $selected_page, $tab_pos, $fullTableNames, $script_tables; + global $script_contr, $params, $tables, $num_tables, $total_num_tables, $sub_part, $is_show_stats; + global $db_is_system_schema, $tooltip_truename, $tooltip_aliasname, $pos, $classes_side_menu; + + if (isset($_POST['dialog'])) { + if ($_POST['dialog'] == 'edit') { + $html = $this->databaseDesigner->getHtmlForEditOrDeletePages($_POST['db'], 'editPage'); + } elseif ($_POST['dialog'] == 'delete') { + $html = $this->databaseDesigner->getHtmlForEditOrDeletePages($_POST['db'], 'deletePage'); + } elseif ($_POST['dialog'] == 'save_as') { + $html = $this->databaseDesigner->getHtmlForPageSaveAs($_POST['db']); + } elseif ($_POST['dialog'] == 'export') { + $html = $this->databaseDesigner->getHtmlForSchemaExport( + $_POST['db'], + $_POST['selected_page'] + ); + } elseif ($_POST['dialog'] == 'add_table') { + // Pass the db and table to the getTablesInfo so we only have the table we asked for + $script_display_field = $this->designerCommon->getTablesInfo($_POST['db'], $_POST['table']); + $tab_column = $this->designerCommon->getColumnsInfo($script_display_field); + $tables_all_keys = $this->designerCommon->getAllKeys($script_display_field); + $tables_pk_or_unique_keys = $this->designerCommon->getPkOrUniqueKeys($script_display_field); + + $html = $this->databaseDesigner->getDatabaseTables( + $_POST['db'], + $script_display_field, + [], + -1, + $tab_column, + $tables_all_keys, + $tables_pk_or_unique_keys + ); + } + + if (! empty($html)) { + $this->response->addHTML($html); + } + return; + } + + if (isset($_POST['operation'])) { + if ($_POST['operation'] == 'deletePage') { + $success = $this->designerCommon->deletePage($_POST['selected_page']); + $this->response->setRequestStatus($success); + } elseif ($_POST['operation'] == 'savePage') { + if ($_POST['save_page'] == 'same') { + $page = $_POST['selected_page']; + } else { // new + $page = $this->designerCommon->createNewPage($_POST['selected_value'], $_POST['db']); + $this->response->addJSON('id', $page); + } + $success = $this->designerCommon->saveTablePositions($page); + $this->response->setRequestStatus($success); + } elseif ($_POST['operation'] == 'setDisplayField') { + [ + $success, + $message, + ] = $this->designerCommon->saveDisplayField( + $_POST['db'], + $_POST['table'], + $_POST['field'] + ); + $this->response->setRequestStatus($success); + $this->response->addJSON('message', $message); + } elseif ($_POST['operation'] == 'addNewRelation') { + list($success, $message) = $this->designerCommon->addNewRelation( + $_POST['db'], + $_POST['T1'], + $_POST['F1'], + $_POST['T2'], + $_POST['F2'], + $_POST['on_delete'], + $_POST['on_update'], + $_POST['DB1'], + $_POST['DB2'] + ); + $this->response->setRequestStatus($success); + $this->response->addJSON('message', $message); + } elseif ($_POST['operation'] == 'removeRelation') { + list($success, $message) = $this->designerCommon->removeRelation( + $_POST['T1'], + $_POST['F1'], + $_POST['T2'], + $_POST['F2'] + ); + $this->response->setRequestStatus($success); + $this->response->addJSON('message', $message); + } elseif ($_POST['operation'] == 'save_setting_value') { + $success = $this->designerCommon->saveSetting($_POST['index'], $_POST['value']); + $this->response->setRequestStatus($success); + } + + return; + } + + require ROOT_PATH . 'libraries/db_common.inc.php'; + + $script_display_field = $this->designerCommon->getTablesInfo(); + + $display_page = -1; + $selected_page = null; + + if (isset($_GET['query'])) { + $display_page = $this->designerCommon->getDefaultPage($_GET['db']); + } elseif (! empty($_GET['page'])) { + $display_page = $_GET['page']; + } else { + $display_page = $this->designerCommon->getLoadingPage($_GET['db']); + } + if ($display_page != -1) { + $selected_page = $this->designerCommon->getPageName($display_page); + } + $tab_pos = $this->designerCommon->getTablePositions($display_page); + + $fullTableNames = []; + + foreach ($script_display_field as $designerTable) { + $fullTableNames[] = $designerTable->getDbTableString(); + } + + foreach ($tab_pos as $position) { + if (! in_array($position['dbName'] . '.' . $position['tableName'], $fullTableNames)) { + foreach ($this->designerCommon->getTablesInfo($position['dbName'], $position['tableName']) as $designerTable) { + $script_display_field[] = $designerTable; + } + } + } + + $tab_column = $this->designerCommon->getColumnsInfo($script_display_field); + $script_tables = $this->designerCommon->getScriptTabs($script_display_field); + $tables_pk_or_unique_keys = $this->designerCommon->getPkOrUniqueKeys($script_display_field); + $tables_all_keys = $this->designerCommon->getAllKeys($script_display_field); + $classes_side_menu = $this->databaseDesigner->returnClassNamesFromMenuButtons(); + + $script_contr = $this->designerCommon->getScriptContr($script_display_field); + + $params = ['lang' => $GLOBALS['lang']]; + if (isset($_GET['db'])) { + $params['db'] = $_GET['db']; + } + + $this->response->getFooter()->setMinimal(); + $header = $this->response->getHeader(); + $header->setBodyId('designer_body'); + + $scripts = $header->getScripts(); + $scripts->addFile('vendor/jquery/jquery.fullscreen.js'); + $scripts->addFile('designer/database.js'); + $scripts->addFile('designer/objects.js'); + $scripts->addFile('designer/page.js'); + $scripts->addFile('designer/history.js'); + $scripts->addFile('designer/move.js'); + $scripts->addFile('designer/init.js'); + + list( + $tables, + $num_tables, + $total_num_tables, + $sub_part, + $is_show_stats, + $db_is_system_schema, + $tooltip_truename, + $tooltip_aliasname, + $pos + ) = Util::getDbInfo($db, isset($sub_part) ? $sub_part : ''); + + // Embed some data into HTML, later it will be read + // by designer/init.js and converted to JS variables. + $this->response->addHTML( + $this->databaseDesigner->getHtmlForMain( + $db, + $_GET['db'], + $script_display_field, + $script_tables, + $script_contr, + $script_display_field, + $display_page, + isset($_GET['query']), + $selected_page, + $classes_side_menu, + $tab_pos, + $tab_column, + $tables_all_keys, + $tables_pk_or_unique_keys + ) + ); + + $this->response->addHTML('
'); + } +} diff --git a/libraries/entry_points/database/designer.php b/libraries/entry_points/database/designer.php deleted file mode 100644 index 479d1abc31..0000000000 --- a/libraries/entry_points/database/designer.php +++ /dev/null @@ -1,221 +0,0 @@ -get(Response::class); - -/** @var DatabaseInterface $dbi */ -$dbi = $containerBuilder->get(DatabaseInterface::class); - -/** @var Designer $databaseDesigner */ -$databaseDesigner = $containerBuilder->get('designer'); - -/** @var Common $designerCommon */ -$designerCommon = $containerBuilder->get('designer_common'); - -if (isset($_POST['dialog'])) { - if ($_POST['dialog'] == 'edit') { - $html = $databaseDesigner->getHtmlForEditOrDeletePages($_POST['db'], 'editPage'); - } elseif ($_POST['dialog'] == 'delete') { - $html = $databaseDesigner->getHtmlForEditOrDeletePages($_POST['db'], 'deletePage'); - } elseif ($_POST['dialog'] == 'save_as') { - $html = $databaseDesigner->getHtmlForPageSaveAs($_POST['db']); - } elseif ($_POST['dialog'] == 'export') { - $html = $databaseDesigner->getHtmlForSchemaExport( - $_POST['db'], - $_POST['selected_page'] - ); - } elseif ($_POST['dialog'] == 'add_table') { - // Pass the db and table to the getTablesInfo so we only have the table we asked for - $script_display_field = $designerCommon->getTablesInfo($_POST['db'], $_POST['table']); - $tab_column = $designerCommon->getColumnsInfo($script_display_field); - $tables_all_keys = $designerCommon->getAllKeys($script_display_field); - $tables_pk_or_unique_keys = $designerCommon->getPkOrUniqueKeys($script_display_field); - - $html = $databaseDesigner->getDatabaseTables( - $_POST['db'], - $script_display_field, - [], - -1, - $tab_column, - $tables_all_keys, - $tables_pk_or_unique_keys - ); - } - - if (! empty($html)) { - $response->addHTML($html); - } - return; -} - -if (isset($_POST['operation'])) { - if ($_POST['operation'] == 'deletePage') { - $success = $designerCommon->deletePage($_POST['selected_page']); - $response->setRequestStatus($success); - } elseif ($_POST['operation'] == 'savePage') { - if ($_POST['save_page'] == 'same') { - $page = $_POST['selected_page']; - } else { // new - $page = $designerCommon->createNewPage($_POST['selected_value'], $_POST['db']); - $response->addJSON('id', $page); - } - $success = $designerCommon->saveTablePositions($page); - $response->setRequestStatus($success); - } elseif ($_POST['operation'] == 'setDisplayField') { - [ - $success, - $message, - ] = $designerCommon->saveDisplayField( - $_POST['db'], - $_POST['table'], - $_POST['field'] - ); - $response->setRequestStatus($success); - $response->addJSON('message', $message); - } elseif ($_POST['operation'] == 'addNewRelation') { - list($success, $message) = $designerCommon->addNewRelation( - $_POST['db'], - $_POST['T1'], - $_POST['F1'], - $_POST['T2'], - $_POST['F2'], - $_POST['on_delete'], - $_POST['on_update'], - $_POST['DB1'], - $_POST['DB2'] - ); - $response->setRequestStatus($success); - $response->addJSON('message', $message); - } elseif ($_POST['operation'] == 'removeRelation') { - list($success, $message) = $designerCommon->removeRelation( - $_POST['T1'], - $_POST['F1'], - $_POST['T2'], - $_POST['F2'] - ); - $response->setRequestStatus($success); - $response->addJSON('message', $message); - } elseif ($_POST['operation'] == 'save_setting_value') { - $success = $designerCommon->saveSetting($_POST['index'], $_POST['value']); - $response->setRequestStatus($success); - } - - return; -} - -require ROOT_PATH . 'libraries/db_common.inc.php'; - -$script_display_field = $designerCommon->getTablesInfo(); - -$display_page = -1; -$selected_page = null; - -if (isset($_GET['query'])) { - $display_page = $designerCommon->getDefaultPage($_GET['db']); -} elseif (! empty($_GET['page'])) { - $display_page = $_GET['page']; -} else { - $display_page = $designerCommon->getLoadingPage($_GET['db']); -} -if ($display_page != -1) { - $selected_page = $designerCommon->getPageName($display_page); -} -$tab_pos = $designerCommon->getTablePositions($display_page); - -$fullTableNames = []; - -foreach ($script_display_field as $designerTable) { - $fullTableNames[] = $designerTable->getDbTableString(); -} - -foreach ($tab_pos as $position) { - if (! in_array($position['dbName'] . '.' . $position['tableName'], $fullTableNames)) { - foreach ($designerCommon->getTablesInfo($position['dbName'], $position['tableName']) as $designerTable) { - $script_display_field[] = $designerTable; - } - } -} - - -$tab_column = $designerCommon->getColumnsInfo($script_display_field); -$script_tables = $designerCommon->getScriptTabs($script_display_field); -$tables_pk_or_unique_keys = $designerCommon->getPkOrUniqueKeys($script_display_field); -$tables_all_keys = $designerCommon->getAllKeys($script_display_field); -$classes_side_menu = $databaseDesigner->returnClassNamesFromMenuButtons(); - - -$script_contr = $designerCommon->getScriptContr($script_display_field); - -$params = ['lang' => $GLOBALS['lang']]; -if (isset($_GET['db'])) { - $params['db'] = $_GET['db']; -} - -$response = Response::getInstance(); -$response->getFooter()->setMinimal(); -$header = $response->getHeader(); -$header->setBodyId('designer_body'); - -$scripts = $header->getScripts(); -$scripts->addFile('vendor/jquery/jquery.fullscreen.js'); -$scripts->addFile('designer/database.js'); -$scripts->addFile('designer/objects.js'); -$scripts->addFile('designer/page.js'); -$scripts->addFile('designer/history.js'); -$scripts->addFile('designer/move.js'); -$scripts->addFile('designer/init.js'); - -list( - $tables, - $num_tables, - $total_num_tables, - $sub_part, - $is_show_stats, - $db_is_system_schema, - $tooltip_truename, - $tooltip_aliasname, - $pos -) = PhpMyAdmin\Util::getDbInfo($db, isset($sub_part) ? $sub_part : ''); - -// Embed some data into HTML, later it will be read -// by designer/init.js and converted to JS variables. -$response->addHTML( - $databaseDesigner->getHtmlForMain( - $db, - $_GET['db'], - $script_display_field, - $script_tables, - $script_contr, - $script_display_field, - $display_page, - isset($_GET['query']), - $selected_page, - $classes_side_menu, - $tab_pos, - $tab_column, - $tables_all_keys, - $tables_pk_or_unique_keys - ) -); - -$response->addHTML('
'); diff --git a/libraries/routes.php b/libraries/routes.php index 9b9e104d89..ca8e0cb390 100644 --- a/libraries/routes.php +++ b/libraries/routes.php @@ -11,6 +11,7 @@ use PhpMyAdmin\Controllers\BrowseForeignersController; use PhpMyAdmin\Controllers\ChangeLogController; use PhpMyAdmin\Controllers\CheckRelationsController; use PhpMyAdmin\Controllers\Database\DataDictionaryController; +use PhpMyAdmin\Controllers\Database\DesignerController; use PhpMyAdmin\Controllers\Database\MultiTableQueryController; use PhpMyAdmin\Controllers\Database\StructureController; use PhpMyAdmin\Controllers\ErrorReportController; @@ -124,8 +125,10 @@ return function (RouteCollector $routes) use ($containerBuilder, $response) { $controller = $containerBuilder->get(DataDictionaryController::class); $response->addHTML($controller->index($vars)); }); - $routes->addRoute(['GET', 'POST'], '/designer', function () { - require_once ROOT_PATH . 'libraries/entry_points/database/designer.php'; + $routes->addRoute(['GET', 'POST'], '/designer', function () use ($containerBuilder) { + /** @var DesignerController $controller */ + $controller = $containerBuilder->get(DesignerController::class); + $controller->index(); }); $routes->addRoute(['GET', 'POST'], '/events', function () { require_once ROOT_PATH . 'libraries/entry_points/database/events.php'; diff --git a/services_controllers.yml b/services_controllers.yml index 4527a7d3df..b9cbd5e2e6 100644 --- a/services_controllers.yml +++ b/services_controllers.yml @@ -50,6 +50,16 @@ services: relation: '@relation' transformations: '@transformations' + PhpMyAdmin\Controllers\Database\DesignerController: + class: 'PhpMyAdmin\Controllers\Database\DesignerController' + arguments: + response: '@response' + dbi: '@dbi' + template: '@template' + db: '%db%' + databaseDesigner: '@designer' + designerCommon: '@designer_common' + PhpMyAdmin\Controllers\Database\EventsController: class: 'PhpMyAdmin\Controllers\Database\EventsController' arguments: