Skip to content

Commit 566842b

Browse files
Merge pull request #18839 from kamil-tekiela/getColumnsInfo
Refactor Designer/Common::getColumnsInfo()
2 parents 3229640 + fd9c7e6 commit 566842b

6 files changed

Lines changed: 86 additions & 182 deletions

File tree

phpstan-baseline.neon

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -8690,26 +8690,6 @@ parameters:
86908690
count: 1
86918691
path: src/Database/CentralColumns.php
86928692

8693-
-
8694-
message: "#^Cannot access offset 'COLUMN_ID' on mixed\\.$#"
8695-
count: 2
8696-
path: src/Database/Designer.php
8697-
8698-
-
8699-
message: "#^Cannot access offset 'COLUMN_NAME' on mixed\\.$#"
8700-
count: 2
8701-
path: src/Database/Designer.php
8702-
8703-
-
8704-
message: "#^Cannot access offset 'TYPE' on mixed\\.$#"
8705-
count: 18
8706-
path: src/Database/Designer.php
8707-
8708-
-
8709-
message: "#^Cannot access offset int\\<0, max\\> on mixed\\.$#"
8710-
count: 20
8711-
path: src/Database/Designer.php
8712-
87138693
-
87148694
message: "#^Cannot cast mixed to string\\.$#"
87158695
count: 2
@@ -8725,16 +8705,6 @@ parameters:
87258705
count: 1
87268706
path: src/Database/Designer.php
87278707

8728-
-
8729-
message: "#^Parameter \\#1 \\$haystack of function str_contains expects string, mixed given\\.$#"
8730-
count: 18
8731-
path: src/Database/Designer.php
8732-
8733-
-
8734-
message: "#^Parameter \\#1 \\$value of function count expects array\\|Countable, mixed given\\.$#"
8735-
count: 2
8736-
path: src/Database/Designer.php
8737-
87388708
-
87398709
message: "#^Argument of an invalid type mixed supplied for foreach, only iterables are supported\\.$#"
87408710
count: 3

psalm-baseline.xml

