From d4f84dff5b9e428a9819b5e641b0e38894051b2f Mon Sep 17 00:00:00 2001 From: Marcel Werk Date: Fri, 19 Jun 2026 19:20:52 +0200 Subject: [PATCH] Add option to disable menus via their box --- .../files/lib/acp/form/MenuAddForm.class.php | 7 ++- .../core/menus/DisableMenu.class.php | 49 +++++++++++++++++++ .../core/menus/EnableMenu.class.php | 49 +++++++++++++++++++ .../gridView/admin/MenuGridView.class.php | 22 ++++++++- 4 files changed, 124 insertions(+), 3 deletions(-) create mode 100644 wcfsetup/install/files/lib/system/endpoint/controller/core/menus/DisableMenu.class.php create mode 100644 wcfsetup/install/files/lib/system/endpoint/controller/core/menus/EnableMenu.class.php diff --git a/wcfsetup/install/files/lib/acp/form/MenuAddForm.class.php b/wcfsetup/install/files/lib/acp/form/MenuAddForm.class.php index da6a942df4..480ee1a1b8 100644 --- a/wcfsetup/install/files/lib/acp/form/MenuAddForm.class.php +++ b/wcfsetup/install/files/lib/acp/form/MenuAddForm.class.php @@ -100,6 +100,8 @@ protected function getGeneralTabContainer(): TabFormContainer BooleanFormField::create('showHeader') ->label('wcf.acp.box.showHeader') ->value(true), + BooleanFormField::create('isDisabled') + ->label('wcf.acp.box.isDisabled'), ]) ]); } @@ -142,13 +144,15 @@ function (IFormDocument $document, array $parameters) { $parameters['boxData']['showHeader'] = $parameters['data']['showHeader']; $parameters['boxData']['visibleEverywhere'] = $parameters['data']['visibleEverywhere']; $parameters['boxData']['position'] = $parameters['data']['position']; + $parameters['boxData']['isDisabled'] = $parameters['data']['isDisabled']; unset( $parameters['data']['cssClassName'], $parameters['data']['showOrder'], $parameters['data']['showHeader'], $parameters['data']['visibleEverywhere'], - $parameters['data']['position'] + $parameters['data']['position'], + $parameters['data']['isDisabled'] ); return $parameters; @@ -162,6 +166,7 @@ function (IFormDocument $document, array $data, IStorableObject $object) { $data['visibleEverywhere'] = $object->getBox()->visibleEverywhere; $data['pageIDs'] = $object->getBox()->getPageIDs(); $data['showHeader'] = $object->getBox()->showHeader; + $data['isDisabled'] = $object->getBox()->isDisabled; $data['acl'] = SimpleAclHandler::getInstance()->getValues( 'com.woltlab.wcf.box', diff --git a/wcfsetup/install/files/lib/system/endpoint/controller/core/menus/DisableMenu.class.php b/wcfsetup/install/files/lib/system/endpoint/controller/core/menus/DisableMenu.class.php new file mode 100644 index 0000000000..4b5cb31a34 --- /dev/null +++ b/wcfsetup/install/files/lib/system/endpoint/controller/core/menus/DisableMenu.class.php @@ -0,0 +1,49 @@ + + * @since 6.3 + */ +#[PostRequest('/core/menus/{id:\d+}/disable')] +final class DisableMenu implements IController +{ + #[\Override] + public function __invoke(ServerRequestInterface $request, array $variables): ResponseInterface + { + $menu = Helper::fetchObjectFromRequestParameter($variables['id'], Menu::class); + + $this->assertMenuCanBeDisabled($menu); + + $box = $menu->getBox(); + if (!$box->isDisabled) { + (new \wcf\command\box\DisableBox($box))(); + } + + return new JsonResponse([]); + } + + private function assertMenuCanBeDisabled(Menu $menu): void + { + WCF::getSession()->checkPermissions(['admin.content.cms.canManageMenu']); + + if ($menu->isMainMenu()) { + throw new PermissionDeniedException(); + } + } +} diff --git a/wcfsetup/install/files/lib/system/endpoint/controller/core/menus/EnableMenu.class.php b/wcfsetup/install/files/lib/system/endpoint/controller/core/menus/EnableMenu.class.php new file mode 100644 index 0000000000..14c2f5b416 --- /dev/null +++ b/wcfsetup/install/files/lib/system/endpoint/controller/core/menus/EnableMenu.class.php @@ -0,0 +1,49 @@ + + * @since 6.3 + */ +#[PostRequest('/core/menus/{id:\d+}/enable')] +final class EnableMenu implements IController +{ + #[\Override] + public function __invoke(ServerRequestInterface $request, array $variables): ResponseInterface + { + $menu = Helper::fetchObjectFromRequestParameter($variables['id'], Menu::class); + + $this->assertMenuCanBeEnabled($menu); + + $box = $menu->getBox(); + if ($box->isDisabled) { + (new \wcf\command\box\EnableBox($box))(); + } + + return new JsonResponse([]); + } + + private function assertMenuCanBeEnabled(Menu $menu): void + { + WCF::getSession()->checkPermissions(['admin.content.cms.canManageMenu']); + + if ($menu->isMainMenu()) { + throw new PermissionDeniedException(); + } + } +} diff --git a/wcfsetup/install/files/lib/system/gridView/admin/MenuGridView.class.php b/wcfsetup/install/files/lib/system/gridView/admin/MenuGridView.class.php index d0429a7b2b..2edddd1246 100644 --- a/wcfsetup/install/files/lib/system/gridView/admin/MenuGridView.class.php +++ b/wcfsetup/install/files/lib/system/gridView/admin/MenuGridView.class.php @@ -20,6 +20,7 @@ use wcf\system\interaction\admin\MenuInteractions; use wcf\system\interaction\Divider; use wcf\system\interaction\EditInteraction; +use wcf\system\interaction\ToggleInteraction; use wcf\system\request\LinkHandler; use wcf\system\view\filter\I18nTextFilter; use wcf\system\view\filter\IntegerFilter; @@ -108,6 +109,13 @@ public function render(mixed $value, DatabaseObject $row): string ]); $this->setInteractionProvider($provider); + $this->addQuickInteraction(new ToggleInteraction( + 'enable', + 'core/menus/%s/enable', + 'core/menus/%s/disable', + isAvailableCallback: static fn(Menu $menu) => !$menu->isMainMenu() + )); + $this->setDefaultSortField("title"); $this->addRowLink(new GridViewRowLink(MenuEditForm::class)); } @@ -136,10 +144,11 @@ protected function createObjectList(): I18nMenuList } $list->sqlSelects .= \sprintf( - "%s as items, %s as position, %s as showOrder", + "%s as items, %s as position, %s as showOrder, %s as isDisabled", $this->subSelectItems(), $this->subSelectPosition(), - $this->subSelectShowOrder() + $this->subSelectShowOrder(), + $this->subSelectIsDisabled() ); return $list; @@ -163,6 +172,15 @@ private function subSelectShowOrder(): string )"; } + private function subSelectIsDisabled(): string + { + return "( + SELECT isDisabled + FROM wcf1_box + WHERE menuID = menu.menuID + )"; + } + #[\Override] protected function getInitializedEvent(): MenuGridViewInitialized {