Merge pull request #17338 from mauriciofauth/display-parts-vo
Create the `PhpMyAdmin\Display\DisplayParts` class
This commit is contained in:
commit
d8b5811b82
110
libraries/classes/Display/DisplayParts.php
Normal file
110
libraries/classes/Display/DisplayParts.php
Normal file
@ -0,0 +1,110 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace PhpMyAdmin\Display;
|
||||
|
||||
/**
|
||||
* @psalm-immutable
|
||||
*/
|
||||
final class DisplayParts
|
||||
{
|
||||
public const NO_DELETE = 0;
|
||||
public const DELETE_ROW = 1;
|
||||
public const KILL_PROCESS = 2;
|
||||
|
||||
/** @var bool */
|
||||
public $hasEditLink;
|
||||
|
||||
/**
|
||||
* @var int
|
||||
* @psalm-var self::NO_DELETE|self::DELETE_ROW|self::KILL_PROCESS
|
||||
*/
|
||||
public $deleteLink;
|
||||
|
||||
/** @var bool */
|
||||
public $hasSortLink;
|
||||
|
||||
/** @var bool */
|
||||
public $hasNavigationBar;
|
||||
|
||||
/** @var bool */
|
||||
public $hasBookmarkForm;
|
||||
|
||||
/** @var bool */
|
||||
public $hasTextButton;
|
||||
|
||||
/** @var bool */
|
||||
public $hasPrintLink;
|
||||
|
||||
/**
|
||||
* @psalm-param self::NO_DELETE|self::DELETE_ROW|self::KILL_PROCESS $deleteLink
|
||||
*/
|
||||
private function __construct(
|
||||
bool $hasEditLink,
|
||||
int $deleteLink,
|
||||
bool $hasSortLink,
|
||||
bool $hasNavigationBar,
|
||||
bool $hasBookmarkForm,
|
||||
bool $hasTextButton,
|
||||
bool $hasPrintLink
|
||||
) {
|
||||
$this->hasEditLink = $hasEditLink;
|
||||
$this->deleteLink = $deleteLink;
|
||||
$this->hasSortLink = $hasSortLink;
|
||||
$this->hasNavigationBar = $hasNavigationBar;
|
||||
$this->hasBookmarkForm = $hasBookmarkForm;
|
||||
$this->hasTextButton = $hasTextButton;
|
||||
$this->hasPrintLink = $hasPrintLink;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array<string, bool|int> $parts
|
||||
* @psalm-param array{
|
||||
* hasEditLink?: bool,
|
||||
* deleteLink?: self::NO_DELETE|self::DELETE_ROW|self::KILL_PROCESS,
|
||||
* hasSortLink?: bool,
|
||||
* hasNavigationBar?: bool,
|
||||
* hasBookmarkForm?: bool,
|
||||
* hasTextButton?: bool,
|
||||
* hasPrintLink?: bool
|
||||
* } $parts
|
||||
*/
|
||||
public static function fromArray(array $parts): self
|
||||
{
|
||||
return new self(
|
||||
$parts['hasEditLink'] ?? false,
|
||||
$parts['deleteLink'] ?? self::NO_DELETE,
|
||||
$parts['hasSortLink'] ?? false,
|
||||
$parts['hasNavigationBar'] ?? false,
|
||||
$parts['hasBookmarkForm'] ?? false,
|
||||
$parts['hasTextButton'] ?? false,
|
||||
$parts['hasPrintLink'] ?? false
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array<string, bool|int> $parts
|
||||
* @psalm-param array{
|
||||
* hasEditLink?: bool,
|
||||
* deleteLink?: self::NO_DELETE|self::DELETE_ROW|self::KILL_PROCESS,
|
||||
* hasSortLink?: bool,
|
||||
* hasNavigationBar?: bool,
|
||||
* hasBookmarkForm?: bool,
|
||||
* hasTextButton?: bool,
|
||||
* hasPrintLink?: bool
|
||||
* } $parts
|
||||
*/
|
||||
public function with(array $parts): self
|
||||
{
|
||||
return new self(
|
||||
$parts['hasEditLink'] ?? $this->hasEditLink,
|
||||
$parts['deleteLink'] ?? $this->deleteLink,
|
||||
$parts['hasSortLink'] ?? $this->hasSortLink,
|
||||
$parts['hasNavigationBar'] ?? $this->hasNavigationBar,
|
||||
$parts['hasBookmarkForm'] ?? $this->hasBookmarkForm,
|
||||
$parts['hasTextButton'] ?? $this->hasTextButton,
|
||||
$parts['hasPrintLink'] ?? $this->hasPrintLink
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -84,12 +84,6 @@ use function trim;
|
||||
*/
|
||||
class Results
|
||||
{
|
||||
// Define constants
|
||||
public const NO_EDIT_OR_DELETE = 'nn';
|
||||
public const UPDATE_ROW = 'ur';
|
||||
public const DELETE_ROW = 'dr';
|
||||
public const KILL_PROCESS = 'kp';
|
||||
|
||||
public const POSITION_LEFT = 'left';
|
||||
public const POSITION_RIGHT = 'right';
|
||||
public const POSITION_BOTH = 'both';
|
||||
@ -451,33 +445,24 @@ class Results
|
||||
|
||||
/**
|
||||
* Defines the parts to display for a print view
|
||||
*
|
||||
* @param array $displayParts the parts to display
|
||||
*
|
||||
* @return array the modified display parts
|
||||
*/
|
||||
private function setDisplayPartsForPrintView(array $displayParts)
|
||||
private function setDisplayPartsForPrintView(DisplayParts $displayParts): DisplayParts
|
||||
{
|
||||
// set all elements to false!
|
||||
$displayParts['edit_lnk'] = self::NO_EDIT_OR_DELETE; // no edit link
|
||||
$displayParts['del_lnk'] = self::NO_EDIT_OR_DELETE; // no delete link
|
||||
$displayParts['sort_lnk'] = '0';
|
||||
$displayParts['nav_bar'] = '0';
|
||||
$displayParts['bkm_form'] = '0';
|
||||
$displayParts['text_btn'] = '0';
|
||||
$displayParts['pview_lnk'] = '0';
|
||||
|
||||
return $displayParts;
|
||||
return $displayParts->with([
|
||||
'hasEditLink' => false,
|
||||
'deleteLink' => DisplayParts::NO_DELETE,
|
||||
'hasSortLink' => false,
|
||||
'hasNavigationBar' => false,
|
||||
'hasBookmarkForm' => false,
|
||||
'hasTextButton' => false,
|
||||
'hasPrintLink' => false,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Defines the parts to display for a SHOW statement
|
||||
*
|
||||
* @param array $displayParts the parts to display
|
||||
*
|
||||
* @return array the modified display parts
|
||||
*/
|
||||
private function setDisplayPartsForShow(array $displayParts)
|
||||
private function setDisplayPartsForShow(DisplayParts $displayParts): DisplayParts
|
||||
{
|
||||
preg_match(
|
||||
'@^SHOW[[:space:]]+(VARIABLES|(FULL[[:space:]]+)?'
|
||||
@ -493,78 +478,51 @@ class Results
|
||||
$bIsProcessList = strpos($str, 'PROCESSLIST') > 0;
|
||||
}
|
||||
|
||||
// no edit link
|
||||
$displayParts['edit_lnk'] = self::NO_EDIT_OR_DELETE;
|
||||
if ($bIsProcessList) {
|
||||
// "kill process" type edit link
|
||||
$displayParts['del_lnk'] = self::KILL_PROCESS;
|
||||
} else {
|
||||
// Default case -> no links
|
||||
// no delete link
|
||||
$displayParts['del_lnk'] = self::NO_EDIT_OR_DELETE;
|
||||
}
|
||||
|
||||
// Other settings
|
||||
$displayParts['sort_lnk'] = '0';
|
||||
$displayParts['nav_bar'] = '0';
|
||||
$displayParts['bkm_form'] = '1';
|
||||
$displayParts['text_btn'] = '1';
|
||||
$displayParts['pview_lnk'] = '1';
|
||||
|
||||
return $displayParts;
|
||||
return $displayParts->with([
|
||||
'hasEditLink' => false,
|
||||
'deleteLink' => $bIsProcessList ? DisplayParts::KILL_PROCESS : DisplayParts::NO_DELETE,
|
||||
'hasSortLink' => false,
|
||||
'hasNavigationBar' => false,
|
||||
'hasBookmarkForm' => true,
|
||||
'hasTextButton' => true,
|
||||
'hasPrintLink' => true,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Defines the parts to display for statements not related to data
|
||||
*
|
||||
* @param array $displayParts the parts to display
|
||||
*
|
||||
* @return array the modified display parts
|
||||
*/
|
||||
private function setDisplayPartsForNonData(array $displayParts)
|
||||
private function setDisplayPartsForNonData(DisplayParts $displayParts): DisplayParts
|
||||
{
|
||||
// Statement is a "SELECT COUNT", a
|
||||
// "CHECK/ANALYZE/REPAIR/OPTIMIZE/CHECKSUM", an "EXPLAIN" one or
|
||||
// contains a "PROC ANALYSE" part
|
||||
$displayParts['edit_lnk'] = self::NO_EDIT_OR_DELETE; // no edit link
|
||||
$displayParts['del_lnk'] = self::NO_EDIT_OR_DELETE; // no delete link
|
||||
$displayParts['sort_lnk'] = '0';
|
||||
$displayParts['nav_bar'] = '0';
|
||||
$displayParts['bkm_form'] = '1';
|
||||
|
||||
if ($this->properties['is_maint']) {
|
||||
$displayParts['text_btn'] = '1';
|
||||
} else {
|
||||
$displayParts['text_btn'] = '0';
|
||||
}
|
||||
|
||||
$displayParts['pview_lnk'] = '1';
|
||||
|
||||
return $displayParts;
|
||||
return $displayParts->with([
|
||||
'hasEditLink' => false,
|
||||
'deleteLink' => DisplayParts::NO_DELETE,
|
||||
'hasSortLink' => false,
|
||||
'hasNavigationBar' => false,
|
||||
'hasBookmarkForm' => true,
|
||||
'hasTextButton' => (bool) $this->properties['is_maint'],
|
||||
'hasPrintLink' => true,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Defines the parts to display for other statements (probably SELECT)
|
||||
*
|
||||
* @param array $displayParts the parts to display
|
||||
*
|
||||
* @return array the modified display parts
|
||||
* Defines the parts to display for other statements (probably SELECT).
|
||||
*/
|
||||
private function setDisplayPartsForSelect(array $displayParts)
|
||||
private function setDisplayPartsForSelect(DisplayParts $displayParts): DisplayParts
|
||||
{
|
||||
// Other statements (ie "SELECT" ones) -> updates
|
||||
// $displayParts['edit_lnk'], $displayParts['del_lnk'] and
|
||||
// $displayParts['text_btn'] (keeps other default values)
|
||||
|
||||
$fieldsMeta = $this->properties['fields_meta'];
|
||||
$previousTable = '';
|
||||
$displayParts['text_btn'] = '1';
|
||||
$numberOfColumns = $this->properties['fields_cnt'];
|
||||
$hasTextButton = true;
|
||||
$hasEditLink = $displayParts->hasEditLink;
|
||||
$deleteLink = $displayParts->deleteLink;
|
||||
$hasPrintLink = $displayParts->hasPrintLink;
|
||||
|
||||
for ($i = 0; $i < $numberOfColumns; $i++) {
|
||||
$isLink = ($displayParts['edit_lnk'] != self::NO_EDIT_OR_DELETE)
|
||||
|| ($displayParts['del_lnk'] != self::NO_EDIT_OR_DELETE)
|
||||
|| ($displayParts['sort_lnk'] != '0');
|
||||
$isLink = $hasEditLink || $deleteLink !== DisplayParts::NO_DELETE || $displayParts->hasSortLink;
|
||||
|
||||
// Displays edit/delete/sort/insert links?
|
||||
if (
|
||||
@ -574,19 +532,13 @@ class Results
|
||||
&& $fieldsMeta[$i]->table != $previousTable
|
||||
) {
|
||||
// don't display links
|
||||
$displayParts['edit_lnk'] = self::NO_EDIT_OR_DELETE;
|
||||
$displayParts['del_lnk'] = self::NO_EDIT_OR_DELETE;
|
||||
/**
|
||||
* @todo May be problematic with same field names
|
||||
* in two joined table.
|
||||
*/
|
||||
if ($displayParts['text_btn'] == '1') {
|
||||
break;
|
||||
}
|
||||
$hasEditLink = false;
|
||||
$deleteLink = DisplayParts::NO_DELETE;
|
||||
break;
|
||||
}
|
||||
|
||||
// Always display print view link
|
||||
$displayParts['pview_lnk'] = '1';
|
||||
$hasPrintLink = true;
|
||||
if ($fieldsMeta[$i]->table == '') {
|
||||
continue;
|
||||
}
|
||||
@ -596,11 +548,16 @@ class Results
|
||||
|
||||
if ($previousTable == '') { // no table for any of the columns
|
||||
// don't display links
|
||||
$displayParts['edit_lnk'] = self::NO_EDIT_OR_DELETE;
|
||||
$displayParts['del_lnk'] = self::NO_EDIT_OR_DELETE;
|
||||
$hasEditLink = false;
|
||||
$deleteLink = DisplayParts::NO_DELETE;
|
||||
}
|
||||
|
||||
return $displayParts;
|
||||
return $displayParts->with([
|
||||
'hasEditLink' => $hasEditLink,
|
||||
'deleteLink' => $deleteLink,
|
||||
'hasTextButton' => $hasTextButton,
|
||||
'hasPrintLink' => $hasPrintLink,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -609,17 +566,14 @@ class Results
|
||||
*
|
||||
* @see getTable()
|
||||
*
|
||||
* @param array $displayParts the parts to display (see a few
|
||||
* lines above for explanations)
|
||||
*
|
||||
* @return array the first element is an array with explicit indexes
|
||||
* for all the display elements
|
||||
* @return array<int, DisplayParts|int|mixed> the first element is a {@see DisplayParts} object
|
||||
* the second element is the total number of rows returned
|
||||
* by the SQL query without any programmatically appended
|
||||
* LIMIT clause (just a copy of $unlim_num_rows if it exists,
|
||||
* else computed inside this function)
|
||||
* @psalm-return array{DisplayParts, int|mixed}
|
||||
*/
|
||||
private function setDisplayPartsAndTotal(array $displayParts)
|
||||
private function setDisplayPartsAndTotal(DisplayParts $displayParts): array
|
||||
{
|
||||
$theTotal = 0;
|
||||
|
||||
@ -649,8 +603,8 @@ class Results
|
||||
if ($unlimNumRows > 0) {
|
||||
$theTotal = $unlimNumRows;
|
||||
} elseif (
|
||||
($displayParts['nav_bar'] == '1')
|
||||
|| ($displayParts['sort_lnk'] == '1')
|
||||
$displayParts->hasNavigationBar
|
||||
|| $displayParts->hasSortLink
|
||||
&& $db !== '' && $table !== ''
|
||||
) {
|
||||
$theTotal = $this->dbi->getTable($db, $table)->countRecords();
|
||||
@ -659,21 +613,23 @@ class Results
|
||||
// if for COUNT query, number of rows returned more than 1
|
||||
// (may be being used GROUP BY)
|
||||
if ($this->properties['is_count'] && $numRows > 1) {
|
||||
$displayParts['nav_bar'] = '1';
|
||||
$displayParts['sort_lnk'] = '1';
|
||||
$displayParts = $displayParts->with([
|
||||
'hasNavigationBar' => true,
|
||||
'hasSortLink' => true,
|
||||
]);
|
||||
}
|
||||
|
||||
// 4. If navigation bar or sorting fields names URLs should be
|
||||
// displayed but there is only one row, change these settings to
|
||||
// false
|
||||
if ($displayParts['nav_bar'] == '1' || $displayParts['sort_lnk'] == '1') {
|
||||
if ($displayParts->hasNavigationBar || $displayParts->hasSortLink) {
|
||||
// - Do not display sort links if less than 2 rows.
|
||||
// - For a VIEW we (probably) did not count the number of rows
|
||||
// so don't test this number here, it would remove the possibility
|
||||
// of sorting VIEW results.
|
||||
$tableObject = new Table($table, $db);
|
||||
if ($unlimNumRows < 2 && ! $tableObject->isView()) {
|
||||
$displayParts['sort_lnk'] = '0';
|
||||
$displayParts = $displayParts->with(['hasSortLink' => false]);
|
||||
}
|
||||
}
|
||||
|
||||
@ -968,7 +924,6 @@ class Results
|
||||
*
|
||||
* @see getTableHeaders()
|
||||
*
|
||||
* @param array $displayParts which elements to display
|
||||
* @param array $analyzedSqlResults analyzed sql results
|
||||
* @param array $sortExpression sort expression
|
||||
* @param array<int, string> $sortExpressionNoDirection sort expression
|
||||
@ -981,7 +936,7 @@ class Results
|
||||
* @return string html content
|
||||
*/
|
||||
private function getTableHeadersForColumns(
|
||||
array $displayParts,
|
||||
bool $hasSortLink,
|
||||
array $analyzedSqlResults,
|
||||
array $sortExpression,
|
||||
array $sortExpressionNoDirection,
|
||||
@ -1029,7 +984,7 @@ class Results
|
||||
$comments = $this->getCommentForRow($commentsMap, $fieldsMeta[$i]);
|
||||
$displayParams = $this->properties['display_params'] ?? [];
|
||||
|
||||
if (($displayParts['sort_lnk'] == '1') && ! $isLimitedDisplay) {
|
||||
if ($hasSortLink && ! $isLimitedDisplay) {
|
||||
$sortedHeaderData = $this->getOrderLinkAndSortedHeaderHtml(
|
||||
$fieldsMeta[$i],
|
||||
$sortExpression,
|
||||
@ -1074,7 +1029,7 @@ class Results
|
||||
}
|
||||
|
||||
return $this->template->render('display/results/table_headers_for_columns', [
|
||||
'is_sortable' => $displayParts['sort_lnk'] == '1' && ! $isLimitedDisplay,
|
||||
'is_sortable' => $hasSortLink && ! $isLimitedDisplay,
|
||||
'columns' => $columns,
|
||||
]);
|
||||
}
|
||||
@ -1084,7 +1039,6 @@ class Results
|
||||
*
|
||||
* @see getTable()
|
||||
*
|
||||
* @param array $displayParts which elements to display
|
||||
* @param array $analyzedSqlResults analyzed sql results
|
||||
* @param string $unsortedSqlQuery the unsorted sql query
|
||||
* @param array $sortExpression sort expression
|
||||
@ -1102,7 +1056,7 @@ class Results
|
||||
* }
|
||||
*/
|
||||
private function getTableHeaders(
|
||||
array $displayParts,
|
||||
DisplayParts $displayParts,
|
||||
array $analyzedSqlResults,
|
||||
$unsortedSqlQuery,
|
||||
array $sortExpression = [],
|
||||
@ -1136,8 +1090,8 @@ class Results
|
||||
|
||||
// 1. Set $colspan and generate html with full/partial
|
||||
// text button or link
|
||||
$colspan = $displayParts['edit_lnk'] != self::NO_EDIT_OR_DELETE
|
||||
&& $displayParts['del_lnk'] != self::NO_EDIT_OR_DELETE ? ' colspan="4"' : '';
|
||||
$colspan = $displayParts->hasEditLink
|
||||
&& $displayParts->deleteLink !== DisplayParts::NO_DELETE ? ' colspan="4"' : '';
|
||||
$buttonHtml = $this->getFieldVisibilityParams($displayParts, $fullOrPartialTextLink, $colspan);
|
||||
|
||||
// 2. Displays the fields' name
|
||||
@ -1150,7 +1104,7 @@ class Results
|
||||
|
||||
// Get the headers for all of the columns
|
||||
$tableHeadersForColumns = $this->getTableHeadersForColumns(
|
||||
$displayParts,
|
||||
$displayParts->hasSortLink,
|
||||
$analyzedSqlResults,
|
||||
$sortExpression,
|
||||
$sortExpressionNoDirection,
|
||||
@ -1168,8 +1122,8 @@ class Results
|
||||
return [
|
||||
'column_order' => $columnOrder,
|
||||
'options' => $optionsBlock,
|
||||
'has_bulk_actions_form' => $displayParts['del_lnk'] === self::DELETE_ROW
|
||||
|| $displayParts['del_lnk'] === self::KILL_PROCESS,
|
||||
'has_bulk_actions_form' => $displayParts->deleteLink === DisplayParts::DELETE_ROW
|
||||
|| $displayParts->deleteLink === DisplayParts::KILL_PROCESS,
|
||||
'button' => $buttonHtml,
|
||||
'table_headers_for_columns' => $tableHeadersForColumns,
|
||||
'column_at_right_side' => $columnAtRightSide,
|
||||
@ -1270,14 +1224,13 @@ class Results
|
||||
*
|
||||
* @see getTableHeaders()
|
||||
*
|
||||
* @param array $displayParts which elements to display
|
||||
* @param string $fullOrPartialTextLink full/partial link or text button
|
||||
* @param string $colspan column span of table header
|
||||
*
|
||||
* @return string html with full/partial text button or link
|
||||
*/
|
||||
private function getFieldVisibilityParams(
|
||||
array $displayParts,
|
||||
DisplayParts $displayParts,
|
||||
string $fullOrPartialTextLink,
|
||||
string $colspan
|
||||
) {
|
||||
@ -1286,20 +1239,19 @@ class Results
|
||||
// 1. Displays the full/partial text button (part 1)...
|
||||
$buttonHtml = '<thead class="table-light"><tr>' . "\n";
|
||||
|
||||
$emptyPreCondition = $displayParts['edit_lnk'] != self::NO_EDIT_OR_DELETE
|
||||
&& $displayParts['del_lnk'] != self::NO_EDIT_OR_DELETE;
|
||||
$emptyPreCondition = $displayParts->hasEditLink && $displayParts->deleteLink !== DisplayParts::NO_DELETE;
|
||||
|
||||
$leftOrBoth = $GLOBALS['cfg']['RowActionLinks'] === self::POSITION_LEFT
|
||||
|| $GLOBALS['cfg']['RowActionLinks'] === self::POSITION_BOTH;
|
||||
|
||||
// ... before the result table
|
||||
if (
|
||||
($displayParts['edit_lnk'] === self::NO_EDIT_OR_DELETE)
|
||||
&& ($displayParts['del_lnk'] === self::NO_EDIT_OR_DELETE)
|
||||
&& ($displayParts['text_btn'] == '1')
|
||||
! $displayParts->hasEditLink
|
||||
&& $displayParts->deleteLink === DisplayParts::NO_DELETE
|
||||
&& $displayParts->hasTextButton
|
||||
) {
|
||||
$displayParams['emptypre'] = $emptyPreCondition ? 4 : 0;
|
||||
} elseif ($leftOrBoth && ($displayParts['text_btn'] == '1')) {
|
||||
$displayParams['emptypre'] = 0;
|
||||
} elseif ($leftOrBoth && $displayParts->hasTextButton) {
|
||||
// ... at the left column of the result table header if possible
|
||||
// and required
|
||||
|
||||
@ -1309,8 +1261,7 @@ class Results
|
||||
. '>' . $fullOrPartialTextLink . '</th>';
|
||||
} elseif (
|
||||
$leftOrBoth
|
||||
&& (($displayParts['edit_lnk'] != self::NO_EDIT_OR_DELETE)
|
||||
|| ($displayParts['del_lnk'] != self::NO_EDIT_OR_DELETE))
|
||||
&& ($displayParts->hasEditLink || $displayParts->deleteLink !== DisplayParts::NO_DELETE)
|
||||
) {
|
||||
// ... elseif no button, displays empty(ies) col(s) if required
|
||||
|
||||
@ -1945,14 +1896,13 @@ class Results
|
||||
*
|
||||
* @see getTableHeaders()
|
||||
*
|
||||
* @param array $displayParts which elements to display
|
||||
* @param string $fullOrPartialTextLink full/partial link or text button
|
||||
* @param string $colspan column span of table header
|
||||
*
|
||||
* @return string html content
|
||||
*/
|
||||
private function getColumnAtRightSide(
|
||||
array $displayParts,
|
||||
DisplayParts $displayParts,
|
||||
string $fullOrPartialTextLink,
|
||||
string $colspan
|
||||
) {
|
||||
@ -1964,12 +1914,11 @@ class Results
|
||||
if (
|
||||
($GLOBALS['cfg']['RowActionLinks'] === self::POSITION_RIGHT)
|
||||
|| ($GLOBALS['cfg']['RowActionLinks'] === self::POSITION_BOTH)
|
||||
&& (($displayParts['edit_lnk'] != self::NO_EDIT_OR_DELETE)
|
||||
|| ($displayParts['del_lnk'] != self::NO_EDIT_OR_DELETE))
|
||||
&& ($displayParts['text_btn'] == '1')
|
||||
&& ($displayParts->hasEditLink || $displayParts->deleteLink !== DisplayParts::NO_DELETE)
|
||||
&& $displayParts->hasTextButton
|
||||
) {
|
||||
$displayParams['emptyafter'] = ($displayParts['edit_lnk'] != self::NO_EDIT_OR_DELETE)
|
||||
&& ($displayParts['del_lnk'] != self::NO_EDIT_OR_DELETE) ? 4 : 1;
|
||||
$displayParams['emptyafter'] = $displayParts->hasEditLink
|
||||
&& $displayParts->deleteLink !== DisplayParts::NO_DELETE ? 4 : 1;
|
||||
|
||||
$rightColumnHtml .= "\n"
|
||||
. '<th class="column_action d-print-none"' . $colspan . '>'
|
||||
@ -1978,15 +1927,15 @@ class Results
|
||||
} elseif (
|
||||
($GLOBALS['cfg']['RowActionLinks'] === self::POSITION_LEFT)
|
||||
|| ($GLOBALS['cfg']['RowActionLinks'] === self::POSITION_BOTH)
|
||||
&& (($displayParts['edit_lnk'] === self::NO_EDIT_OR_DELETE)
|
||||
&& ($displayParts['del_lnk'] === self::NO_EDIT_OR_DELETE))
|
||||
&& (! $displayParts->hasEditLink
|
||||
&& $displayParts->deleteLink === DisplayParts::NO_DELETE)
|
||||
&& (! isset($GLOBALS['is_header_sent']) || ! $GLOBALS['is_header_sent'])
|
||||
) {
|
||||
// ... elseif no button, displays empty columns if required
|
||||
// (unless coming from Browse mode print view)
|
||||
|
||||
$displayParams['emptyafter'] = ($displayParts['edit_lnk'] != self::NO_EDIT_OR_DELETE)
|
||||
&& ($displayParts['del_lnk'] != self::NO_EDIT_OR_DELETE) ? 4 : 1;
|
||||
$displayParams['emptyafter'] = $displayParts->hasEditLink
|
||||
&& $displayParts->deleteLink !== DisplayParts::NO_DELETE ? 4 : 1;
|
||||
|
||||
$rightColumnHtml .= "\n" . '<td class="d-print-none"' . $colspan
|
||||
. '></td>';
|
||||
@ -2135,7 +2084,6 @@ class Results
|
||||
*
|
||||
* @param ResultInterface $dtResult the link id associated to the query
|
||||
* which results have to be displayed
|
||||
* @param array $displayParts which elements to display
|
||||
* @param array<string, string[]> $map the list of relations
|
||||
* @param array $analyzedSqlResults analyzed sql results
|
||||
* @param bool $isLimitedDisplay with limited operations or not
|
||||
@ -2146,7 +2094,7 @@ class Results
|
||||
*/
|
||||
private function getTableBody(
|
||||
ResultInterface $dtResult,
|
||||
array $displayParts,
|
||||
DisplayParts $displayParts,
|
||||
array $map,
|
||||
array $analyzedSqlResults,
|
||||
$isLimitedDisplay = false
|
||||
@ -2248,8 +2196,8 @@ class Results
|
||||
// 1.2 Defines the URLs for the modify/delete link(s)
|
||||
|
||||
if (
|
||||
($displayParts['edit_lnk'] != self::NO_EDIT_OR_DELETE)
|
||||
|| ($displayParts['del_lnk'] != self::NO_EDIT_OR_DELETE)
|
||||
$displayParts->hasEditLink
|
||||
|| ($displayParts->deleteLink !== DisplayParts::NO_DELETE)
|
||||
) {
|
||||
$expressions = [];
|
||||
|
||||
@ -2279,7 +2227,7 @@ class Results
|
||||
$this->properties['whereClauseMap'] = $whereClauseMap;
|
||||
|
||||
// 1.2.1 Modify link(s) - update row case
|
||||
if ($displayParts['edit_lnk'] === self::UPDATE_ROW) {
|
||||
if ($displayParts->hasEditLink) {
|
||||
[
|
||||
$editUrl,
|
||||
$copyUrl,
|
||||
@ -2294,7 +2242,7 @@ class Results
|
||||
$whereClause,
|
||||
$clauseIsUnique,
|
||||
$urlSqlQuery,
|
||||
$displayParts['del_lnk'],
|
||||
$displayParts->deleteLink,
|
||||
(int) $row[0]
|
||||
);
|
||||
|
||||
@ -2305,7 +2253,7 @@ class Results
|
||||
) {
|
||||
$tableBodyHtml .= $this->template->render('display/results/checkbox_and_links', [
|
||||
'position' => self::POSITION_LEFT,
|
||||
'has_checkbox' => $deleteUrl && $displayParts['del_lnk'] !== self::KILL_PROCESS,
|
||||
'has_checkbox' => $deleteUrl && $displayParts->deleteLink !== DisplayParts::KILL_PROCESS,
|
||||
'edit' => [
|
||||
'url' => $editUrl,
|
||||
'params' => $editCopyUrlParams + ['default_action' => 'update'],
|
||||
@ -2327,7 +2275,7 @@ class Results
|
||||
} elseif ($GLOBALS['cfg']['RowActionLinks'] === self::POSITION_NONE) {
|
||||
$tableBodyHtml .= $this->template->render('display/results/checkbox_and_links', [
|
||||
'position' => self::POSITION_NONE,
|
||||
'has_checkbox' => $deleteUrl && $displayParts['del_lnk'] !== self::KILL_PROCESS,
|
||||
'has_checkbox' => $deleteUrl && $displayParts->deleteLink !== DisplayParts::KILL_PROCESS,
|
||||
'edit' => [
|
||||
'url' => $editUrl,
|
||||
'params' => $editCopyUrlParams + ['default_action' => 'update'],
|
||||
@ -2367,14 +2315,14 @@ class Results
|
||||
|
||||
// 3. Displays the modify/delete links on the right if required
|
||||
if (
|
||||
($displayParts['edit_lnk'] != self::NO_EDIT_OR_DELETE
|
||||
|| $displayParts['del_lnk'] != self::NO_EDIT_OR_DELETE)
|
||||
($displayParts->hasEditLink
|
||||
|| $displayParts->deleteLink !== DisplayParts::NO_DELETE)
|
||||
&& ($GLOBALS['cfg']['RowActionLinks'] === self::POSITION_RIGHT
|
||||
|| $GLOBALS['cfg']['RowActionLinks'] === self::POSITION_BOTH)
|
||||
) {
|
||||
$tableBodyHtml .= $this->template->render('display/results/checkbox_and_links', [
|
||||
'position' => self::POSITION_RIGHT,
|
||||
'has_checkbox' => $deleteUrl && $displayParts['del_lnk'] !== self::KILL_PROCESS,
|
||||
'has_checkbox' => $deleteUrl && $displayParts->deleteLink !== DisplayParts::KILL_PROCESS,
|
||||
'edit' => [
|
||||
'url' => $editUrl,
|
||||
'params' => $editCopyUrlParams + ['default_action' => 'update'],
|
||||
@ -2988,8 +2936,8 @@ class Results
|
||||
* @param string $whereClause the where clause of the sql
|
||||
* @param bool $clauseIsUnique the unique condition of clause
|
||||
* @param string $urlSqlQuery the analyzed sql query
|
||||
* @param string $deleteLink the delete link of current row
|
||||
* @param int $processId Process ID
|
||||
* @psalm-param DisplayParts::NO_DELETE|DisplayParts::DELETE_ROW|DisplayParts::KILL_PROCESS $deleteLink
|
||||
*
|
||||
* @return array $del_url, $del_str, $js_conf
|
||||
* @psalm-return array{?string, ?string, ?string}
|
||||
@ -2998,12 +2946,12 @@ class Results
|
||||
$whereClause,
|
||||
$clauseIsUnique,
|
||||
$urlSqlQuery,
|
||||
$deleteLink,
|
||||
int $deleteLink,
|
||||
int $processId
|
||||
) {
|
||||
$goto = $this->properties['goto'];
|
||||
|
||||
if ($deleteLink === self::DELETE_ROW) { // delete row case
|
||||
if ($deleteLink === DisplayParts::DELETE_ROW) { // delete row case
|
||||
$urlParams = [
|
||||
'db' => $this->properties['db'],
|
||||
'table' => $this->properties['table'],
|
||||
@ -3033,7 +2981,7 @@ class Results
|
||||
. ($clauseIsUnique ? '' : ' LIMIT 1');
|
||||
|
||||
$deleteString = $this->getActionLinkContent('b_drop', __('Delete'));
|
||||
} elseif ($deleteLink === self::KILL_PROCESS) { // kill process case
|
||||
} elseif ($deleteLink === DisplayParts::KILL_PROCESS) { // kill process case
|
||||
$urlParams = [
|
||||
'db' => $this->properties['db'],
|
||||
'table' => $this->properties['table'],
|
||||
@ -3579,7 +3527,6 @@ class Results
|
||||
*
|
||||
* @param ResultInterface $dtResult the link id associated to the query
|
||||
* which results have to be displayed
|
||||
* @param array $displayParts the parts to display
|
||||
* @param array $analyzedSqlResults analyzed sql results
|
||||
* @param bool $isLimitedDisplay With limited operations or not
|
||||
*
|
||||
@ -3587,7 +3534,7 @@ class Results
|
||||
*/
|
||||
public function getTable(
|
||||
ResultInterface $dtResult,
|
||||
array &$displayParts,
|
||||
DisplayParts $displayParts,
|
||||
array $analyzedSqlResults,
|
||||
$isLimitedDisplay = false
|
||||
) {
|
||||
@ -3637,7 +3584,7 @@ class Results
|
||||
// 1.2 Defines offsets for the next and previous pages
|
||||
$posNext = 0;
|
||||
$posPrev = 0;
|
||||
if ($displayParts['nav_bar'] == '1') {
|
||||
if ($displayParts->hasNavigationBar) {
|
||||
[$posNext, $posPrev] = $this->getOffsets();
|
||||
}
|
||||
|
||||
@ -3672,7 +3619,7 @@ class Results
|
||||
|
||||
// 2.1 Prepares a messages with position information
|
||||
$sqlQueryMessage = '';
|
||||
if ($displayParts['nav_bar'] == '1') {
|
||||
if ($displayParts->hasNavigationBar) {
|
||||
$message = $this->setMessageInformation(
|
||||
$sortedColumnMessage,
|
||||
$analyzedSqlResults,
|
||||
@ -3702,7 +3649,7 @@ class Results
|
||||
$unsortedSqlQuery = '';
|
||||
$sortByKeyData = [];
|
||||
// can the result be sorted?
|
||||
if ($displayParts['sort_lnk'] == '1' && isset($analyzedSqlResults['statement'])) {
|
||||
if ($displayParts->hasSortLink && isset($analyzedSqlResults['statement'])) {
|
||||
$unsortedSqlQuery = Query::replaceClause(
|
||||
$analyzedSqlResults['statement'],
|
||||
$analyzedSqlResults['parser']->list,
|
||||
@ -3720,7 +3667,7 @@ class Results
|
||||
}
|
||||
|
||||
$navigation = [];
|
||||
if ($displayParts['nav_bar'] == '1' && $statement !== null && empty($statement->limit)) {
|
||||
if ($displayParts->hasNavigationBar && $statement !== null && empty($statement->limit)) {
|
||||
$navigation = $this->getTableNavigation($posNext, $posPrev, $isInnodb, $sortByKeyData);
|
||||
}
|
||||
|
||||
@ -3764,12 +3711,12 @@ class Results
|
||||
$this->properties['display_params'] = null;
|
||||
|
||||
// 4. ----- Prepares the link for multi-fields edit and delete
|
||||
$bulkLinks = $this->getBulkLinks($dtResult, $analyzedSqlResults, $displayParts['del_lnk']);
|
||||
$bulkLinks = $this->getBulkLinks($dtResult, $analyzedSqlResults, $displayParts->deleteLink);
|
||||
|
||||
// 5. ----- Prepare "Query results operations"
|
||||
$operations = [];
|
||||
if (($printView === null || $printView != '1') && ! $isLimitedDisplay) {
|
||||
$operations = $this->getResultsOperations($displayParts['pview_lnk'], $analyzedSqlResults);
|
||||
$operations = $this->getResultsOperations($displayParts->hasPrintLink, $analyzedSqlResults);
|
||||
}
|
||||
|
||||
$relationParameters = $this->relation->getRelationParameters();
|
||||
@ -4090,16 +4037,16 @@ class Results
|
||||
* @param ResultInterface $dtResult the link id associated to the query which
|
||||
* results have to be displayed
|
||||
* @param array $analyzedSqlResults analyzed sql results
|
||||
* @param string $deleteLink the display element - 'del_link'
|
||||
* @psalm-param DisplayParts::NO_DELETE|DisplayParts::DELETE_ROW|DisplayParts::KILL_PROCESS $deleteLink
|
||||
*
|
||||
* @psalm-return array{has_export_button:bool, clause_is_unique:mixed}|array<empty, empty>
|
||||
*/
|
||||
private function getBulkLinks(
|
||||
ResultInterface $dtResult,
|
||||
array $analyzedSqlResults,
|
||||
$deleteLink
|
||||
int $deleteLink
|
||||
): array {
|
||||
if ($deleteLink !== self::DELETE_ROW) {
|
||||
if ($deleteLink !== DisplayParts::DELETE_ROW) {
|
||||
return [];
|
||||
}
|
||||
|
||||
@ -4140,8 +4087,7 @@ class Results
|
||||
*
|
||||
* @see getTable()
|
||||
*
|
||||
* @param string $printLink the parts to display
|
||||
* @param array $analyzedSqlResults analyzed sql results
|
||||
* @param array $analyzedSqlResults analyzed sql results
|
||||
*
|
||||
* @psalm-return array{
|
||||
* has_export_link: bool,
|
||||
@ -4160,7 +4106,7 @@ class Results
|
||||
* }
|
||||
*/
|
||||
private function getResultsOperations(
|
||||
string $printLink,
|
||||
bool $hasPrintLink,
|
||||
array $analyzedSqlResults
|
||||
): array {
|
||||
$urlParams = [
|
||||
@ -4218,7 +4164,7 @@ class Results
|
||||
return [
|
||||
'has_procedure' => ! empty($analyzedSqlResults['procedure']),
|
||||
'has_geometry' => $geometryFound,
|
||||
'has_print_link' => $printLink == '1',
|
||||
'has_print_link' => $hasPrintLink,
|
||||
'has_export_link' => $analyzedSqlResults['querytype'] === self::QUERY_TYPE_SELECT,
|
||||
'url_params' => $urlParams,
|
||||
];
|
||||
|
||||
@ -8,6 +8,7 @@ use PhpMyAdmin\ConfigStorage\Features\BookmarkFeature;
|
||||
use PhpMyAdmin\ConfigStorage\Relation;
|
||||
use PhpMyAdmin\ConfigStorage\RelationCleanup;
|
||||
use PhpMyAdmin\Dbal\ResultInterface;
|
||||
use PhpMyAdmin\Display\DisplayParts;
|
||||
use PhpMyAdmin\Display\Results as DisplayResults;
|
||||
use PhpMyAdmin\Html\Generator;
|
||||
use PhpMyAdmin\Html\MySQLDocumentation;
|
||||
@ -1059,15 +1060,15 @@ class Sql
|
||||
return $queryMessage;
|
||||
}
|
||||
|
||||
$displayParts = [
|
||||
'edit_lnk' => null,
|
||||
'del_lnk' => null,
|
||||
'sort_lnk' => '1',
|
||||
'nav_bar' => '0',
|
||||
'bkm_form' => '1',
|
||||
'text_btn' => '1',
|
||||
'pview_lnk' => '1',
|
||||
];
|
||||
$displayParts = DisplayParts::fromArray([
|
||||
'hasEditLink' => false,
|
||||
'deleteLink' => DisplayParts::NO_DELETE,
|
||||
'hasSortLink' => true,
|
||||
'hasNavigationBar' => false,
|
||||
'hasBookmarkForm' => true,
|
||||
'hasTextButton' => true,
|
||||
'hasPrintLink' => true,
|
||||
]);
|
||||
|
||||
$sqlQueryResultsTable = $this->getHtmlForSqlQueryResultsTable(
|
||||
$displayResultsObject,
|
||||
@ -1164,7 +1165,6 @@ class Sql
|
||||
* Function to get html for the sql query results table
|
||||
*
|
||||
* @param DisplayResults $displayResultsObject instance of DisplayResult
|
||||
* @param array $displayParts the parts to display
|
||||
* @param bool $editable whether the result table is
|
||||
* editable or not
|
||||
* @param int|string $unlimNumRows unlimited number of rows
|
||||
@ -1178,7 +1178,7 @@ class Sql
|
||||
*/
|
||||
private function getHtmlForSqlQueryResultsTable(
|
||||
$displayResultsObject,
|
||||
array $displayParts,
|
||||
DisplayParts $displayParts,
|
||||
$editable,
|
||||
$unlimNumRows,
|
||||
$numRows,
|
||||
@ -1228,15 +1228,15 @@ class Sql
|
||||
$isBrowseDistinct
|
||||
);
|
||||
|
||||
$displayParts = [
|
||||
'edit_lnk' => $displayResultsObject::NO_EDIT_OR_DELETE,
|
||||
'del_lnk' => $displayResultsObject::NO_EDIT_OR_DELETE,
|
||||
'sort_lnk' => '1',
|
||||
'nav_bar' => '1',
|
||||
'bkm_form' => '1',
|
||||
'text_btn' => '1',
|
||||
'pview_lnk' => '1',
|
||||
];
|
||||
$displayParts = DisplayParts::fromArray([
|
||||
'hasEditLink' => false,
|
||||
'deleteLink' => DisplayParts::NO_DELETE,
|
||||
'hasSortLink' => true,
|
||||
'hasNavigationBar' => true,
|
||||
'hasBookmarkForm' => true,
|
||||
'hasTextButton' => true,
|
||||
'hasPrintLink' => true,
|
||||
]);
|
||||
|
||||
$tableHtml .= $displayResultsObject->getTable(
|
||||
$result,
|
||||
@ -1458,38 +1458,38 @@ class Sql
|
||||
|
||||
$_SESSION['tmpval']['possible_as_geometry'] = $editable;
|
||||
|
||||
$displayParts = [
|
||||
'edit_lnk' => $displayResultsObject::UPDATE_ROW,
|
||||
'del_lnk' => $displayResultsObject::DELETE_ROW,
|
||||
'sort_lnk' => '1',
|
||||
'nav_bar' => '1',
|
||||
'bkm_form' => '1',
|
||||
'text_btn' => '0',
|
||||
'pview_lnk' => '1',
|
||||
];
|
||||
$displayParts = DisplayParts::fromArray([
|
||||
'hasEditLink' => true,
|
||||
'deleteLink' => DisplayParts::DELETE_ROW,
|
||||
'hasSortLink' => true,
|
||||
'hasNavigationBar' => true,
|
||||
'hasBookmarkForm' => true,
|
||||
'hasTextButton' => false,
|
||||
'hasPrintLink' => true,
|
||||
]);
|
||||
|
||||
if (Utilities::isSystemSchema($db) || ! $editable) {
|
||||
$displayParts = [
|
||||
'edit_lnk' => $displayResultsObject::NO_EDIT_OR_DELETE,
|
||||
'del_lnk' => $displayResultsObject::NO_EDIT_OR_DELETE,
|
||||
'sort_lnk' => '1',
|
||||
'nav_bar' => '1',
|
||||
'bkm_form' => '1',
|
||||
'text_btn' => '1',
|
||||
'pview_lnk' => '1',
|
||||
];
|
||||
$displayParts = DisplayParts::fromArray([
|
||||
'hasEditLink' => false,
|
||||
'deleteLink' => DisplayParts::NO_DELETE,
|
||||
'hasSortLink' => true,
|
||||
'hasNavigationBar' => true,
|
||||
'hasBookmarkForm' => true,
|
||||
'hasTextButton' => true,
|
||||
'hasPrintLink' => true,
|
||||
]);
|
||||
}
|
||||
|
||||
if (isset($_POST['printview']) && $_POST['printview'] == '1') {
|
||||
$displayParts = [
|
||||
'edit_lnk' => $displayResultsObject::NO_EDIT_OR_DELETE,
|
||||
'del_lnk' => $displayResultsObject::NO_EDIT_OR_DELETE,
|
||||
'sort_lnk' => '0',
|
||||
'nav_bar' => '0',
|
||||
'bkm_form' => '0',
|
||||
'text_btn' => '0',
|
||||
'pview_lnk' => '0',
|
||||
];
|
||||
$displayParts = DisplayParts::fromArray([
|
||||
'hasEditLink' => false,
|
||||
'deleteLink' => DisplayParts::NO_DELETE,
|
||||
'hasSortLink' => false,
|
||||
'hasNavigationBar' => false,
|
||||
'hasBookmarkForm' => false,
|
||||
'hasTextButton' => false,
|
||||
'hasPrintLink' => false,
|
||||
]);
|
||||
}
|
||||
|
||||
if (! isset($_POST['printview']) || $_POST['printview'] != '1') {
|
||||
@ -1534,7 +1534,7 @@ class Sql
|
||||
$bookmarkFeature = $this->relation->getRelationParameters()->bookmarkFeature;
|
||||
if (
|
||||
$bookmarkFeature !== null
|
||||
&& $displayParts['bkm_form'] == '1'
|
||||
&& $displayParts->hasBookmarkForm
|
||||
&& empty($_GET['id_bookmark'])
|
||||
&& $sqlQuery
|
||||
) {
|
||||
|
||||
@ -2875,11 +2875,6 @@ parameters:
|
||||
count: 1
|
||||
path: libraries/classes/Display/Results.php
|
||||
|
||||
-
|
||||
message: "#^Method PhpMyAdmin\\\\Display\\\\Results\\:\\:getColumnAtRightSide\\(\\) has parameter \\$displayParts with no value type specified in iterable type array\\.$#"
|
||||
count: 1
|
||||
path: libraries/classes/Display/Results.php
|
||||
|
||||
-
|
||||
message: "#^Method PhpMyAdmin\\\\Display\\\\Results\\:\\:getColumnParams\\(\\) has parameter \\$analyzedSqlResults with no value type specified in iterable type array\\.$#"
|
||||
count: 1
|
||||
@ -2940,11 +2935,6 @@ parameters:
|
||||
count: 1
|
||||
path: libraries/classes/Display/Results.php
|
||||
|
||||
-
|
||||
message: "#^Method PhpMyAdmin\\\\Display\\\\Results\\:\\:getFieldVisibilityParams\\(\\) has parameter \\$displayParts with no value type specified in iterable type array\\.$#"
|
||||
count: 1
|
||||
path: libraries/classes/Display/Results.php
|
||||
|
||||
-
|
||||
message: "#^Method PhpMyAdmin\\\\Display\\\\Results\\:\\:getOptionsBlock\\(\\) return type has no value type specified in iterable type array\\.$#"
|
||||
count: 1
|
||||
@ -3035,21 +3025,11 @@ parameters:
|
||||
count: 1
|
||||
path: libraries/classes/Display/Results.php
|
||||
|
||||
-
|
||||
message: "#^Method PhpMyAdmin\\\\Display\\\\Results\\:\\:getTable\\(\\) has parameter \\$displayParts with no value type specified in iterable type array\\.$#"
|
||||
count: 1
|
||||
path: libraries/classes/Display/Results.php
|
||||
|
||||
-
|
||||
message: "#^Method PhpMyAdmin\\\\Display\\\\Results\\:\\:getTableBody\\(\\) has parameter \\$analyzedSqlResults with no value type specified in iterable type array\\.$#"
|
||||
count: 1
|
||||
path: libraries/classes/Display/Results.php
|
||||
|
||||
-
|
||||
message: "#^Method PhpMyAdmin\\\\Display\\\\Results\\:\\:getTableBody\\(\\) has parameter \\$displayParts with no value type specified in iterable type array\\.$#"
|
||||
count: 1
|
||||
path: libraries/classes/Display/Results.php
|
||||
|
||||
-
|
||||
message: "#^Method PhpMyAdmin\\\\Display\\\\Results\\:\\:getTableCommentsArray\\(\\) has parameter \\$analyzedSqlResults with no value type specified in iterable type array\\.$#"
|
||||
count: 1
|
||||
@ -3065,11 +3045,6 @@ parameters:
|
||||
count: 1
|
||||
path: libraries/classes/Display/Results.php
|
||||
|
||||
-
|
||||
message: "#^Method PhpMyAdmin\\\\Display\\\\Results\\:\\:getTableHeaders\\(\\) has parameter \\$displayParts with no value type specified in iterable type array\\.$#"
|
||||
count: 1
|
||||
path: libraries/classes/Display/Results.php
|
||||
|
||||
-
|
||||
message: "#^Method PhpMyAdmin\\\\Display\\\\Results\\:\\:getTableHeaders\\(\\) has parameter \\$sortDirection with no value type specified in iterable type array\\.$#"
|
||||
count: 1
|
||||
@ -3090,11 +3065,6 @@ parameters:
|
||||
count: 1
|
||||
path: libraries/classes/Display/Results.php
|
||||
|
||||
-
|
||||
message: "#^Method PhpMyAdmin\\\\Display\\\\Results\\:\\:getTableHeadersForColumns\\(\\) has parameter \\$displayParts with no value type specified in iterable type array\\.$#"
|
||||
count: 1
|
||||
path: libraries/classes/Display/Results.php
|
||||
|
||||
-
|
||||
message: "#^Method PhpMyAdmin\\\\Display\\\\Results\\:\\:getTableHeadersForColumns\\(\\) has parameter \\$sortDirection with no value type specified in iterable type array\\.$#"
|
||||
count: 1
|
||||
@ -3145,56 +3115,6 @@ parameters:
|
||||
count: 1
|
||||
path: libraries/classes/Display/Results.php
|
||||
|
||||
-
|
||||
message: "#^Method PhpMyAdmin\\\\Display\\\\Results\\:\\:setDisplayPartsAndTotal\\(\\) has parameter \\$displayParts with no value type specified in iterable type array\\.$#"
|
||||
count: 1
|
||||
path: libraries/classes/Display/Results.php
|
||||
|
||||
-
|
||||
message: "#^Method PhpMyAdmin\\\\Display\\\\Results\\:\\:setDisplayPartsAndTotal\\(\\) return type has no value type specified in iterable type array\\.$#"
|
||||
count: 1
|
||||
path: libraries/classes/Display/Results.php
|
||||
|
||||
-
|
||||
message: "#^Method PhpMyAdmin\\\\Display\\\\Results\\:\\:setDisplayPartsForNonData\\(\\) has parameter \\$displayParts with no value type specified in iterable type array\\.$#"
|
||||
count: 1
|
||||
path: libraries/classes/Display/Results.php
|
||||
|
||||
-
|
||||
message: "#^Method PhpMyAdmin\\\\Display\\\\Results\\:\\:setDisplayPartsForNonData\\(\\) return type has no value type specified in iterable type array\\.$#"
|
||||
count: 1
|
||||
path: libraries/classes/Display/Results.php
|
||||
|
||||
-
|
||||
message: "#^Method PhpMyAdmin\\\\Display\\\\Results\\:\\:setDisplayPartsForPrintView\\(\\) has parameter \\$displayParts with no value type specified in iterable type array\\.$#"
|
||||
count: 1
|
||||
path: libraries/classes/Display/Results.php
|
||||
|
||||
-
|
||||
message: "#^Method PhpMyAdmin\\\\Display\\\\Results\\:\\:setDisplayPartsForPrintView\\(\\) return type has no value type specified in iterable type array\\.$#"
|
||||
count: 1
|
||||
path: libraries/classes/Display/Results.php
|
||||
|
||||
-
|
||||
message: "#^Method PhpMyAdmin\\\\Display\\\\Results\\:\\:setDisplayPartsForSelect\\(\\) has parameter \\$displayParts with no value type specified in iterable type array\\.$#"
|
||||
count: 1
|
||||
path: libraries/classes/Display/Results.php
|
||||
|
||||
-
|
||||
message: "#^Method PhpMyAdmin\\\\Display\\\\Results\\:\\:setDisplayPartsForSelect\\(\\) return type has no value type specified in iterable type array\\.$#"
|
||||
count: 1
|
||||
path: libraries/classes/Display/Results.php
|
||||
|
||||
-
|
||||
message: "#^Method PhpMyAdmin\\\\Display\\\\Results\\:\\:setDisplayPartsForShow\\(\\) has parameter \\$displayParts with no value type specified in iterable type array\\.$#"
|
||||
count: 1
|
||||
path: libraries/classes/Display/Results.php
|
||||
|
||||
-
|
||||
message: "#^Method PhpMyAdmin\\\\Display\\\\Results\\:\\:setDisplayPartsForShow\\(\\) return type has no value type specified in iterable type array\\.$#"
|
||||
count: 1
|
||||
path: libraries/classes/Display/Results.php
|
||||
|
||||
-
|
||||
message: "#^Method PhpMyAdmin\\\\Display\\\\Results\\:\\:setHighlightedColumnGlobalField\\(\\) has parameter \\$analyzedSqlResults with no value type specified in iterable type array\\.$#"
|
||||
count: 1
|
||||
@ -3230,6 +3150,11 @@ parameters:
|
||||
count: 1
|
||||
path: libraries/classes/Display/Results.php
|
||||
|
||||
-
|
||||
message: "#^Parameter \\#3 \\$total of method PhpMyAdmin\\\\Display\\\\Results\\:\\:setMessageInformation\\(\\) expects int, mixed given\\.$#"
|
||||
count: 1
|
||||
path: libraries/classes/Display/Results.php
|
||||
|
||||
-
|
||||
message: "#^Parameter \\#6 \\$colVisib of method PhpMyAdmin\\\\Display\\\\Results\\:\\:getRowValues\\(\\) expects array\\|bool\\|string, mixed given\\.$#"
|
||||
count: 1
|
||||
@ -7880,11 +7805,6 @@ parameters:
|
||||
count: 1
|
||||
path: libraries/classes/Sql.php
|
||||
|
||||
-
|
||||
message: "#^Method PhpMyAdmin\\\\Sql\\:\\:getHtmlForSqlQueryResultsTable\\(\\) has parameter \\$displayParts with no value type specified in iterable type array\\.$#"
|
||||
count: 1
|
||||
path: libraries/classes/Sql.php
|
||||
|
||||
-
|
||||
message: "#^Method PhpMyAdmin\\\\Sql\\:\\:getHtmlForSqlQueryResultsTable\\(\\) has parameter \\$showTable with no value type specified in iterable type array\\.$#"
|
||||
count: 1
|
||||
|
||||
@ -5674,7 +5674,7 @@
|
||||
</file>
|
||||
<file src="libraries/classes/Display/Results.php">
|
||||
<DocblockTypeContradiction occurrences="2">
|
||||
<code>$displayParts['nav_bar'] == '1' && $statement !== null && empty($statement->limit)</code>
|
||||
<code>$displayParts->hasNavigationBar && $statement !== null && empty($statement->limit)</code>
|
||||
<code>[]</code>
|
||||
</DocblockTypeContradiction>
|
||||
<InvalidArgument occurrences="2">
|
||||
@ -5684,7 +5684,7 @@
|
||||
<InvalidArrayOffset occurrences="1">
|
||||
<code>$delUrlParams</code>
|
||||
</InvalidArrayOffset>
|
||||
<MixedArgument occurrences="53">
|
||||
<MixedArgument occurrences="49">
|
||||
<code>$_SESSION['tmpval']['max_rows']</code>
|
||||
<code>$_SESSION['tmpval']['pos'] / $_SESSION['tmpval']['max_rows']</code>
|
||||
<code>$_SESSION['tmpval']['query']</code>
|
||||
@ -5707,10 +5707,6 @@
|
||||
<code>$displayParams['desc']</code>
|
||||
<code>$displayParams['emptyafter']</code>
|
||||
<code>$displayParams['emptypre']</code>
|
||||
<code>$displayParts</code>
|
||||
<code>$displayParts['del_lnk']</code>
|
||||
<code>$displayParts['del_lnk']</code>
|
||||
<code>$displayParts['pview_lnk']</code>
|
||||
<code>$expr->alias</code>
|
||||
<code>$field->table</code>
|
||||
<code>$mediaTypeMap[$orgFullColName]['mimetype']</code>
|
||||
@ -5746,7 +5742,7 @@
|
||||
<code>$sortExpression</code>
|
||||
<code>$urlParams</code>
|
||||
</MixedArgumentTypeCoercion>
|
||||
<MixedArrayAccess occurrences="68">
|
||||
<MixedArrayAccess occurrences="64">
|
||||
<code>$_SESSION['tmpval']['display_binary']</code>
|
||||
<code>$_SESSION['tmpval']['display_binary']</code>
|
||||
<code>$_SESSION['tmpval']['display_binary']</code>
|
||||
@ -5790,10 +5786,6 @@
|
||||
<code>$colOrder[$j]</code>
|
||||
<code>$colVisib[$j]</code>
|
||||
<code>$displayParams['data'][$rowNumber]</code>
|
||||
<code>$displayParts['nav_bar']</code>
|
||||
<code>$displayParts['nav_bar']</code>
|
||||
<code>$displayParts['nav_bar']</code>
|
||||
<code>$displayParts['sort_lnk']</code>
|
||||
<code>$oneKey['index_list']</code>
|
||||
<code>$oneKey['ref_db_name']</code>
|
||||
<code>$oneKey['ref_db_name']</code>
|
||||
@ -5891,7 +5883,7 @@
|
||||
<code>$row[$sortedColumnIndex]</code>
|
||||
<code>$row[$sortedColumnIndex]</code>
|
||||
</MixedArrayTypeCoercion>
|
||||
<MixedAssignment occurrences="50">
|
||||
<MixedAssignment occurrences="51">
|
||||
<code>$_SESSION['tmpval']['geoOption']</code>
|
||||
<code>$_SESSION['tmpval']['max_rows']</code>
|
||||
<code>$_SESSION['tmpval']['pftext']</code>
|
||||
@ -5939,6 +5931,7 @@
|
||||
<code>$sqlQueryAdd</code>
|
||||
<code>$tableCreateTime</code>
|
||||
<code>$theTotal</code>
|
||||
<code>$total</code>
|
||||
<code>$value</code>
|
||||
<code>$whereClauseMap[$rowNumber][$meta->orgtable]</code>
|
||||
<code>$whereClauseMap[$rowNumber][$this->properties['table']]</code>
|
||||
|
||||
72
test/classes/Display/DisplayPartsTest.php
Normal file
72
test/classes/Display/DisplayPartsTest.php
Normal file
@ -0,0 +1,72 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace PhpMyAdmin\Tests\Display;
|
||||
|
||||
use PhpMyAdmin\Display\DisplayParts;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
/**
|
||||
* @covers \PhpMyAdmin\Display\DisplayParts
|
||||
*/
|
||||
class DisplayPartsTest extends TestCase
|
||||
{
|
||||
public function testFromArray(): void
|
||||
{
|
||||
$displayParts = DisplayParts::fromArray([
|
||||
'hasEditLink' => true,
|
||||
'deleteLink' => DisplayParts::DELETE_ROW,
|
||||
'hasSortLink' => true,
|
||||
'hasNavigationBar' => true,
|
||||
'hasBookmarkForm' => true,
|
||||
'hasTextButton' => true,
|
||||
'hasPrintLink' => true,
|
||||
]);
|
||||
$this->assertTrue($displayParts->hasEditLink);
|
||||
$this->assertSame(DisplayParts::DELETE_ROW, $displayParts->deleteLink);
|
||||
$this->assertTrue($displayParts->hasSortLink);
|
||||
$this->assertTrue($displayParts->hasNavigationBar);
|
||||
$this->assertTrue($displayParts->hasBookmarkForm);
|
||||
$this->assertTrue($displayParts->hasTextButton);
|
||||
$this->assertTrue($displayParts->hasPrintLink);
|
||||
}
|
||||
|
||||
public function testWith(): void
|
||||
{
|
||||
$displayParts = DisplayParts::fromArray([]);
|
||||
$this->assertFalse($displayParts->hasEditLink);
|
||||
$this->assertSame(DisplayParts::NO_DELETE, $displayParts->deleteLink);
|
||||
$this->assertFalse($displayParts->hasSortLink);
|
||||
$this->assertFalse($displayParts->hasNavigationBar);
|
||||
$this->assertFalse($displayParts->hasBookmarkForm);
|
||||
$this->assertFalse($displayParts->hasTextButton);
|
||||
$this->assertFalse($displayParts->hasPrintLink);
|
||||
|
||||
$displayParts = $displayParts->with([
|
||||
'hasEditLink' => true,
|
||||
'deleteLink' => DisplayParts::KILL_PROCESS,
|
||||
'hasSortLink' => true,
|
||||
'hasNavigationBar' => true,
|
||||
'hasBookmarkForm' => true,
|
||||
'hasTextButton' => true,
|
||||
'hasPrintLink' => true,
|
||||
]);
|
||||
$this->assertTrue($displayParts->hasEditLink);
|
||||
$this->assertSame(DisplayParts::KILL_PROCESS, $displayParts->deleteLink);
|
||||
$this->assertTrue($displayParts->hasSortLink);
|
||||
$this->assertTrue($displayParts->hasNavigationBar);
|
||||
$this->assertTrue($displayParts->hasBookmarkForm);
|
||||
$this->assertTrue($displayParts->hasTextButton);
|
||||
$this->assertTrue($displayParts->hasPrintLink);
|
||||
|
||||
$displayParts = $displayParts->with([]);
|
||||
$this->assertTrue($displayParts->hasEditLink);
|
||||
$this->assertSame(DisplayParts::KILL_PROCESS, $displayParts->deleteLink);
|
||||
$this->assertTrue($displayParts->hasSortLink);
|
||||
$this->assertTrue($displayParts->hasNavigationBar);
|
||||
$this->assertTrue($displayParts->hasBookmarkForm);
|
||||
$this->assertTrue($displayParts->hasTextButton);
|
||||
$this->assertTrue($displayParts->hasPrintLink);
|
||||
}
|
||||
}
|
||||
@ -6,6 +6,7 @@ namespace PhpMyAdmin\Tests\Display;
|
||||
|
||||
use PhpMyAdmin\ConfigStorage\RelationParameters;
|
||||
use PhpMyAdmin\DatabaseInterface;
|
||||
use PhpMyAdmin\Display\DisplayParts;
|
||||
use PhpMyAdmin\Display\Results as DisplayResults;
|
||||
use PhpMyAdmin\FieldMetadata;
|
||||
use PhpMyAdmin\Html\Generator;
|
||||
@ -1420,15 +1421,17 @@ class ResultsTest extends AbstractTestCase
|
||||
$_SESSION['tmpval']['query']['27b1330f2076ef45d236f20839a92831']['max_rows'] = 25;
|
||||
|
||||
$dtResult = $this->dbi->tryQuery($query);
|
||||
$displayParts = [
|
||||
'edit_lnk' => DisplayResults::UPDATE_ROW,
|
||||
'del_lnk' => DisplayResults::DELETE_ROW,
|
||||
'sort_lnk' => '1',
|
||||
'nav_bar' => '1',
|
||||
'bkm_form' => '1',
|
||||
'text_btn' => '0',
|
||||
'pview_lnk' => '1',
|
||||
];
|
||||
|
||||
$displayParts = DisplayParts::fromArray([
|
||||
'hasEditLink' => true,
|
||||
'deleteLink' => DisplayParts::DELETE_ROW,
|
||||
'hasSortLink' => true,
|
||||
'hasNavigationBar' => true,
|
||||
'hasBookmarkForm' => true,
|
||||
'hasTextButton' => false,
|
||||
'hasPrintLink' => true,
|
||||
]);
|
||||
|
||||
$this->assertNotFalse($dtResult);
|
||||
$actual = $object->getTable($dtResult, $displayParts, $analyzedSqlResults);
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user