Lines changed: 0 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -4745,82 +4745,12 @@
47454745
<DeprecatedMethod>
47464746
<code>Config::getInstance()</code>
47474747
</DeprecatedMethod>
4748-
<MixedArgument>
4749-
<code><![CDATA[$tabColumn[$tableName]['COLUMN_ID']]]></code>
4750-
<code><![CDATA[$tabColumn[$tableName]['COLUMN_ID']]]></code>
4751-
<code><![CDATA[$tabColumn[$tableName]['TYPE'][$j]]]></code>
4752-
<code><![CDATA[$tabColumn[$tableName]['TYPE'][$j]]]></code>
4753-
<code><![CDATA[$tabColumn[$tableName]['TYPE'][$j]]]></code>
4754-
<code><![CDATA[$tabColumn[$tableName]['TYPE'][$j]]]></code>
4755-
<code><![CDATA[$tabColumn[$tableName]['TYPE'][$j]]]></code>
4756-
<code><![CDATA[$tabColumn[$tableName]['TYPE'][$j]]]></code>
4757-
<code><![CDATA[$tabColumn[$tableName]['TYPE'][$j]]]></code>
4758-
<code><![CDATA[$tabColumn[$tableName]['TYPE'][$j]]]></code>
4759-
<code><![CDATA[$tabColumn[$tableName]['TYPE'][$j]]]></code>
4760-
<code><![CDATA[$tabColumn[$tableName]['TYPE'][$j]]]></code>
4761-
<code><![CDATA[$tabColumn[$tableName]['TYPE'][$j]]]></code>
4762-
<code><![CDATA[$tabColumn[$tableName]['TYPE'][$j]]]></code>
4763-
<code><![CDATA[$tabColumn[$tableName]['TYPE'][$j]]]></code>
4764-
<code><![CDATA[$tabColumn[$tableName]['TYPE'][$j]]]></code>
4765-
<code><![CDATA[$tabColumn[$tableName]['TYPE'][$j]]]></code>
4766-
<code><![CDATA[$tabColumn[$tableName]['TYPE'][$j]]]></code>
4767-
<code><![CDATA[$tabColumn[$tableName]['TYPE'][$j]]]></code>
4768-
<code><![CDATA[$tabColumn[$tableName]['TYPE'][$j]]]></code>
4769-
</MixedArgument>
4770-
<MixedArrayAccess>
4771-
<code><![CDATA[$tabColumn[$tableName]['COLUMN_ID']]]></code>
4772-
<code><![CDATA[$tabColumn[$tableName]['COLUMN_ID']]]></code>
4773-
<code><![CDATA[$tabColumn[$tableName]['COLUMN_NAME']]]></code>
4774-
<code><![CDATA[$tabColumn[$tableName]['COLUMN_NAME']]]></code>
4775-
<code><![CDATA[$tabColumn[$tableName]['COLUMN_NAME'][$j]]]></code>
4776-
<code><![CDATA[$tabColumn[$tableName]['COLUMN_NAME'][$j]]]></code>
4777-
<code><![CDATA[$tabColumn[$tableName]['TYPE']]]></code>
4778-
<code><![CDATA[$tabColumn[$tableName]['TYPE']]]></code>
4779-
<code><![CDATA[$tabColumn[$tableName]['TYPE']]]></code>
4780-
<code><![CDATA[$tabColumn[$tableName]['TYPE']]]></code>
4781-
<code><![CDATA[$tabColumn[$tableName]['TYPE']]]></code>
4782-
<code><![CDATA[$tabColumn[$tableName]['TYPE']]]></code>
4783-
<code><![CDATA[$tabColumn[$tableName]['TYPE']]]></code>
4784-
<code><![CDATA[$tabColumn[$tableName]['TYPE']]]></code>
4785-
<code><![CDATA[$tabColumn[$tableName]['TYPE']]]></code>
4786-
<code><![CDATA[$tabColumn[$tableName]['TYPE']]]></code>
4787-
<code><![CDATA[$tabColumn[$tableName]['TYPE']]]></code>
4788-
<code><![CDATA[$tabColumn[$tableName]['TYPE']]]></code>
4789-
<code><![CDATA[$tabColumn[$tableName]['TYPE']]]></code>
4790-
<code><![CDATA[$tabColumn[$tableName]['TYPE']]]></code>
4791-
<code><![CDATA[$tabColumn[$tableName]['TYPE']]]></code>
4792-
<code><![CDATA[$tabColumn[$tableName]['TYPE']]]></code>
4793-
<code><![CDATA[$tabColumn[$tableName]['TYPE']]]></code>
4794-
<code><![CDATA[$tabColumn[$tableName]['TYPE']]]></code>
4795-
<code><![CDATA[$tabColumn[$tableName]['TYPE'][$j]]]></code>
4796-
<code><![CDATA[$tabColumn[$tableName]['TYPE'][$j]]]></code>
4797-
<code><![CDATA[$tabColumn[$tableName]['TYPE'][$j]]]></code>
4798-
<code><![CDATA[$tabColumn[$tableName]['TYPE'][$j]]]></code>
4799-
<code><![CDATA[$tabColumn[$tableName]['TYPE'][$j]]]></code>
4800-
<code><![CDATA[$tabColumn[$tableName]['TYPE'][$j]]]></code>
4801-
<code><![CDATA[$tabColumn[$tableName]['TYPE'][$j]]]></code>
4802-
<code><![CDATA[$tabColumn[$tableName]['TYPE'][$j]]]></code>
4803-
<code><![CDATA[$tabColumn[$tableName]['TYPE'][$j]]]></code>
4804-
<code><![CDATA[$tabColumn[$tableName]['TYPE'][$j]]]></code>
4805-
<code><![CDATA[$tabColumn[$tableName]['TYPE'][$j]]]></code>
4806-
<code><![CDATA[$tabColumn[$tableName]['TYPE'][$j]]]></code>
4807-
<code><![CDATA[$tabColumn[$tableName]['TYPE'][$j]]]></code>
4808-
<code><![CDATA[$tabColumn[$tableName]['TYPE'][$j]]]></code>
4809-
<code><![CDATA[$tabColumn[$tableName]['TYPE'][$j]]]></code>
4810-
<code><![CDATA[$tabColumn[$tableName]['TYPE'][$j]]]></code>
4811-
<code><![CDATA[$tabColumn[$tableName]['TYPE'][$j]]]></code>
4812-
<code><![CDATA[$tabColumn[$tableName]['TYPE'][$j]]]></code>
4813-
</MixedArrayAccess>
48144748
<MixedAssignment>
48154749
<code>$params</code>
48164750
</MixedAssignment>
48174751
<MixedInferredReturnType>
48184752
<code>mixed[]</code>
48194753
</MixedInferredReturnType>
4820-
<MixedOperand>
4821-
<code><![CDATA[$tabColumn[$tableName]['COLUMN_NAME'][$j]]]></code>
4822-
<code><![CDATA[$tabColumn[$tableName]['COLUMN_NAME'][$j]]]></code>
4823-
</MixedOperand>
48244754
<MixedReturnStatement>
48254755
<code>$params</code>
48264756
<code>$params</code>

