41 $this->moduleStorage = GeneralUtility::makeInstance(\
TYPO3\CMS\Backend\Module\ModuleStorage::class);
57 if (empty($excludeGroupNames)) {
58 return $this->moduleStorage->getEntries();
61 $modules = new \SplObjectStorage();
62 foreach ($this->moduleStorage->getEntries() as $moduleGroup) {
63 if (!in_array($moduleGroup->getName(), $excludeGroupNames,
true)) {
64 if ($moduleGroup->getChildren()->count() > 0) {
65 $modules->attach($moduleGroup);
79 foreach ($this->moduleStorage->getEntries() as $moduleGroup) {
80 if ($moduleGroup->getName() === $groupName) {
96 $entries = $this->moduleStorage->getEntries();
110 foreach ($entries as $entry) {
111 if ($entry->getName() === $name) {
114 $children = $entry->getChildren();
115 if (!empty($children)) {
117 if ($childRecord !==
false) {
132 foreach ($rawModuleData as $module) {
134 if (isset($module[
'subitems']) && !empty($module[
'subitems'])) {
135 foreach ($module[
'subitems'] as $subitem) {
137 $entry->addChild($subEntry);
140 $this->moduleStorage->attachEntry($entry);
153 $entry = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\
TYPO3\CMS\Backend\Domain\Model\Module\BackendModule::class);
154 if (!empty($module[
'name']) && is_string($module[
'name'])) {
155 $entry->setName($module[
'name']);
157 if (!empty($module[
'title']) && is_string($module[
'title'])) {
160 if (!empty($module[
'onclick']) && is_string($module[
'onclick'])) {
161 $entry->setOnClick($module[
'onclick']);
163 if (!empty($module[
'link']) && is_string($module[
'link'])) {
164 $entry->setLink($module[
'link']);
165 } elseif (empty($module[
'link']) && !empty($module[
'path']) && is_string($module[
'path'])) {
166 $entry->setLink($module[
'path']);
168 if (!empty($module[
'description']) && is_string($module[
'description'])) {
171 if (!empty($module[
'icon'])) {
172 $entry->setIcon($module[
'icon']);
174 if (!empty($module[
'navigationComponentId']) && is_string($module[
'navigationComponentId'])) {
175 $entry->setNavigationComponentId($module[
'navigationComponentId']);
177 if (!empty($module[
'navigationFrameScript']) && is_string($module[
'navigationFrameScript'])) {
178 $entry->setNavigationFrameScript($module[
'navigationFrameScript']);
179 } elseif (!empty($module[
'parentNavigationFrameScript']) && is_string($module[
'parentNavigationFrameScript'])) {
180 $entry->setNavigationFrameScript($module[
'parentNavigationFrameScript']);
182 if (!empty($module[
'navigationFrameScriptParam']) && is_string($module[
'navigationFrameScriptParam'])) {
183 $entry->setNavigationFrameScriptParameters($module[
'navigationFrameScriptParam']);
185 $moduleMenuState = json_decode($this->
getBackendUser()->uc[
'modulemenu'] ??
'{}',
true);
186 $entry->setCollapsed(isset($moduleMenuState[$module[
'name']]));
196 foreach (
$GLOBALS[
'TBE_MODULES_EXT'] ?? [] as $mainModule => $tbeModuleExt) {
197 list($main) = explode(
'_', $mainModule);
199 if ($mainEntry ===
false) {
203 $subEntries = $mainEntry->getChildren();
204 if (empty($subEntries)) {
208 if ($matchingSubEntry !==
false) {
209 if (isset($tbeModuleExt[
'MOD_MENU']) && isset($tbeModuleExt[
'MOD_MENU'][
'function'])) {
210 foreach ($tbeModuleExt[
'MOD_MENU'][
'function'] as $subModule) {
212 $matchingSubEntry->addChild($entry);
229 $moduleLoader = GeneralUtility::makeInstance(ModuleLoader::class);
230 $moduleLoader->observeWorkspaces =
true;
231 $moduleLoader->load(
$GLOBALS[
'TBE_MODULES']);
232 $loadedModules = $moduleLoader->modules;
238 $uriBuilder = GeneralUtility::makeInstance(UriBuilder::class);
239 $dummyScript = (string)$uriBuilder->buildUriFromRoute(
'dummy');
240 foreach ($loadedModules as $moduleName => $moduleData) {
242 if (!is_array($moduleData[
'sub'])) {
243 $moduleLink = $moduleData[
'script'];
245 $moduleLink = GeneralUtility::resolveBackPath($moduleLink);
246 $moduleLabels = $moduleLoader->getLabelsForModule($moduleName);
247 $moduleKey =
'modmenu_' . $moduleName;
248 $modules[$moduleKey] = [
249 'name' => $moduleName,
250 'title' => $moduleLabels[
'title'],
251 'onclick' =>
'top.goToModule(' . GeneralUtility::quoteJSvalue($moduleName) .
');',
253 'link' => $moduleLink,
254 'description' => $moduleLabels[
'shortdescription']
256 if (!is_array($moduleData[
'sub']) && $moduleData[
'script'] !== $dummyScript) {
258 $modules[$moduleKey][
'subitems'][$moduleKey] = [
259 'name' => $moduleName,
260 'title' => $moduleLabels[
'title'],
261 'onclick' =>
'top.goToModule(' . GeneralUtility::quoteJSvalue($moduleName) .
');',
263 'link' => $moduleLink,
264 'originalLink' => $moduleLink,
265 'description' => $moduleLabels[
'shortdescription'],
266 'navigationFrameScript' =>
null,
267 'navigationFrameScriptParam' =>
null,
268 'navigationComponentId' => null
270 } elseif (is_array($moduleData[
'sub'])) {
271 foreach ($moduleData[
'sub'] as $submoduleName => $submoduleData) {
272 if (isset($submoduleData[
'script'])) {
273 $submoduleLink = GeneralUtility::resolveBackPath($submoduleData[
'script']);
275 $submoduleLink = (string)$uriBuilder->buildUriFromRoute($submoduleData[
'name']);
277 $submoduleKey = $moduleName .
'_' . $submoduleName;
278 $submoduleLabels = $moduleLoader->getLabelsForModule($submoduleKey);
279 $submoduleDescription = $submoduleLabels[
'shortdescription'];
280 $originalLink = $submoduleLink;
281 $navigationFrameScript = $submoduleData[
'navFrameScript'];
282 $modules[$moduleKey][
'subitems'][$submoduleKey] = [
283 'name' => $moduleName .
'_' . $submoduleName,
284 'title' => $submoduleLabels[
'title'],
285 'onclick' =>
'top.goToModule(' . GeneralUtility::quoteJSvalue($moduleName .
'_' . $submoduleName) .
');',
287 'link' => $submoduleLink,
288 'originalLink' => $originalLink,
289 'description' => $submoduleDescription,
290 'navigationFrameScript' => $navigationFrameScript,
291 'navigationFrameScriptParam' => $submoduleData[
'navFrameScriptParam'],
292 'navigationComponentId' => $submoduleData[
'navigationComponentId']
296 if ($moduleData[
'navFrameScript'] && $submoduleData[
'inheritNavigationComponentFromMainModule'] !==
false) {
297 $modules[$moduleKey][
'subitems'][$submoduleKey][
'parentNavigationFrameScript'] = $moduleData[
'navFrameScript'];
317 $hiddenMainModules = GeneralUtility::trimExplode(
',', $userTsConfig[
'options.'][
'hideModules'] ??
'',
true);
318 foreach ($hiddenMainModules as $hiddenMainModule) {
319 unset($loadedModules[$hiddenMainModule]);
323 $hiddenModules = $userTsConfig[
'options.'][
'hideModules.'] ?? [];
324 if (is_array($hiddenModules)) {
325 foreach ($hiddenModules as $mainModuleName => $subModules) {
326 $hiddenSubModules = GeneralUtility::trimExplode(
',', $subModules,
true);
327 foreach ($hiddenSubModules as $hiddenSubModule) {
328 unset($loadedModules[$mainModuleName][
'sub'][$hiddenSubModule]);
333 return $loadedModules;
345 $iconIdentifier = !empty($moduleData[
'iconIdentifier'])
346 ? $moduleData[
'iconIdentifier']
347 :
'module-icon-' . $moduleKey;
348 $iconRegistry = GeneralUtility::makeInstance(IconRegistry::class);
350 $iconFactory = GeneralUtility::makeInstance(IconFactory::class);
351 return $iconFactory->getIcon($iconIdentifier)->render();