From 3a619b6824b6b2ba1905086511226c669d50caae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maur=C3=ADcio=20Meneghini=20Fauth?= Date: Tue, 14 Jan 2025 02:24:18 -0300 Subject: [PATCH] Remove plugin global variables MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: MaurĂ­cio Meneghini Fauth --- phpstan-baseline.neon | 78 +++------------ psalm-baseline.xml | 34 +++---- .../Database/DesignerController.php | 2 + src/Controllers/Database/ExportController.php | 2 + src/Controllers/Database/ImportController.php | 26 ++++- src/Controllers/Server/ExportController.php | 2 + src/Controllers/Server/ImportController.php | 26 ++++- src/Controllers/Table/ExportController.php | 2 + src/Controllers/Table/ImportController.php | 26 ++++- src/Database/Designer.php | 21 +++- src/Export/Options.php | 18 +++- src/Plugins.php | 98 +++++++------------ src/Plugins/Export/ExportLatex.php | 17 ++-- src/Plugins/ExportPlugin.php | 5 + src/Plugins/ImportPlugin.php | 5 + src/Plugins/Plugin.php | 3 + src/Plugins/SchemaPlugin.php | 5 + .../Table/ImportControllerTest.php | 3 +- tests/unit/Database/DesignerTest.php | 2 +- tests/unit/Export/OptionsTest.php | 12 ++- tests/unit/Plugins/Export/ExportLatexTest.php | 22 +++++ tests/unit/PluginsTest.php | 5 +- 22 files changed, 228 insertions(+), 186 deletions(-) diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon index 63f6bfa841..c23cd4b73f 100644 --- a/phpstan-baseline.neon +++ b/phpstan-baseline.neon @@ -2115,7 +2115,7 @@ parameters: Use dependency injection instead\.$# ''' identifier: staticMethod.deprecated - count: 1 + count: 3 path: src/Controllers/Database/ImportController.php - @@ -2136,12 +2136,6 @@ parameters: count: 1 path: src/Controllers/Database/ImportController.php - - - message: '#^Cannot cast mixed to string\.$#' - identifier: cast.string - count: 1 - path: src/Controllers/Database/ImportController.php - - message: '#^Parameter \#2 \$db of static method PhpMyAdmin\\Database\\MultiTableQuery\:\:displayResults\(\) expects string, mixed given\.$#' identifier: argument.type @@ -3369,7 +3363,7 @@ parameters: Use dependency injection instead\.$# ''' identifier: staticMethod.deprecated - count: 1 + count: 3 path: src/Controllers/Server/ImportController.php - @@ -3390,12 +3384,6 @@ parameters: count: 1 path: src/Controllers/Server/ImportController.php - - - message: '#^Cannot cast mixed to string\.$#' - identifier: cast.string - count: 1 - path: src/Controllers/Server/ImportController.php - - message: '#^Construct empty\(\) is not allowed\. Use more strict comparison\.$#' identifier: empty.notAllowed @@ -4071,7 +4059,7 @@ parameters: Use dependency injection instead\.$# ''' identifier: staticMethod.deprecated - count: 1 + count: 3 path: src/Controllers/Table/ImportController.php - @@ -4092,12 +4080,6 @@ parameters: count: 1 path: src/Controllers/Table/ImportController.php - - - message: '#^Cannot cast mixed to string\.$#' - identifier: cast.string - count: 1 - path: src/Controllers/Table/ImportController.php - - message: '#^Binary operation "\+\=" between int and mixed results in an error\.$#' identifier: assignOp.invalid @@ -5745,13 +5727,7 @@ parameters: Use dependency injection instead\.$# ''' identifier: staticMethod.deprecated - count: 1 - path: src/Database/Designer.php - - - - message: '#^Cannot cast mixed to string\.$#' - identifier: cast.string - count: 1 + count: 2 path: src/Database/Designer.php - @@ -7494,7 +7470,7 @@ parameters: Use dependency injection instead\.$# ''' identifier: staticMethod.deprecated - count: 3 + count: 4 path: src/Export/Options.php - @@ -7521,7 +7497,7 @@ parameters: - message: '#^Cannot cast mixed to string\.$#' identifier: cast.string - count: 4 + count: 3 path: src/Export/Options.php - @@ -10515,6 +10491,12 @@ parameters: count: 1 path: src/Plugins.php + - + message: '#^Cannot cast mixed to string\.$#' + identifier: cast.string + count: 2 + path: src/Plugins.php + - message: '#^Construct empty\(\) is not allowed\. Use more strict comparison\.$#' identifier: empty.notAllowed @@ -10533,54 +10515,18 @@ parameters: count: 2 path: src/Plugins.php - - - message: '#^Method PhpMyAdmin\\Plugins\:\:getString\(\) should return string but returns mixed\.$#' - identifier: return.type - count: 1 - path: src/Plugins.php - - message: '#^Parameter \#1 \$link of static method PhpMyAdmin\\Html\\MySQLDocumentation\:\:show\(\) expects string, mixed given\.$#' identifier: argument.type count: 2 path: src/Plugins.php - - - message: '#^Parameter \#1 \$name of static method PhpMyAdmin\\Plugins\:\:getString\(\) expects string\|null, mixed given\.$#' - identifier: argument.type - count: 2 - path: src/Plugins.php - - - - message: '#^Parameter \#1 \$string of function htmlspecialchars expects string, bool\|int\<0, max\>\|string given\.$#' - identifier: argument.type - count: 1 - path: src/Plugins.php - - - - message: '#^Parameter \#1 \$string of function htmlspecialchars expects string, mixed given\.$#' - identifier: argument.type - count: 2 - path: src/Plugins.php - - message: '#^Parameter \#2 \$anchor of static method PhpMyAdmin\\Html\\MySQLDocumentation\:\:showDocumentation\(\) expects string, mixed given\.$#' identifier: argument.type count: 1 path: src/Plugins.php - - - message: '#^Parameter \#2 \$replace of function str_replace expects array\\|string, mixed given\.$#' - identifier: argument.type - count: 1 - path: src/Plugins.php - - - - message: '#^Parameter \#3 \$subject of function str_replace expects array\\|string, bool\|int\<0, max\>\|string given\.$#' - identifier: argument.type - count: 1 - path: src/Plugins.php - - message: '#^Parameter \#5 \$anchor of static method PhpMyAdmin\\Html\\MySQLDocumentation\:\:show\(\) expects string, mixed given\.$#' identifier: argument.type diff --git a/psalm-baseline.xml b/psalm-baseline.xml index 990e00ec28..328fe8d410 100644 --- a/psalm-baseline.xml +++ b/psalm-baseline.xml @@ -927,6 +927,8 @@ + + @@ -1968,6 +1970,8 @@ + + @@ -2574,6 +2578,8 @@ + + @@ -3598,6 +3604,7 @@ + @@ -3609,9 +3616,6 @@ - - - @@ -4647,6 +4651,7 @@ + @@ -4659,9 +4664,6 @@ - - - settings['Export'][$str]]]> settings['SaveDir'])]]> @@ -6234,13 +6236,10 @@ - - - @@ -6248,25 +6247,11 @@ - - - - - - - - - - - - - settings[$section][$opt]]]> - settings[$section][$opt]]]> getName()]]> @@ -12386,6 +12371,9 @@ selectedServer]]> selectedServer]]> + + + diff --git a/src/Controllers/Database/DesignerController.php b/src/Controllers/Database/DesignerController.php index 6182435176..00901a4aa1 100644 --- a/src/Controllers/Database/DesignerController.php +++ b/src/Controllers/Database/DesignerController.php @@ -52,6 +52,8 @@ final class DesignerController implements InvocableController $html = $this->databaseDesigner->getHtmlForSchemaExport( $db, (int) $request->getParsedBodyParamAsStringOrNull('selected_page'), + $request->getParam('format'), + $request->getParam('export_type'), ); } elseif ($dialog === 'add_table') { // Pass the db and table to the getTablesInfo so we only have the table we asked for diff --git a/src/Controllers/Database/ExportController.php b/src/Controllers/Database/ExportController.php index 8a75f414f7..2977072602 100644 --- a/src/Controllers/Database/ExportController.php +++ b/src/Controllers/Database/ExportController.php @@ -140,6 +140,8 @@ final class ExportController implements InvocableController Current::$numTables, 0, $exportList, + $request->getParam('format'), + $request->getParam('what'), ); $this->response->render('database/export/index', array_merge($options, [ diff --git a/src/Controllers/Database/ImportController.php b/src/Controllers/Database/ImportController.php index e9e1cbcf19..b7038d0586 100644 --- a/src/Controllers/Database/ImportController.php +++ b/src/Controllers/Database/ImportController.php @@ -26,6 +26,7 @@ use PhpMyAdmin\Utils\ForeignKey; use function __; use function is_numeric; +use function is_string; final class ImportController implements InvocableController { @@ -92,12 +93,9 @@ final class ImportController implements InvocableController $idKey = $_SESSION[Ajax::SESSION_KEY]['handler']::getIdKey(); $hiddenInputs = [$idKey => $uploadId, 'import_type' => 'database', 'db' => Current::$database]; - $default = $request->hasQueryParam('format') - ? (string) $request->getQueryParam('format') - : Plugins::getDefault('Import', 'format'); - $choice = Plugins::getChoice($importList, $default); + $choice = Plugins::getChoice($importList, $this->getFormat($request->getParam('format'))); $options = Plugins::getOptions('Import', $importList); - $skipQueriesDefault = Plugins::getDefault('Import', 'skip_queries'); + $skipQueriesDefault = $this->getSkipQueries($request->getParam('skip_queries')); $isAllowInterruptChecked = Plugins::checkboxCheck('Import', 'allow_interrupt'); $maxUploadSize = (int) $config->get('max_upload_size'); @@ -134,4 +132,22 @@ final class ImportController implements InvocableController return $this->response->response(); } + + private function getFormat(mixed $formatParam): string + { + if (is_string($formatParam) && $formatParam !== '') { + return $formatParam; + } + + return Config::getInstance()->settings['Import']['format']; + } + + private function getSkipQueries(mixed $skipQueriesParam): int + { + if (is_numeric($skipQueriesParam) && $skipQueriesParam >= 0) { + return (int) $skipQueriesParam; + } + + return Config::getInstance()->settings['Import']['skip_queries']; + } } diff --git a/src/Controllers/Server/ExportController.php b/src/Controllers/Server/ExportController.php index fde19f15e5..4c18f39b9e 100644 --- a/src/Controllers/Server/ExportController.php +++ b/src/Controllers/Server/ExportController.php @@ -66,6 +66,8 @@ final class ExportController implements InvocableController Current::$numTables, 0, $exportList, + $request->getParam('format'), + $request->getParam('what'), ); $this->response->render('server/export/index', array_merge($options, [ diff --git a/src/Controllers/Server/ImportController.php b/src/Controllers/Server/ImportController.php index c742f96ff3..9ea95509a4 100644 --- a/src/Controllers/Server/ImportController.php +++ b/src/Controllers/Server/ImportController.php @@ -24,6 +24,7 @@ use PhpMyAdmin\Utils\ForeignKey; use function __; use function is_numeric; +use function is_string; final class ImportController implements InvocableController { @@ -74,12 +75,9 @@ final class ImportController implements InvocableController $idKey = $_SESSION[Ajax::SESSION_KEY]['handler']::getIdKey(); $hiddenInputs = [$idKey => $uploadId, 'import_type' => 'server']; - $default = $request->hasQueryParam('format') - ? (string) $request->getQueryParam('format') - : Plugins::getDefault('Import', 'format'); - $choice = Plugins::getChoice($importList, $default); + $choice = Plugins::getChoice($importList, $this->getFormat($request->getParam('format'))); $options = Plugins::getOptions('Import', $importList); - $skipQueriesDefault = Plugins::getDefault('Import', 'skip_queries'); + $skipQueriesDefault = $this->getSkipQueries($request->getParam('skip_queries')); $isAllowInterruptChecked = Plugins::checkboxCheck('Import', 'allow_interrupt'); $maxUploadSize = (int) $config->get('max_upload_size'); @@ -116,4 +114,22 @@ final class ImportController implements InvocableController return $this->response->response(); } + + private function getFormat(mixed $formatParam): string + { + if (is_string($formatParam) && $formatParam !== '') { + return $formatParam; + } + + return Config::getInstance()->settings['Import']['format']; + } + + private function getSkipQueries(mixed $skipQueriesParam): int + { + if (is_numeric($skipQueriesParam) && $skipQueriesParam >= 0) { + return (int) $skipQueriesParam; + } + + return Config::getInstance()->settings['Import']['skip_queries']; + } } diff --git a/src/Controllers/Table/ExportController.php b/src/Controllers/Table/ExportController.php index 6baba5e5a7..5b2682e7c3 100644 --- a/src/Controllers/Table/ExportController.php +++ b/src/Controllers/Table/ExportController.php @@ -105,6 +105,8 @@ class ExportController implements InvocableController Current::$numTables, 0, $exportList, + $request->getParam('format'), + $request->getParam('what'), ); $this->response->render('table/export/index', array_merge($options, [ diff --git a/src/Controllers/Table/ImportController.php b/src/Controllers/Table/ImportController.php index 54cec045d1..99cfbda738 100644 --- a/src/Controllers/Table/ImportController.php +++ b/src/Controllers/Table/ImportController.php @@ -29,6 +29,7 @@ use PhpMyAdmin\Utils\ForeignKey; use function __; use function is_numeric; +use function is_string; final class ImportController implements InvocableController { @@ -122,12 +123,9 @@ final class ImportController implements InvocableController 'table' => Current::$table, ]; - $default = $request->hasQueryParam('format') - ? (string) $request->getQueryParam('format') - : Plugins::getDefault('Import', 'format'); - $choice = Plugins::getChoice($importList, $default); + $choice = Plugins::getChoice($importList, $this->getFormat($request->getParam('format'))); $options = Plugins::getOptions('Import', $importList); - $skipQueriesDefault = Plugins::getDefault('Import', 'skip_queries'); + $skipQueriesDefault = $this->getSkipQueries($request->getParam('skip_queries')); $isAllowInterruptChecked = Plugins::checkboxCheck('Import', 'allow_interrupt'); $maxUploadSize = (int) $config->get('max_upload_size'); @@ -164,4 +162,22 @@ final class ImportController implements InvocableController return $this->response->response(); } + + private function getFormat(mixed $formatParam): string + { + if (is_string($formatParam) && $formatParam !== '') { + return $formatParam; + } + + return Config::getInstance()->settings['Import']['format']; + } + + private function getSkipQueries(mixed $skipQueriesParam): int + { + if (is_numeric($skipQueriesParam) && $skipQueriesParam >= 0) { + return (int) $skipQueriesParam; + } + + return Config::getInstance()->settings['Import']['skip_queries']; + } } diff --git a/src/Database/Designer.php b/src/Database/Designer.php index d676516157..912090595c 100644 --- a/src/Database/Designer.php +++ b/src/Database/Designer.php @@ -17,6 +17,7 @@ use PhpMyAdmin\Util; use stdClass; use function __; +use function is_string; use function json_decode; use function str_contains; @@ -101,7 +102,7 @@ class Designer * @param string $db database name * @param int $page the page to be exported */ - public function getHtmlForSchemaExport(string $db, int $page): string + public function getHtmlForSchemaExport(string $db, int $page, mixed $formatParam, mixed $exportTypeParam): string { $exportList = Plugins::getSchema(); @@ -112,10 +113,7 @@ class Designer )->getDisplay(); } - $default = isset($_GET['export_type']) - ? (string) $_GET['export_type'] - : Plugins::getDefault('Schema', 'format'); - $choice = Plugins::getChoice($exportList, $default); + $choice = Plugins::getChoice($exportList, $this->getFormat($formatParam, $exportTypeParam)); $options = Plugins::getOptions('Schema', $exportList); return $this->template->render('database/designer/schema_export', [ @@ -126,6 +124,19 @@ class Designer ]); } + private function getFormat(mixed $formatParam, mixed $exportTypeParam): string + { + if (is_string($exportTypeParam) && $exportTypeParam !== '') { + return $exportTypeParam; + } + + if (is_string($formatParam) && $formatParam !== '') { + return $formatParam; + } + + return Config::getInstance()->settings['Schema']['format']; + } + /** * Returns array of stored values of Designer Settings * diff --git a/src/Export/Options.php b/src/Export/Options.php index decb7adb1f..56be69a08c 100644 --- a/src/Export/Options.php +++ b/src/Export/Options.php @@ -99,6 +99,8 @@ final class Options int|string $numTables, int|string $unlimNumRows, array $exportList, + mixed $formatParam, + mixed $whatParam, ): array { $exportTemplatesFeature = $this->relation->getRelationParameters()->exportTemplatesFeature; @@ -116,8 +118,7 @@ final class Options $templates = is_array($templates) ? $templates : []; } - $default = isset($_GET['what']) ? (string) $_GET['what'] : Plugins::getDefault('Export', 'format'); - $dropdown = Plugins::getChoice($exportList, $default); + $dropdown = Plugins::getChoice($exportList, $this->getFormat($formatParam, $whatParam)); $tableObject = new Table($table, $db, DatabaseInterface::getInstance()); $rows = []; @@ -202,6 +203,19 @@ final class Options ]; } + private function getFormat(mixed $formatParam, mixed $whatParam): string + { + if (is_string($whatParam) && $whatParam !== '') { + return $whatParam; + } + + if (is_string($formatParam) && $formatParam !== '') { + return $formatParam; + } + + return Config::getInstance()->settings['Export']['format']; + } + private function getFileNameTemplate(ExportType $exportType, string|null $filename = null): string { if ($filename !== null) { diff --git a/src/Plugins.php b/src/Plugins.php index 4330140716..3fd842df8a 100644 --- a/src/Plugins.php +++ b/src/Plugins.php @@ -32,15 +32,14 @@ use function class_exists; use function count; use function htmlspecialchars; use function is_array; +use function is_string; use function is_subclass_of; use function mb_strtolower; use function mb_strtoupper; use function mb_substr; use function method_exists; -use function preg_match_all; use function sprintf; use function str_contains; -use function str_replace; use function str_starts_with; use function strcasecmp; use function usort; @@ -174,18 +173,6 @@ class Plugins return $plugins; } - /** - * Returns locale string for $name or $name if no locale is found - * - * @param string|null $name for local string - * - * @return string locale string for $name - */ - public static function getString(string|null $name): string - { - return $GLOBALS[$name] ?? $name ?? ''; - } - /** * Returns html input tag option 'checked' if plugin $opt * should be set by config or request @@ -224,36 +211,21 @@ class Plugins */ public static function getDefault(string $section, string $opt): string { - if (isset($_GET[$opt])) { + if (isset($_GET[$opt]) && is_string($_GET[$opt])) { // If the form is being repopulated using $_GET data, that is priority - return htmlspecialchars($_GET[$opt]); + return $_GET[$opt]; } - if (isset($_REQUEST[$opt]) && ImportSettings::$timeoutPassed) { - return htmlspecialchars($_REQUEST[$opt]); + if (isset($_REQUEST[$opt]) && is_string($_REQUEST[$opt]) && ImportSettings::$timeoutPassed) { + return $_REQUEST[$opt]; } $config = Config::getInstance(); - if (! isset($config->settings[$section][$opt])) { - return ''; + if (isset($config->settings[$section][$opt])) { + return (string) $config->settings[$section][$opt]; } - $matches = []; - /* Possibly replace localised texts */ - if (preg_match_all('/(str[A-Z][A-Za-z0-9]*)/', (string) $config->settings[$section][$opt], $matches) < 1) { - return htmlspecialchars((string) $config->settings[$section][$opt]); - } - - $val = $config->settings[$section][$opt]; - foreach ($matches[0] as $match) { - if (! isset($GLOBALS[$match])) { - continue; - } - - $val = str_replace($match, $GLOBALS[$match], $val); - } - - return htmlspecialchars($val); + return ''; } /** @@ -270,7 +242,7 @@ class Plugins $properties = $plugin->getProperties(); $return[] = [ 'name' => $pluginName, - 'text' => self::getString($properties->getText()), + 'text' => $plugin->getTranslatedText($properties->getText()), 'is_selected' => $pluginName === $default, 'is_binary' => $properties->getForceFile(), ]; @@ -291,6 +263,7 @@ class Plugins * @return string table row with option */ private static function getOneOption( + Plugin $plugin, string $section, string $pluginName, OptionsPropertyItem $propertyGroup, @@ -313,7 +286,8 @@ class Plugins } if ($text != null) { - $ret .= '
' . self::getString($text) . '
'; + $ret .= '
' + . htmlspecialchars($plugin->getTranslatedText($text)) . '
'; } $ret .= '
    '; @@ -340,7 +314,7 @@ class Plugins /** @var OptionsPropertyItem|null $subgroupHeader */ $subgroupHeader = $propertyItem->getSubgroupHeader(); if ($subgroupHeader !== null) { - $ret .= self::getOneOption($section, $pluginName, $subgroupHeader); + $ret .= self::getOneOption($plugin, $section, $pluginName, $subgroupHeader); } $ret .= '
    • getName() . '">' - . self::getString($propertyItem->getText()) . ''; + . htmlspecialchars($plugin->getTranslatedText($propertyItem->getText() ?? '')) . ''; break; case DocPropertyItem::class: echo DocPropertyItem::class; @@ -444,24 +419,25 @@ class Plugins case HiddenPropertyItem::class: $ret .= '
    • getTranslatedText(self::getDefault( $section, $pluginName . '_' . $propertyItem->getName(), - ) + ))) . '">
    • '; break; case MessageOnlyPropertyItem::class: $ret .= '
    • ' . "\n"; - $ret .= self::getString($propertyItem->getText()); + $ret .= htmlspecialchars($plugin->getTranslatedText($propertyItem->getText() ?? '')); break; case RadioPropertyItem::class: /** @var RadioPropertyItem $pitem */ $pitem = $propertyItem; - $default = self::getDefault( + $default = htmlspecialchars($plugin->getTranslatedText(self::getDefault( $section, $pluginName . '_' . $pitem->getName(), - ); + ))); $ret .= '
    • '; @@ -476,7 +452,7 @@ class Plugins $ret .= '>'; + . htmlspecialchars($plugin->getTranslatedText((string) $val)) . ''; } $ret .= '
    • '; @@ -488,22 +464,22 @@ class Plugins $ret .= '
    • ' . "\n"; $ret .= ''; + . htmlspecialchars($plugin->getTranslatedText($pitem->getText() ?? '')) . ''; $ret .= ''; @@ -514,13 +490,14 @@ class Plugins $ret .= '
    • ' . "\n"; $ret .= ''; + . htmlspecialchars($plugin->getTranslatedText($pitem->getText() ?? '')) . ''; $ret .= 'getTranslatedText(self::getDefault( $section, $pluginName . '_' . $pitem->getName(), - ) . '"' + ))) . '"' . ' id="text_' . $pluginName . '_' . $pitem->getName() . '"' . ($pitem->getSize() !== 0 @@ -535,13 +512,14 @@ class Plugins $ret .= '
    • ' . "\n"; $ret .= ''; + . htmlspecialchars($plugin->getTranslatedText($propertyItem->getText() ?? '')) . ''; $ret .= 'getTranslatedText(self::getDefault( $section, $pluginName . '_' . $propertyItem->getName(), - ) . '"' + ))) . '"' . ' id="number_' . $pluginName . '_' . $propertyItem->getName() . '"' . ' min="0"' @@ -576,7 +554,7 @@ class Plugins $ret .= '
      '; - $ret .= '

      ' . self::getString($text) . '

      '; + $ret .= '

      ' . htmlspecialchars($plugin->getTranslatedText($text)) . '

      '; $noOptions = true; if ($options !== null && count($options) > 0) { @@ -590,7 +568,7 @@ class Plugins } } - $ret .= self::getOneOption($section, $pluginName, $propertyMainGroup); + $ret .= self::getOneOption($plugin, $section, $pluginName, $propertyMainGroup); } } diff --git a/src/Plugins/Export/ExportLatex.php b/src/Plugins/Export/ExportLatex.php index 03dac63a16..860280b25f 100644 --- a/src/Plugins/Export/ExportLatex.php +++ b/src/Plugins/Export/ExportLatex.php @@ -26,6 +26,8 @@ use PhpMyAdmin\Version; use function __; use function addcslashes; +use function array_keys; +use function array_values; use function in_array; use function is_string; use function mb_strpos; @@ -59,15 +61,16 @@ class ExportLatex extends ExportPlugin return 'latex'; } - /** - * Initialize the local variables that are used for export Latex. - */ - protected function init(): void + public function getTranslatedText(string $text): string { /* Messages used in default captions */ - $GLOBALS['strLatexContent'] = __('Content of table @TABLE@'); - $GLOBALS['strLatexContinued'] = __('(continued)'); - $GLOBALS['strLatexStructure'] = __('Structure of table @TABLE@'); + $messages = [ + 'strLatexContent' => __('Content of table @TABLE@'), + 'strLatexContinued' => __('(continued)'), + 'strLatexStructure' => __('Structure of table @TABLE@'), + ]; + + return str_replace(array_keys($messages), array_values($messages), $text); } protected function setProperties(): ExportPluginProperties diff --git a/src/Plugins/ExportPlugin.php b/src/Plugins/ExportPlugin.php index 7e42e1ce30..7e201525ef 100644 --- a/src/Plugins/ExportPlugin.php +++ b/src/Plugins/ExportPlugin.php @@ -342,4 +342,9 @@ abstract class ExportPlugin implements Plugin ?? StructureOrData::tryFrom(is_string($valueFromConfig) ? $valueFromConfig : '') ?? $defaultValue; } + + public function getTranslatedText(string $text): string + { + return $text; + } } diff --git a/src/Plugins/ImportPlugin.php b/src/Plugins/ImportPlugin.php index 02ac54d2d8..7f73083ef3 100644 --- a/src/Plugins/ImportPlugin.php +++ b/src/Plugins/ImportPlugin.php @@ -68,4 +68,9 @@ abstract class ImportPlugin implements Plugin } abstract public function setImportOptions(ServerRequest $request): void; + + public function getTranslatedText(string $text): string + { + return $text; + } } diff --git a/src/Plugins/Plugin.php b/src/Plugins/Plugin.php index f26795fb57..cf00821caa 100644 --- a/src/Plugins/Plugin.php +++ b/src/Plugins/Plugin.php @@ -13,5 +13,8 @@ interface Plugin public function getProperties(): PluginPropertyItem; + /** Returns locale string for $text or $text if no locale is found */ + public function getTranslatedText(string $text): string; + public static function isAvailable(): bool; } diff --git a/src/Plugins/SchemaPlugin.php b/src/Plugins/SchemaPlugin.php index e0f4eeb533..46af8c97e2 100644 --- a/src/Plugins/SchemaPlugin.php +++ b/src/Plugins/SchemaPlugin.php @@ -92,4 +92,9 @@ abstract class SchemaPlugin implements Plugin { return true; } + + public function getTranslatedText(string $text): string + { + return $text; + } } diff --git a/tests/unit/Controllers/Table/ImportControllerTest.php b/tests/unit/Controllers/Table/ImportControllerTest.php index 406659b6e0..d8756b2134 100644 --- a/tests/unit/Controllers/Table/ImportControllerTest.php +++ b/tests/unit/Controllers/Table/ImportControllerTest.php @@ -36,7 +36,6 @@ class ImportControllerTest extends AbstractTestCase Current::$lang = 'en'; $config = Config::getInstance(); $config->selectedServer = $config->getSettings()->Servers[1]->asArray(); - $_GET['format'] = 'xml'; $dummyDbi = $this->createDbiDummy(); $dummyDbi->addSelectDb('test_db'); @@ -92,7 +91,7 @@ class ImportControllerTest extends AbstractTestCase ]); $request = ServerRequestFactory::create()->createServerRequest('GET', 'http://example.com/') - ->withQueryParams(['db' => 'test_db', 'table' => 'test_table']); + ->withQueryParams(['db' => 'test_db', 'table' => 'test_table', 'format' => 'xml']); $response = new ResponseRenderer(); (new ImportController($response, $dbi, $pageSettings, new DbTableExists($dbi)))($request); diff --git a/tests/unit/Database/DesignerTest.php b/tests/unit/Database/DesignerTest.php index 98849b7751..be4b6991b0 100644 --- a/tests/unit/Database/DesignerTest.php +++ b/tests/unit/Database/DesignerTest.php @@ -165,7 +165,7 @@ class DesignerTest extends AbstractTestCase $dbi = DatabaseInterface::getInstance(); $this->designer = new Designer($dbi, new Relation($dbi), new Template()); - $result = $this->designer->getHtmlForSchemaExport($db, $page); + $result = $this->designer->getHtmlForSchemaExport($db, $page, null, null); // export type self::assertStringContainsString('