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