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(