resources/templates/database/designer/database_tables.twig

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -63,12 +63,12 @@
6363
<tbody id="id_tbody_{{ t_n_url }}"
6464
{{- tab_pos[t_n] is defined and tab_pos[t_n]['V'] is empty ? ' style="display: none"' }}>
6565
{% set display_field = designerTable.getDisplayField() %}
66-
{% for j in 0..tab_column[t_n]['COLUMN_ID']|length - 1 %}
67-
{% set col_name = tab_column[t_n]['COLUMN_NAME'][j] %}
68-
{% set tmp_column = t_n ~ '.' ~ tab_column[t_n]['COLUMN_NAME'][j] %}
66+
{% for j in 0..tab_column[t_n]|length - 1 %}
67+
{% set col_name = tab_column[t_n][j].name %}
68+
{% set tmp_column = t_n ~ '.' ~ tab_column[t_n][j].name %}
6969
{% set click_field_param = [
7070
designerTable.getTableName()|escape('url'),
71-
tab_column[t_n]['COLUMN_NAME'][j]|url_encode
71+
tab_column[t_n][j].name|url_encode
7272
] %}
7373
{% if not designerTable.supportsForeignkeys() %}
7474
{% set click_field_param = click_field_param|merge([tables_pk_or_unique_keys[tmp_column] is defined ? 1 : 0]) %}
@@ -78,15 +78,15 @@
7878
{% set click_field_param = click_field_param|merge([tables_all_keys[tmp_column] is defined ? 1 : 0]) %}
7979
{% endif %}
8080
{% set click_field_param = click_field_param|merge([db]) %}
81-
<tr id="id_tr_{{ designerTable.getTableName()|escape('url') }}.{{ tab_column[t_n]['COLUMN_NAME'][j] }}" class="tab_field
82-
{{- display_field == tab_column[t_n]['COLUMN_NAME'][j] ? '_3' }}" click_field_param="
81+
<tr id="id_tr_{{ designerTable.getTableName()|escape('url') }}.{{ tab_column[t_n][j].name }}" class="tab_field
82+
{{- display_field == tab_column[t_n][j].name ? '_3' }}" click_field_param="
8383
{{- click_field_param|join(',') }}">
8484
{% if has_query %}
8585
<td class="select_all">
8686
<input class="select_all_store_col"
87-
value="{{ t_n_url }}{{ tab_column[t_n]['COLUMN_NAME'][j]|url_encode }}"
87+
value="{{ t_n_url }}{{ tab_column[t_n][j].name|url_encode }}"
8888
type="checkbox"
89-
id="select_{{ t_n_url }}._{{ tab_column[t_n]['COLUMN_NAME'][j]|url_encode }}"
89+
id="select_{{ t_n_url }}._{{ tab_column[t_n][j].name|url_encode }}"
9090
style="margin: 0;"
9191
title="{{ 'Select "%s"'|trans|format(col_name) }}"
9292
id_check_all="select_all_{{ i }}"
@@ -96,11 +96,11 @@
9696
</td>
9797
{% endif %}
9898
<td width="10px" colspan="3" id="{{ t_n_url }}.
99-
{{- tab_column[t_n]['COLUMN_NAME'][j]|url_encode }}">
99+
{{- tab_column[t_n][j].name|url_encode }}">
100100
<div class="text-nowrap">
101-
{% set type = columns_type[t_n ~ '.' ~ tab_column[t_n]['COLUMN_NAME'][j]] %}
101+
{% set type = columns_type[t_n ~ '.' ~ tab_column[t_n][j].name] %}
102102
<img src="{{ image(type) }}.png" alt="*">
103-
{{ tab_column[t_n]['COLUMN_NAME'][j] }} : {{ tab_column[t_n]['TYPE'][j] }}
103+
{{ tab_column[t_n][j].name }} : {{ tab_column[t_n][j].type }}
104104
</div>
105105
</td>
106106
{% if has_query %}

