Skip to content

Commit 4b2176d

Browse files
committed
Fix outdated search in ACP menu items
1 parent 147baa3 commit 4b2176d

File tree

1 file changed

+11
-49
lines changed

1 file changed

+11
-49
lines changed

wcfsetup/install/files/lib/system/search/acp/MenuItemACPSearchResultProvider.class.php

Lines changed: 11 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,16 @@
22

33
namespace wcf\system\search\acp;
44

5-
use wcf\data\acp\menu\item\ACPMenuItem;
6-
use wcf\system\database\util\PreparedStatementConditionBuilder;
75
use wcf\system\menu\acp\ACPMenu;
6+
use wcf\system\menu\acp\AcpMenuItem;
87
use wcf\system\WCF;
98

109
/**
1110
* ACP search provider implementation for menu items.
1211
*
13-
* @author Alexander Ebert
14-
* @copyright 2001-2019 WoltLab GmbH
15-
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
12+
* @author Alexander Ebert
13+
* @copyright 2001-2025 WoltLab GmbH
14+
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
1615
*/
1716
class MenuItemACPSearchResultProvider extends AbstractACPSearchResultProvider implements IACPSearchResultProvider
1817
{
@@ -22,52 +21,15 @@ class MenuItemACPSearchResultProvider extends AbstractACPSearchResultProvider im
2221
public function search($query)
2322
{
2423
$results = [];
24+
$menuItems = ACPMenu::getInstance()->menuItemList;
2525

26-
// search by language item
27-
$conditions = new PreparedStatementConditionBuilder();
28-
$conditions->add("languageID = ?", [WCF::getLanguage()->languageID]);
26+
foreach ($menuItems as $menuItem) {
27+
\assert($menuItem instanceof AcpMenuItem);
2928

30-
// filter by language item
31-
$languageItemsConditions = '';
32-
$languageItemsParameters = [];
33-
foreach (ACPSearchHandler::getInstance()->getAbbreviations('.acp.menu.link.%') as $abbreviation) {
34-
if (!empty($languageItemsConditions)) {
35-
$languageItemsConditions .= " OR ";
29+
if (\mb_stripos($menuItem->__toString(), $query) === false) {
30+
continue;
3631
}
37-
$languageItemsConditions .= "languageItem LIKE ?";
38-
$languageItemsParameters[] = $abbreviation;
39-
}
40-
$conditions->add("(" . $languageItemsConditions . ")", $languageItemsParameters);
41-
$conditions->add("languageItemValue LIKE ?", ['%' . $query . '%']);
42-
43-
$sql = "SELECT languageItem, languageItemValue
44-
FROM wcf1_language_item
45-
" . $conditions . "
46-
ORDER BY languageItemValue ASC";
47-
$statement = WCF::getDB()->prepare($sql); // don't use a limit here
48-
$statement->execute($conditions->getParameters());
49-
$languageItems = $statement->fetchMap('languageItem', 'languageItemValue');
50-
51-
if (empty($languageItems)) {
52-
return [];
53-
}
54-
55-
$conditions = new PreparedStatementConditionBuilder();
56-
$conditions->add("menuItem IN (?)", [\array_keys($languageItems)]);
57-
$conditions->add("menuItemController <> ''");
58-
59-
$sql = "SELECT *
60-
FROM wcf1_acp_menu_item
61-
" . $conditions;
62-
$statement = WCF::getDB()->prepare($sql); // don't use a limit here
63-
$statement->execute($conditions->getParameters());
64-
65-
$menuItems = ACPMenu::getInstance()->menuItemList;
66-
67-
while ($menuItem = $statement->fetchObject(ACPMenuItem::class)) {
68-
// only valid menu items exist in TreeMenu::$menuItemList,
69-
// so no need to call AbstractACPSearchResultProvider::validate()
70-
if (!isset($menuItems[$menuItem->menuItem])) {
32+
if (!$menuItem->getLink()) {
7133
continue;
7234
}
7335

@@ -79,7 +41,7 @@ public function search($query)
7941
$parentMenuItem = $menuItems[$parentMenuItem]->parentMenuItem;
8042
}
8143
$results[] = new ACPSearchResult(
82-
$languageItems[$menuItem->menuItem],
44+
$menuItem->__toString(),
8345
$menuItem->getLink(),
8446
WCF::getLanguage()->getDynamicVariable(
8547
'wcf.acp.search.result.subtitle',

0 commit comments

Comments
 (0)