diff --git a/libraries/classes/Navigation/Navigation.php b/libraries/classes/Navigation/Navigation.php index 21e71dedb0..d8a220dc40 100644 --- a/libraries/classes/Navigation/Navigation.php +++ b/libraries/classes/Navigation/Navigation.php @@ -41,7 +41,7 @@ class Navigation public function __construct(private Template $template, private Relation $relation, private DatabaseInterface $dbi) { - $this->tree = new NavigationTree($this->template, $this->dbi); + $this->tree = new NavigationTree($this->template, $this->dbi, $this->relation); } /** diff --git a/libraries/classes/Navigation/NavigationTree.php b/libraries/classes/Navigation/NavigationTree.php index 145e0d0c91..e86c316db7 100644 --- a/libraries/classes/Navigation/NavigationTree.php +++ b/libraries/classes/Navigation/NavigationTree.php @@ -8,6 +8,8 @@ declare(strict_types=1); namespace PhpMyAdmin\Navigation; use PhpMyAdmin\CheckUserPrivileges; +use PhpMyAdmin\ConfigStorage\Relation; +use PhpMyAdmin\ConfigStorage\RelationParameters; use PhpMyAdmin\DatabaseInterface; use PhpMyAdmin\Html\Generator; use PhpMyAdmin\Navigation\Nodes\Node; @@ -136,8 +138,11 @@ class NavigationTree */ private bool $largeGroupWarning = false; - public function __construct(private Template $template, private DatabaseInterface $dbi) + private RelationParameters $relationParameters; + + public function __construct(private Template $template, private DatabaseInterface $dbi, Relation $relation) { + $this->relationParameters = $relation->getRelationParameters(); $checkUserPrivileges = new CheckUserPrivileges($this->dbi); $checkUserPrivileges->getPrivileges(); @@ -307,8 +312,8 @@ class NavigationTree $retval = $this->tree; // Add all databases unconditionally - $data = $this->tree->getData('databases', $this->pos, $this->searchClause); - $hiddenCounts = $this->tree->getNavigationHidingData(); + $data = $this->tree->getData($this->relationParameters, 'databases', $this->pos, $this->searchClause); + $hiddenCounts = $this->tree->getNavigationHidingData($this->relationParameters->navigationItemsHidingFeature); foreach ($data as $db) { $node = NodeFactory::getInstance(NodeDatabase::class, $db); if (isset($hiddenCounts[$db])) { @@ -381,7 +386,7 @@ class NavigationTree } if (count($container->children) <= 1) { - $dbData = $db->getData($container->realName, $pos2, $this->searchClause2); + $dbData = $db->getData($this->relationParameters, $container->realName, $pos2, $this->searchClause2); foreach ($dbData as $item) { switch ($container->realName) { case 'events': @@ -454,7 +459,7 @@ class NavigationTree return false; } - $tableData = $table->getData($container->realName, $pos3); + $tableData = $table->getData($this->relationParameters, $container->realName, $pos3); foreach ($tableData as $item) { switch ($container->realName) { case 'indexes': @@ -558,7 +563,7 @@ class NavigationTree private function addDbContainers(NodeDatabase $db, string $type, int $pos2): array { // Get items to hide - $hidden = $db->getHiddenItems('group'); + $hidden = $db->getHiddenItems($this->relationParameters, 'group'); if (! $GLOBALS['cfg']['NavigationTreeShowTables'] && ! in_array('tables', $hidden)) { $hidden[] = 'tables'; } @@ -1108,7 +1113,7 @@ class NavigationTree ]; } - $controlButtons .= $node->getHtmlForControlButtons(); + $controlButtons .= $node->getHtmlForControlButtons($this->relationParameters->navigationItemsHidingFeature); $wrap = true; } else { $node->visible = true; diff --git a/libraries/classes/Navigation/Nodes/Node.php b/libraries/classes/Navigation/Nodes/Node.php index 79fe155398..2a9b7ef86a 100644 --- a/libraries/classes/Navigation/Nodes/Node.php +++ b/libraries/classes/Navigation/Nodes/Node.php @@ -7,7 +7,8 @@ declare(strict_types=1); namespace PhpMyAdmin\Navigation\Nodes; -use PhpMyAdmin\ConfigStorage\Relation; +use PhpMyAdmin\ConfigStorage\Features\NavigationItemsHidingFeature; +use PhpMyAdmin\ConfigStorage\RelationParameters; use PhpMyAdmin\Dbal\Connection; use PhpMyAdmin\Html\Generator; use PhpMyAdmin\Util; @@ -115,8 +116,6 @@ class Node */ public int $pos3 = 0; - protected Relation $relation; - /** @var string $displayName display name for the navigation tree */ public string|null $displayName = null; @@ -142,7 +141,6 @@ class Node } $this->isGroup = $isGroup; - $this->relation = new Relation($GLOBALS['dbi']); } /** @@ -352,8 +350,12 @@ class Node * * @return mixed[] */ - public function getData(string $type, int $pos, string $searchClause = ''): array - { + public function getData( + RelationParameters $relationParameters, + string $type, + int $pos, + string $searchClause = '', + ): array { if (isset($GLOBALS['cfg']['Server']['DisableIS']) && ! $GLOBALS['cfg']['Server']['DisableIS']) { return $this->getDataFromInfoSchema($pos, $searchClause); } @@ -544,7 +546,7 @@ class Node * * @return string HTML for control buttons */ - public function getHtmlForControlButtons(): string + public function getHtmlForControlButtons(NavigationItemsHidingFeature|null $navigationItemsHidingFeature): string { return ''; } @@ -602,9 +604,8 @@ class Node * * @return mixed[]|null array containing the count of hidden elements for each database */ - public function getNavigationHidingData(): array|null + public function getNavigationHidingData(NavigationItemsHidingFeature|null $navigationItemsHidingFeature): array|null { - $navigationItemsHidingFeature = $this->relation->getRelationParameters()->navigationItemsHidingFeature; if ($navigationItemsHidingFeature !== null) { $navTable = Util::backquote($navigationItemsHidingFeature->database) . '.' . Util::backquote($navigationItemsHidingFeature->navigationHiding); diff --git a/libraries/classes/Navigation/Nodes/NodeDatabase.php b/libraries/classes/Navigation/Nodes/NodeDatabase.php index e5e92a8c0e..49d824445d 100644 --- a/libraries/classes/Navigation/Nodes/NodeDatabase.php +++ b/libraries/classes/Navigation/Nodes/NodeDatabase.php @@ -7,6 +7,8 @@ declare(strict_types=1); namespace PhpMyAdmin\Navigation\Nodes; +use PhpMyAdmin\ConfigStorage\Features\NavigationItemsHidingFeature; +use PhpMyAdmin\ConfigStorage\RelationParameters; use PhpMyAdmin\Dbal\Connection; use PhpMyAdmin\Html\Generator; use PhpMyAdmin\Url; @@ -257,8 +259,12 @@ class NodeDatabase extends Node * * @return mixed[] */ - public function getData(string $type, int $pos, string $searchClause = ''): array - { + public function getData( + RelationParameters $relationParameters, + string $type, + int $pos, + string $searchClause = '', + ): array { $retval = []; switch ($type) { case 'tables': @@ -281,9 +287,8 @@ class NodeDatabase extends Node } // Remove hidden items so that they are not displayed in navigation tree - $relationParameters = $this->relation->getRelationParameters(); if ($relationParameters->navigationItemsHidingFeature !== null) { - $hiddenItems = $this->getHiddenItems(substr($type, 0, -1)); + $hiddenItems = $this->getHiddenItems($relationParameters, substr($type, 0, -1)); foreach ($retval as $key => $item) { if (! in_array($item, $hiddenItems)) { continue; @@ -304,9 +309,8 @@ class NodeDatabase extends Node * * @return mixed[] Array containing hidden items of given type */ - public function getHiddenItems(string $type): array + public function getHiddenItems(RelationParameters $relationParameters, string $type): array { - $relationParameters = $this->relation->getRelationParameters(); if ($relationParameters->navigationItemsHidingFeature === null || $relationParameters->user === null) { return []; } @@ -564,11 +568,10 @@ class NodeDatabase extends Node * * @return string HTML for control buttons */ - public function getHtmlForControlButtons(): string + public function getHtmlForControlButtons(NavigationItemsHidingFeature|null $navigationItemsHidingFeature): string { $ret = ''; - $relationParameters = $this->relation->getRelationParameters(); - if ($relationParameters->navigationItemsHidingFeature !== null) { + if ($navigationItemsHidingFeature !== null) { if ($this->hiddenCount > 0) { $params = ['showUnhideDialog' => true, 'dbName' => $this->realName]; $ret = '' diff --git a/libraries/classes/Navigation/Nodes/NodeDatabaseChild.php b/libraries/classes/Navigation/Nodes/NodeDatabaseChild.php index 305eb6e058..f844be7f51 100644 --- a/libraries/classes/Navigation/Nodes/NodeDatabaseChild.php +++ b/libraries/classes/Navigation/Nodes/NodeDatabaseChild.php @@ -7,6 +7,7 @@ declare(strict_types=1); namespace PhpMyAdmin\Navigation\Nodes; +use PhpMyAdmin\ConfigStorage\Features\NavigationItemsHidingFeature; use PhpMyAdmin\Html\Generator; use PhpMyAdmin\Url; @@ -31,11 +32,10 @@ abstract class NodeDatabaseChild extends Node * * @return string HTML for control buttons */ - public function getHtmlForControlButtons(): string + public function getHtmlForControlButtons(NavigationItemsHidingFeature|null $navigationItemsHidingFeature): string { $ret = ''; - $relationParameters = $this->relation->getRelationParameters(); - if ($relationParameters->navigationItemsHidingFeature !== null) { + if ($navigationItemsHidingFeature !== null) { $params = [ 'hideNavItem' => true, 'itemType' => $this->getItemType(), diff --git a/libraries/classes/Navigation/Nodes/NodeTable.php b/libraries/classes/Navigation/Nodes/NodeTable.php index eebf1d2795..40f9aa60be 100644 --- a/libraries/classes/Navigation/Nodes/NodeTable.php +++ b/libraries/classes/Navigation/Nodes/NodeTable.php @@ -7,6 +7,7 @@ declare(strict_types=1); namespace PhpMyAdmin\Navigation\Nodes; +use PhpMyAdmin\ConfigStorage\RelationParameters; use PhpMyAdmin\Url; use PhpMyAdmin\Util; @@ -146,8 +147,12 @@ class NodeTable extends NodeDatabaseChild * * @return mixed[] */ - public function getData(string $type, int $pos, string $searchClause = ''): array - { + public function getData( + RelationParameters $relationParameters, + string $type, + int $pos, + string $searchClause = '', + ): array { $maxItems = $GLOBALS['cfg']['MaxNavigationItems']; $retval = []; $db = $this->realParent()->realName; diff --git a/test/classes/Navigation/NavigationTreeTest.php b/test/classes/Navigation/NavigationTreeTest.php index 448cc3a590..962ea822b5 100644 --- a/test/classes/Navigation/NavigationTreeTest.php +++ b/test/classes/Navigation/NavigationTreeTest.php @@ -4,6 +4,7 @@ declare(strict_types=1); namespace PhpMyAdmin\Tests\Navigation; +use PhpMyAdmin\ConfigStorage\Relation; use PhpMyAdmin\Navigation\NavigationTree; use PhpMyAdmin\Template; use PhpMyAdmin\Tests\AbstractTestCase; @@ -39,7 +40,7 @@ class NavigationTreeTest extends AbstractTestCase $GLOBALS['db'] = 'db'; $GLOBALS['table'] = ''; - $this->object = new NavigationTree(new Template(), $GLOBALS['dbi']); + $this->object = new NavigationTree(new Template(), $GLOBALS['dbi'], new Relation($GLOBALS['dbi'])); } /** @@ -105,7 +106,7 @@ class NavigationTreeTest extends AbstractTestCase $dbi = $this->createDatabaseInterface($dummyDbi); $GLOBALS['dbi'] = $dbi; - $object = new NavigationTree(new Template(), $dbi); + $object = new NavigationTree(new Template(), $dbi, new Relation($dbi)); $result = $object->renderState(); $this->assertStringContainsString('