22
33namespace wcf\system\search\acp;
44
5- use wcf\data\acp\menu\item\ACPMenuItem;
6- use wcf\system\database\util\PreparedStatementConditionBuilder;
75use wcf\system\menu\acp\ACPMenu;
6+ use wcf\system\menu\acp\AcpMenuItem;
87use 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 */
1716class 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