summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMorris Jobke <hey@morrisjobke.de>2018-08-28 17:50:20 +0200
committerGitHub <noreply@github.com>2018-08-28 17:50:20 +0200
commitc6b1c21b8fd53fe524e38306cf8526f2eff4ad61 (patch)
tree0e16cbab9f9fc6b851afb00ae380591bcdcf262c
parente9dd6aec61501114be22eaa10e952a8b6a3d275b (diff)
parent61370549f3f86565b73823ff3aba9ba28ec0a8be (diff)
downloadnextcloud-server-c6b1c21b8fd53fe524e38306cf8526f2eff4ad61.tar.gz
nextcloud-server-c6b1c21b8fd53fe524e38306cf8526f2eff4ad61.zip
Merge pull request #10854 from nextcloud/fix-10764
Allow same section class for multiple section types (fix #10764)
-rw-r--r--lib/private/Settings/Manager.php23
-rw-r--r--tests/lib/Settings/ManagerTest.php41
2 files changed, 60 insertions, 4 deletions
diff --git a/lib/private/Settings/Manager.php b/lib/private/Settings/Manager.php
index 260e33d1929..f1baf35b7ab 100644
--- a/lib/private/Settings/Manager.php
+++ b/lib/private/Settings/Manager.php
@@ -133,7 +133,11 @@ class Manager implements IManager {
* @return void
*/
public function registerSection(string $type, string $section) {
- $this->sectionClasses[$section] = $type;
+ if (!isset($this->sectionClasses[$type])) {
+ $this->sectionClasses[$type] = [];
+ }
+
+ $this->sectionClasses[$type][] = $section;
}
/**
@@ -145,7 +149,11 @@ class Manager implements IManager {
$this->sections[$type] = [];
}
- foreach ($this->sectionClasses as $class => $sectionType) {
+ if (!isset($this->sectionClasses[$type])) {
+ return $this->sections[$type];
+ }
+
+ foreach ($this->sectionClasses[$type] as $index => $class) {
try {
/** @var ISection $section */
$section = \OC::$server->query($class);
@@ -159,9 +167,16 @@ class Manager implements IManager {
continue;
}
- $this->sections[$sectionType][$section->getID()] = $section;
+ $sectionID = $section->getID();
+
+ if (isset($this->sections[$type][$sectionID])) {
+ $this->log->logException(new \InvalidArgumentException('Section with the same ID already registered'), ['level' => ILogger::INFO]);
+ continue;
+ }
+
+ $this->sections[$type][$sectionID] = $section;
- unset($this->sectionClasses[$class]);
+ unset($this->sectionClasses[$type][$index]);
}
return $this->sections[$type];
diff --git a/tests/lib/Settings/ManagerTest.php b/tests/lib/Settings/ManagerTest.php
index df7e59841ce..6f9af39d591 100644
--- a/tests/lib/Settings/ManagerTest.php
+++ b/tests/lib/Settings/ManagerTest.php
@@ -220,4 +220,45 @@ class ManagerTest extends TestCase {
10 => [new Security($this->userManager)],
], $this->manager->getPersonalSettings('security'));
}
+
+ public function testSameSectionAsPersonalAndAdmin() {
+ $this->l10n
+ ->expects($this->any())
+ ->method('t')
+ ->will($this->returnArgument(0));
+
+ $this->manager->registerSection('personal', \OCA\WorkflowEngine\Settings\Section::class);
+ $this->manager->registerSection('admin', \OCA\WorkflowEngine\Settings\Section::class);
+
+ $this->url->expects($this->exactly(9))
+ ->method('imagePath')
+ ->willReturnMap([
+ ['core', 'actions/info.svg', '1'],
+ ['settings', 'password.svg', '2'],
+ ['core', 'clients/phone.svg', '3'],
+ ['settings', 'admin.svg', '0'],
+ ['core', 'actions/settings-dark.svg', '1'],
+ ['core', 'actions/share.svg', '2'],
+ ['core', 'actions/password.svg', '3'],
+ ['core', 'places/contacts.svg', '5'],
+ ['settings', 'help.svg', '4'],
+ ]);
+
+ $this->assertEquals([
+ 0 => [new Section('personal-info', 'Personal info', 0, '1')],
+ 5 => [new Section('security', 'Security', 0, '2')],
+ 15 => [new Section('sync-clients', 'Mobile & desktop', 0, '3')],
+ 55 => [\OC::$server->query(\OCA\WorkflowEngine\Settings\Section::class)],
+ ], $this->manager->getPersonalSections());
+
+ $this->assertEquals([
+ 0 => [new Section('overview', 'Overview', 0, '0')],
+ 1 => [new Section('server', 'Basic settings', 0, '1')],
+ 5 => [new Section('sharing', 'Sharing', 0, '2')],
+ 10 => [new Section('security', 'Security', 0, '3')],
+ 50 => [new Section('groupware', 'Groupware', 0, '5')],
+ 55 => [\OC::$server->query(\OCA\WorkflowEngine\Settings\Section::class)],
+ 98 => [new Section('additional', 'Additional settings', 0, '1')],
+ ], $this->manager->getAdminSections());
+ }
}