diff --git a/app/services_controllers.php b/app/services_controllers.php index e9198a2dd7..0cab863416 100644 --- a/app/services_controllers.php +++ b/app/services_controllers.php @@ -842,6 +842,7 @@ return [ ColumnsDefinition::class, DbTableExists::class, UserPrivilegesFactory::class, + Template::class, ], ], Table\ChangeController::class => [ @@ -873,6 +874,7 @@ return [ DatabaseInterface::class, ColumnsDefinition::class, UserPrivilegesFactory::class, + Template::class, ], ], Table\DeleteConfirmController::class => [ @@ -1050,6 +1052,7 @@ return [ Database\SqlController::class, Table\ChangeController::class, Table\SqlController::class, + Template::class, ], ], Table\SearchController::class => [ @@ -1139,6 +1142,7 @@ return [ Table\StructureController::class, UserPrivilegesFactory::class, Config::class, + Template::class, ], ], Table\Structure\SpatialController::class => [ diff --git a/resources/templates/components/_preview_sql.twig b/resources/templates/components/_preview_sql.twig new file mode 100644 index 0000000000..fda992d5c4 --- /dev/null +++ b/resources/templates/components/_preview_sql.twig @@ -0,0 +1,11 @@ +
+ {% if query_data is empty %} + {{ t('No change') }} + {% elseif query_data is iterable %} + {% for query in query_data %} + {{ format_sql(query) }} + {% endfor %} + {% else %} + {{ format_sql(query_data) }} + {% endif %} +
diff --git a/resources/templates/preview_sql.twig b/resources/templates/preview_sql.twig deleted file mode 100644 index e0f4eec21b..0000000000 --- a/resources/templates/preview_sql.twig +++ /dev/null @@ -1,11 +0,0 @@ -
- {% if query_data is empty %} - {{ t('No change') }} - {% elseif query_data is iterable %} - {% for query in query_data %} - {{ format_sql(query) }} - {% endfor %} - {% else %} - {{ format_sql(query_data) }} - {% endif %} -
diff --git a/src/Controllers/Table/AddFieldController.php b/src/Controllers/Table/AddFieldController.php index e6ca7a1e4c..13afbf60d9 100644 --- a/src/Controllers/Table/AddFieldController.php +++ b/src/Controllers/Table/AddFieldController.php @@ -6,7 +6,6 @@ namespace PhpMyAdmin\Controllers\Table; use PhpMyAdmin\Config; use PhpMyAdmin\Controllers\InvocableController; -use PhpMyAdmin\Core; use PhpMyAdmin\CreateAddField; use PhpMyAdmin\Current; use PhpMyAdmin\Dbal\DatabaseInterface; @@ -21,6 +20,7 @@ use PhpMyAdmin\MessageType; use PhpMyAdmin\ResponseRenderer; use PhpMyAdmin\Routing\Route; use PhpMyAdmin\Table\ColumnsDefinition; +use PhpMyAdmin\Template; use PhpMyAdmin\Transformations; use PhpMyAdmin\Url; use PhpMyAdmin\UserPrivilegesFactory; @@ -35,16 +35,17 @@ use function strlen; * Displays add field form and handles it. */ #[Route('/table/add-field', ['GET', 'POST'])] -final class AddFieldController implements InvocableController +final readonly class AddFieldController implements InvocableController { public function __construct( - private readonly ResponseRenderer $response, - private readonly Transformations $transformations, - private readonly Config $config, - private readonly DatabaseInterface $dbi, - private readonly ColumnsDefinition $columnsDefinition, - private readonly DbTableExists $dbTableExists, - private readonly UserPrivilegesFactory $userPrivilegesFactory, + private ResponseRenderer $response, + private Transformations $transformations, + private Config $config, + private DatabaseInterface $dbi, + private ColumnsDefinition $columnsDefinition, + private DbTableExists $dbTableExists, + private UserPrivilegesFactory $userPrivilegesFactory, + private Template $template, ) { } @@ -92,7 +93,10 @@ final class AddFieldController implements InvocableController // If there is a request for SQL previewing. if (isset($_POST['preview_sql'])) { - Core::previewSQL(Current::$sqlQuery); + $this->response->addJSON( + 'sql_data', + $this->template->render('components/_preview_sql', ['query_data' => Current::$sqlQuery]), + ); return $this->response->response(); } diff --git a/src/Controllers/Table/CreateController.php b/src/Controllers/Table/CreateController.php index 9d6fa3bc8c..a70df75bff 100644 --- a/src/Controllers/Table/CreateController.php +++ b/src/Controllers/Table/CreateController.php @@ -6,7 +6,6 @@ namespace PhpMyAdmin\Controllers\Table; use PhpMyAdmin\Config; use PhpMyAdmin\Controllers\InvocableController; -use PhpMyAdmin\Core; use PhpMyAdmin\CreateAddField; use PhpMyAdmin\Current; use PhpMyAdmin\Dbal\DatabaseInterface; @@ -16,6 +15,7 @@ use PhpMyAdmin\Http\ServerRequest; use PhpMyAdmin\ResponseRenderer; use PhpMyAdmin\Routing\Route; use PhpMyAdmin\Table\ColumnsDefinition; +use PhpMyAdmin\Template; use PhpMyAdmin\Transformations; use PhpMyAdmin\Url; use PhpMyAdmin\UserPrivilegesFactory; @@ -32,15 +32,16 @@ use function strlen; * Displays table create form and handles it. */ #[Route('/table/create', ['GET', 'POST'])] -final class CreateController implements InvocableController +final readonly class CreateController implements InvocableController { public function __construct( - private readonly ResponseRenderer $response, - private readonly Transformations $transformations, - private readonly Config $config, - private readonly DatabaseInterface $dbi, - private readonly ColumnsDefinition $columnsDefinition, - private readonly UserPrivilegesFactory $userPrivilegesFactory, + private ResponseRenderer $response, + private Transformations $transformations, + private Config $config, + private DatabaseInterface $dbi, + private ColumnsDefinition $columnsDefinition, + private UserPrivilegesFactory $userPrivilegesFactory, + private Template $template, ) { } @@ -93,7 +94,10 @@ final class CreateController implements InvocableController // If there is a request for SQL previewing. if (isset($_POST['preview_sql'])) { - Core::previewSQL(Current::$sqlQuery); + $this->response->addJSON( + 'sql_data', + $this->template->render('components/_preview_sql', ['query_data' => Current::$sqlQuery]), + ); return $this->response->response(); } diff --git a/src/Controllers/Table/IndexRenameController.php b/src/Controllers/Table/IndexRenameController.php index 81d5fc9d96..cac47ea50a 100644 --- a/src/Controllers/Table/IndexRenameController.php +++ b/src/Controllers/Table/IndexRenameController.php @@ -104,7 +104,7 @@ final class IndexRenameController implements InvocableController if ($previewSql) { $this->response->addJSON( 'sql_data', - $this->template->render('preview_sql', ['query_data' => $sqlQuery]), + $this->template->render('components/_preview_sql', ['query_data' => $sqlQuery]), ); return $this->response->response(); diff --git a/src/Controllers/Table/IndexesController.php b/src/Controllers/Table/IndexesController.php index 9aa0b3d507..88f23f8042 100644 --- a/src/Controllers/Table/IndexesController.php +++ b/src/Controllers/Table/IndexesController.php @@ -118,7 +118,7 @@ final readonly class IndexesController implements InvocableController if ($previewSql) { $this->response->addJSON( 'sql_data', - $this->template->render('preview_sql', ['query_data' => $sqlQuery]), + $this->template->render('components/_preview_sql', ['query_data' => $sqlQuery]), ); return $this->response->response(); diff --git a/src/Controllers/Table/RelationController.php b/src/Controllers/Table/RelationController.php index 21e4623c19..e1cf231b64 100644 --- a/src/Controllers/Table/RelationController.php +++ b/src/Controllers/Table/RelationController.php @@ -9,7 +9,6 @@ use PhpMyAdmin\ConfigStorage\Features\DisplayFeature; use PhpMyAdmin\ConfigStorage\Features\RelationFeature; use PhpMyAdmin\ConfigStorage\Relation; use PhpMyAdmin\Controllers\InvocableController; -use PhpMyAdmin\Core; use PhpMyAdmin\Current; use PhpMyAdmin\Dbal\DatabaseInterface; use PhpMyAdmin\Html\Generator; @@ -133,7 +132,10 @@ final readonly class RelationController implements InvocableController // If there is a request for SQL previewing. if (isset($_POST['preview_sql'])) { - Core::previewSQL($previewSqlData); + $this->response->addJSON( + 'sql_data', + $this->template->render('components/_preview_sql', ['query_data' => $previewSqlData]), + ); return $this->response->response(); } diff --git a/src/Controllers/Table/ReplaceController.php b/src/Controllers/Table/ReplaceController.php index 094c6da8e6..3dd65f0fb5 100644 --- a/src/Controllers/Table/ReplaceController.php +++ b/src/Controllers/Table/ReplaceController.php @@ -25,6 +25,7 @@ use PhpMyAdmin\Query\Generator as QueryGenerator; use PhpMyAdmin\ResponseRenderer; use PhpMyAdmin\Routing\Route; use PhpMyAdmin\Table\Table; +use PhpMyAdmin\Template; use PhpMyAdmin\Transformations; use PhpMyAdmin\UrlParams; use PhpMyAdmin\Util; @@ -43,18 +44,19 @@ use function sprintf; * Manipulation of table data like inserting, replacing and updating. */ #[Route('/table/replace', ['GET', 'POST'])] -final class ReplaceController implements InvocableController +final readonly class ReplaceController implements InvocableController { public function __construct( - private readonly ResponseRenderer $response, - private readonly InsertEdit $insertEdit, - private readonly Transformations $transformations, - private readonly Relation $relation, - private readonly DatabaseInterface $dbi, - private readonly SqlController $sqlController, - private readonly DatabaseSqlController $databaseSqlController, - private readonly ChangeController $changeController, - private readonly TableSqlController $tableSqlController, + private ResponseRenderer $response, + private InsertEdit $insertEdit, + private Transformations $transformations, + private Relation $relation, + private DatabaseInterface $dbi, + private SqlController $sqlController, + private DatabaseSqlController $databaseSqlController, + private ChangeController $changeController, + private TableSqlController $tableSqlController, + private Template $template, ) { } @@ -297,7 +299,10 @@ final class ReplaceController implements InvocableController // If there is a request for SQL previewing. if ($request->hasBodyParam('preview_sql')) { - Core::previewSQL($query); + $this->response->addJSON( + 'sql_data', + $this->template->render('components/_preview_sql', ['query_data' => $query]), + ); return $this->response->response(); } diff --git a/src/Controllers/Table/Structure/MoveColumnsController.php b/src/Controllers/Table/Structure/MoveColumnsController.php index 33e7b31d24..62db374ffa 100644 --- a/src/Controllers/Table/Structure/MoveColumnsController.php +++ b/src/Controllers/Table/Structure/MoveColumnsController.php @@ -63,7 +63,7 @@ final class MoveColumnsController implements InvocableController if ($previewSql) { $this->response->addJSON( 'sql_data', - $this->template->render('preview_sql', ['query_data' => $sqlQuery]), + $this->template->render('components/_preview_sql', ['query_data' => $sqlQuery]), ); return $this->response->response(); diff --git a/src/Controllers/Table/Structure/SaveController.php b/src/Controllers/Table/Structure/SaveController.php index 5d8f00bcc8..72eafb506d 100644 --- a/src/Controllers/Table/Structure/SaveController.php +++ b/src/Controllers/Table/Structure/SaveController.php @@ -8,7 +8,6 @@ use PhpMyAdmin\Config; use PhpMyAdmin\ConfigStorage\Relation; use PhpMyAdmin\Controllers\InvocableController; use PhpMyAdmin\Controllers\Table\StructureController; -use PhpMyAdmin\Core; use PhpMyAdmin\Current; use PhpMyAdmin\Dbal\DatabaseInterface; use PhpMyAdmin\Html\Generator; @@ -21,6 +20,7 @@ use PhpMyAdmin\ResponseRenderer; use PhpMyAdmin\Routing\Route; use PhpMyAdmin\Table\Table; use PhpMyAdmin\Table\UiProperty; +use PhpMyAdmin\Template; use PhpMyAdmin\Transformations; use PhpMyAdmin\Url; use PhpMyAdmin\UserPrivileges; @@ -49,6 +49,7 @@ final class SaveController implements InvocableController private readonly StructureController $structureController, private readonly UserPrivilegesFactory $userPrivilegesFactory, private readonly Config $config, + private readonly Template $template, ) { $this->tableObj = $this->dbi->getTable(Current::$database, Current::$table); } @@ -154,7 +155,12 @@ final class SaveController implements InvocableController // If there is a request for SQL previewing. if (isset($_POST['preview_sql'])) { - Core::previewSQL($changes !== [] ? $sqlQuery : ''); + $this->response->addJSON( + 'sql_data', + $this->template->render('components/_preview_sql', [ + 'query_data' => $changes !== [] ? $sqlQuery : '', + ]), + ); $this->response->callExit(); } diff --git a/src/Core.php b/src/Core.php index 599d2b3aac..b3870e94a2 100644 --- a/src/Core.php +++ b/src/Core.php @@ -497,29 +497,6 @@ class Core return (string) preg_replace("@((\015\012)|(\015)|(\012))@", '
' . "\n", $buffer); } - /** - * Displays SQL query before executing. - * - * @param string[]|string $queryData Array containing queries or query itself - */ - public static function previewSQL(array|string $queryData): void - { - $retval = '
'; - if ($queryData === '' || $queryData === []) { - $retval .= __('No change'); - } elseif (is_array($queryData)) { - foreach ($queryData as $query) { - $retval .= Html\Generator::formatSql($query); - } - } else { - $retval .= Html\Generator::formatSql($queryData); - } - - $retval .= '
'; - $response = ResponseRenderer::getInstance(); - $response->addJSON('sql_data', $retval); - } - /** * recursively check if variable is empty * diff --git a/tests/unit/Controllers/Table/AddFieldControllerTest.php b/tests/unit/Controllers/Table/AddFieldControllerTest.php index 3dc311f76d..ed89bcee0b 100644 --- a/tests/unit/Controllers/Table/AddFieldControllerTest.php +++ b/tests/unit/Controllers/Table/AddFieldControllerTest.php @@ -266,6 +266,7 @@ class AddFieldControllerTest extends AbstractTestCase new ColumnsDefinition($dbi, $relation, $transformations), new DbTableExists($dbi), new UserPrivilegesFactory($dbi), + $template, ))($request); self::assertSame($expected, $response->getHTMLResult()); diff --git a/tests/unit/Controllers/Table/CreateControllerTest.php b/tests/unit/Controllers/Table/CreateControllerTest.php index c68e38aa4c..dd25e8ae9a 100644 --- a/tests/unit/Controllers/Table/CreateControllerTest.php +++ b/tests/unit/Controllers/Table/CreateControllerTest.php @@ -280,6 +280,7 @@ class CreateControllerTest extends AbstractTestCase $dbi, new ColumnsDefinition($dbi, $relation, $transformations), new UserPrivilegesFactory($dbi), + $template, ))($request); self::assertSame($expected, $response->getHTMLResult()); diff --git a/tests/unit/Controllers/Table/IndexRenameControllerTest.php b/tests/unit/Controllers/Table/IndexRenameControllerTest.php index 0e8319ae29..89ae6b86d9 100644 --- a/tests/unit/Controllers/Table/IndexRenameControllerTest.php +++ b/tests/unit/Controllers/Table/IndexRenameControllerTest.php @@ -91,8 +91,8 @@ class IndexRenameControllerTest extends AbstractTestCase // phpcs:disable Generic.Files.LineLength.TooLong $expected = <<<'HTML'
-
ALTER TABLE `test_db`.`test_table_index_rename` DROP INDEX `old_name`, ADD INDEX `new_name` (`name`) USING BTREE;
-
+
ALTER TABLE `test_db`.`test_table_index_rename` DROP INDEX `old_name`, ADD INDEX `new_name` (`name`) USING BTREE;
+ HTML; // phpcs:enable diff --git a/tests/unit/Controllers/Table/ReplaceControllerTest.php b/tests/unit/Controllers/Table/ReplaceControllerTest.php index c8acb6ef86..65e5914131 100644 --- a/tests/unit/Controllers/Table/ReplaceControllerTest.php +++ b/tests/unit/Controllers/Table/ReplaceControllerTest.php @@ -129,6 +129,7 @@ class ReplaceControllerTest extends AbstractTestCase self::createStub(DatabaseSqlController::class), self::createStub(ChangeController::class), self::createStub(TableSqlController::class), + $template, ); UrlParams::$goto = 'index.php?route=/sql'; @@ -171,6 +172,7 @@ class ReplaceControllerTest extends AbstractTestCase self::createStub(DatabaseSqlController::class), self::createStub(ChangeController::class), self::createStub(TableSqlController::class), + new Template(new Config()), ); /** @var array $result */ diff --git a/tests/unit/Controllers/Table/Structure/SaveControllerTest.php b/tests/unit/Controllers/Table/Structure/SaveControllerTest.php index 15114f821d..7fe3de143a 100644 --- a/tests/unit/Controllers/Table/Structure/SaveControllerTest.php +++ b/tests/unit/Controllers/Table/Structure/SaveControllerTest.php @@ -12,6 +12,7 @@ use PhpMyAdmin\Current; use PhpMyAdmin\Dbal\DatabaseInterface; use PhpMyAdmin\Http\Factory\ResponseFactory; use PhpMyAdmin\Http\ServerRequest; +use PhpMyAdmin\Template; use PhpMyAdmin\Tests\AbstractTestCase; use PhpMyAdmin\Tests\Stubs\ResponseRenderer; use PhpMyAdmin\Transformations; @@ -94,7 +95,8 @@ class SaveControllerTest extends AbstractTestCase $mock->expects(self::once())->method('__invoke')->with($request) ->willReturn(ResponseFactory::create()->createResponse()); - $relation = new Relation($dbi); + $config = new Config(); + $relation = new Relation($dbi, $config); (new SaveController( new ResponseRenderer(), $relation, @@ -102,7 +104,8 @@ class SaveControllerTest extends AbstractTestCase $dbi, $mock, new UserPrivilegesFactory($dbi), - new Config(), + $config, + new Template($config), ))($request); self::assertArrayNotHasKey('selected', $_POST); @@ -118,7 +121,8 @@ class SaveControllerTest extends AbstractTestCase $class = new ReflectionClass(SaveController::class); $method = $class->getMethod('adjustColumnPrivileges'); - $relation = new Relation($dbi); + $config = new Config(); + $relation = new Relation($dbi, $config); $ctrl = new SaveController( new ResponseRenderer(), $relation, @@ -126,7 +130,8 @@ class SaveControllerTest extends AbstractTestCase $dbi, self::createStub(StructureController::class), new UserPrivilegesFactory($dbi), - new Config(), + $config, + new Template($config), ); self::assertFalse(