src/Database/Designer.php

Lines changed: 50 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
use PhpMyAdmin\Config;
88
use PhpMyAdmin\ConfigStorage\Relation;
9+
use PhpMyAdmin\Database\Designer\ColumnInfo;
910
use PhpMyAdmin\Database\Designer\DesignerTable;
1011
use PhpMyAdmin\DatabaseInterface;
1112
use PhpMyAdmin\Message;
@@ -15,7 +16,6 @@
1516
use stdClass;
1617

1718
use function __;
18-
use function count;
1919
use function intval;
2020
use function is_array;
2121
use function json_decode;
@@ -212,13 +212,13 @@ public function returnClassNamesFromMenuButtons(): array
212212
/**
213213
* Get HTML to display tables on designer page
214214
*
215-
* @param string $db The database name from the request
216-
* @param DesignerTable[] $designerTables The designer tables
217-
* @param mixed[] $tabPos tables positions
218-
* @param int $displayPage page number of the selected page
219-
* @param mixed[] $tabColumn table column info
220-
* @param mixed[] $tablesAllKeys all indices
221-
* @param mixed[] $tablesPkOrUniqueKeys unique or primary indices
215+
* @param string $db The database name from the request
216+
* @param DesignerTable[] $designerTables The designer tables
217+
* @param mixed[] $tabPos tables positions
218+
* @param int $displayPage page number of the selected page
219+
* @param list<ColumnInfo>[] $tableColumnsInfo table column info
220+
* @param mixed[] $tablesAllKeys all indices
221+
* @param mixed[] $tablesPkOrUniqueKeys unique or primary indices
222222
*
223223
* @return string html
224224
*/
@@ -227,38 +227,36 @@ public function getDatabaseTables(
227227
array $designerTables,
228228
array $tabPos,
229229
int $displayPage,
230-
array $tabColumn,
230+
array $tableColumnsInfo,
231231
array $tablesAllKeys,
232232
array $tablesPkOrUniqueKeys,
233233
): string {
234234
$GLOBALS['text_dir'] ??= null;
235235

236236
$columnsType = [];
237-
foreach ($designerTables as $designerTable) {
238-
$tableName = $designerTable->getDbTableString();
239-
$limit = count($tabColumn[$tableName]['COLUMN_ID']);
240-
for ($j = 0; $j < $limit; $j++) {
241-
$tableColumnName = $tableName . '.' . $tabColumn[$tableName]['COLUMN_NAME'][$j];
237+
foreach ($tableColumnsInfo as $tableName => $columnsInfo) {
238+
foreach ($columnsInfo as $columnInfo) {
239+
$tableColumnName = $tableName . '.' . $columnInfo->name;
242240
if (isset($tablesPkOrUniqueKeys[$tableColumnName])) {
243241
$columnsType[$tableColumnName] = 'designer/FieldKey_small';
244242
} else {
245243
$columnsType[$tableColumnName] = 'designer/Field_small';
246244
if (
247-
str_contains($tabColumn[$tableName]['TYPE'][$j], 'char')
248-
|| str_contains($tabColumn[$tableName]['TYPE'][$j], 'text')
245+
str_contains($columnInfo->type, 'char')
246+
|| str_contains($columnInfo->type, 'text')
249247
) {
250248
$columnsType[$tableColumnName] .= '_char';
251249
} elseif (
252-
str_contains($tabColumn[$tableName]['TYPE'][$j], 'int')
253-
|| str_contains($tabColumn[$tableName]['TYPE'][$j], 'float')
254-
|| str_contains($tabColumn[$tableName]['TYPE'][$j], 'double')
255-
|| str_contains($tabColumn[$tableName]['TYPE'][$j], 'decimal')
250+
str_contains($columnInfo->type, 'int')
251+
|| str_contains($columnInfo->type, 'float')
252+
|| str_contains($columnInfo->type, 'double')
253+
|| str_contains($columnInfo->type, 'decimal')
256254
) {
257255
$columnsType[$tableColumnName] .= '_int';
258256
} elseif (
259-
str_contains($tabColumn[$tableName]['TYPE'][$j], 'date')
260-
|| str_contains($tabColumn[$tableName]['TYPE'][$j], 'time')
261-
|| str_contains($tabColumn[$tableName]['TYPE'][$j], 'year')
257+
str_contains($columnInfo->type, 'date')
258+
|| str_contains($columnInfo->type, 'time')
259+
|| str_contains($columnInfo->type, 'year')
262260
) {
263261
$columnsType[$tableColumnName] .= '_date';
264262
}
@@ -273,7 +271,7 @@ public function getDatabaseTables(
273271
'has_query' => isset($_REQUEST['query']),
274272
'tab_pos' => $tabPos,
275273
'display_page' => $displayPage,
276-
'tab_column' => $tabColumn,
274+
'tab_column' => $tableColumnsInfo,
277275
'tables_all_keys' => $tablesAllKeys,
278276
'tables_pk_or_unique_keys' => $tablesPkOrUniqueKeys,
279277
'tables' => $designerTables,
@@ -284,20 +282,20 @@ public function getDatabaseTables(
284282
/**
285283
* Returns HTML for Designer page
286284
*
287-
* @param string $db database in use
288-
* @param string $getDb database in url
289-
* @param DesignerTable[] $designerTables The designer tables
290-
* @param mixed[] $scriptTables array on foreign key support for each table
291-
* @param mixed[] $scriptContr initialization data array
292-
* @param DesignerTable[] $scriptDisplayField displayed tables in designer with their display fields
293-
* @param int $displayPage page number of the selected page
294-
* @param bool $visualBuilderMode whether this is visual query builder
295-
* @param string|null $selectedPage name of the selected page
296-
* @param mixed[] $paramsArray array with class name for various buttons on side menu
297-
* @param mixed[] $tablePositions table positions
298-
* @param mixed[] $tabColumn table column info
299-
* @param mixed[] $tablesAllKeys all indices
300-
* @param mixed[] $tablesPkOrUniqueKeys unique or primary indices
285+
* @param string $db database in use
286+
* @param string $getDb database in url
287+
* @param DesignerTable[] $designerTables The designer tables
288+
* @param mixed[] $scriptTables array on foreign key support for each table
289+
* @param mixed[] $scriptContr initialization data array
290+
* @param DesignerTable[] $scriptDisplayField displayed tables in designer with their display fields
291+
* @param int $displayPage page number of the selected page
292+
* @param bool $visualBuilderMode whether this is visual query builder
293+
* @param string|null $selectedPage name of the selected page
294+
* @param mixed[] $paramsArray array with class name for various buttons on side menu
295+
* @param mixed[] $tablePositions table positions
296+
* @param list<ColumnInfo>[] $tableColumnsInfo table column info
297+
* @param mixed[] $tablesAllKeys all indices
298+
* @param mixed[] $tablesPkOrUniqueKeys unique or primary indices
301299
*
302300
* @return string html
303301
*/
@@ -313,39 +311,37 @@ public function getHtmlForMain(
313311
string|null $selectedPage,
314312
array $paramsArray,
315313
array $tablePositions,
316-
array $tabColumn,
314+
array $tableColumnsInfo,
317315
array $tablesAllKeys,
318316
array $tablesPkOrUniqueKeys,
319317
): string {
320318
$GLOBALS['text_dir'] ??= null;
321319

322320
$relationParameters = $this->relation->getRelationParameters();
323321
$columnsType = [];
324-
foreach ($designerTables as $designerTable) {
325-
$tableName = $designerTable->getDbTableString();
326-
$limit = count($tabColumn[$tableName]['COLUMN_ID']);
327-
for ($j = 0; $j < $limit; $j++) {
328-
$tableColumnName = $tableName . '.' . $tabColumn[$tableName]['COLUMN_NAME'][$j];
322+
foreach ($tableColumnsInfo as $tableName => $columnsInfo) {
323+
foreach ($columnsInfo as $columnInfo) {
324+
$tableColumnName = $tableName . '.' . $columnInfo->name;
329325
if (isset($tablesPkOrUniqueKeys[$tableColumnName])) {
330326
$columnsType[$tableColumnName] = 'designer/FieldKey_small';
331327
} else {
332328
$columnsType[$tableColumnName] = 'designer/Field_small';
333329
if (
334-
str_contains($tabColumn[$tableName]['TYPE'][$j], 'char')
335-
|| str_contains($tabColumn[$tableName]['TYPE'][$j], 'text')
330+
str_contains($columnInfo->type, 'char')
331+
|| str_contains($columnInfo->type, 'text')
336332
) {
337333
$columnsType[$tableColumnName] .= '_char';
338334
} elseif (
339-
str_contains($tabColumn[$tableName]['TYPE'][$j], 'int')
340-
|| str_contains($tabColumn[$tableName]['TYPE'][$j], 'float')
341-
|| str_contains($tabColumn[$tableName]['TYPE'][$j], 'double')
342-
|| str_contains($tabColumn[$tableName]['TYPE'][$j], 'decimal')
335+
str_contains($columnInfo->type, 'int')
336+
|| str_contains($columnInfo->type, 'float')
337+
|| str_contains($columnInfo->type, 'double')
338+
|| str_contains($columnInfo->type, 'decimal')
343339
) {
344340
$columnsType[$tableColumnName] .= '_int';
345341
} elseif (
346-
str_contains($tabColumn[$tableName]['TYPE'][$j], 'date')
347-
|| str_contains($tabColumn[$tableName]['TYPE'][$j], 'time')
348-
|| str_contains($tabColumn[$tableName]['TYPE'][$j], 'year')
342+
str_contains($columnInfo->type, 'date')
343+
|| str_contains($columnInfo->type, 'time')
344+
|| str_contains($columnInfo->type, 'year')
349345
) {
350346
$columnsType[$tableColumnName] .= '_date';
351347
}
@@ -382,7 +378,7 @@ public function getHtmlForMain(
382378
'selected_page' => $selectedPage,
383379
'params_array' => $paramsArray,
384380
'tab_pos' => $tablePositions,
385-
'tab_column' => $tabColumn,
381+
'tab_column' => $tableColumnsInfo,
386382
'tables_all_keys' => $tablesAllKeys,
387383
'tables_pk_or_unique_keys' => $tablesPkOrUniqueKeys,
388384
'designerTables' => $designerTables,

0 commit comments

Comments
 (0)