primo commit
This commit is contained in:
		
							
								
								
									
										239
									
								
								administrator/modules/mod_submenu/src/Menu/Menu.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										239
									
								
								administrator/modules/mod_submenu/src/Menu/Menu.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,239 @@ | ||||
| <?php | ||||
|  | ||||
| /** | ||||
|  * @package     Joomla.Administrator | ||||
|  * @subpackage  mod_submenu | ||||
|  * | ||||
|  * @copyright   (C) 2019 Open Source Matters, Inc. <https://www.joomla.org> | ||||
|  * @license     GNU General Public License version 2 or later; see LICENSE.txt | ||||
|  */ | ||||
|  | ||||
| namespace Joomla\Module\Submenu\Administrator\Menu; | ||||
|  | ||||
| use Joomla\CMS\Component\ComponentHelper; | ||||
| use Joomla\CMS\Event\Menu\PreprocessMenuItemsEvent; | ||||
| use Joomla\CMS\Factory; | ||||
| use Joomla\CMS\Language\Associations; | ||||
| use Joomla\CMS\Language\Text; | ||||
| use Joomla\CMS\Menu\MenuItem; | ||||
| use Joomla\CMS\Uri\Uri; | ||||
| use Joomla\Component\Menus\Administrator\Helper\MenusHelper; | ||||
| use Joomla\Utilities\ArrayHelper; | ||||
|  | ||||
| // phpcs:disable PSR1.Files.SideEffects | ||||
| \defined('_JEXEC') or die; | ||||
| // phpcs:enable PSR1.Files.SideEffects | ||||
|  | ||||
| /** | ||||
|  * Helper class to handle permissions in mod_submenu | ||||
|  * | ||||
|  * @since  4.0.0 | ||||
|  */ | ||||
| abstract class Menu | ||||
| { | ||||
|     /** | ||||
|      * Filter and perform other preparatory tasks for loaded menu items based on access rights and module configurations for display | ||||
|      * | ||||
|      * @param   MenuItem  $parent  A menu item to process | ||||
|      * | ||||
|      * @return  void | ||||
|      * | ||||
|      * @since   4.0.0 | ||||
|      */ | ||||
|     public static function preprocess($parent) | ||||
|     { | ||||
|         $app        = Factory::getApplication(); | ||||
|         $user       = $app->getIdentity(); | ||||
|         $children   = $parent->getChildren(); | ||||
|         $language   = Factory::getLanguage(); | ||||
|         $dispatcher = $app->getDispatcher(); | ||||
|  | ||||
|         /** | ||||
|          * Trigger onPreprocessMenuItems for the current level of backend menu items. | ||||
|          * $children is an array of MenuItem objects. A plugin can traverse the whole tree, | ||||
|          * but new nodes will only be run through this method if their parents have not been processed yet. | ||||
|          */ | ||||
|         $children = $dispatcher->dispatch('onPreprocessMenuItems', new PreprocessMenuItemsEvent('onPreprocessMenuItems', [ | ||||
|             'context' => 'administrator.module.mod_submenu', | ||||
|             'subject' => &$children, // @todo: Remove reference in Joomla 6, see PreprocessMenuItemsEvent::__constructor() | ||||
|             'params'  => null, | ||||
|             'enabled' => true, | ||||
|         ]))->getArgument('subject', $children); | ||||
|  | ||||
|         foreach ($children as $item) { | ||||
|             if (substr($item->link, 0, 8) === 'special:') { | ||||
|                 $special = substr($item->link, 8); | ||||
|  | ||||
|                 if ($special === 'language-forum') { | ||||
|                     $item->link = 'index.php?option=com_admin&view=help&layout=langforum'; | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             $uri   = new Uri($item->link); | ||||
|             $query = $uri->getQuery(true); | ||||
|  | ||||
|             /** | ||||
|              * This is needed to populate the element property when the component is no longer | ||||
|              * installed but its core menu items are left behind. | ||||
|              */ | ||||
|             if ($option = $uri->getVar('option')) { | ||||
|                 $item->element = $option; | ||||
|             } | ||||
|  | ||||
|             // Exclude item if is not enabled | ||||
|             if ($item->element && !ComponentHelper::isEnabled($item->element)) { | ||||
|                 $parent->removeChild($item); | ||||
|                 continue; | ||||
|             } | ||||
|  | ||||
|             /* | ||||
|              * Multilingual Associations if the site is not set as multilingual and/or Associations is not enabled in | ||||
|              * the Language Filter plugin | ||||
|              */ | ||||
|  | ||||
|             if ($item->element === 'com_associations' && !Associations::isEnabled()) { | ||||
|                 $parent->removeChild($item); | ||||
|                 continue; | ||||
|             } | ||||
|  | ||||
|             $itemParams = $item->getParams(); | ||||
|  | ||||
|             // Exclude item with menu item option set to exclude from menu modules | ||||
|             if ($itemParams->get('menu-permission')) { | ||||
|                 $parts  = explode(';', $itemParams->get('menu-permission')); | ||||
|                 $action = $parts[0]; | ||||
|                 $asset  = $parts[1] ?? null; | ||||
|  | ||||
|                 if (!$user->authorise($action, $asset)) { | ||||
|                     $parent->removeChild($item); | ||||
|                     continue; | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             // Populate automatic children for container items | ||||
|             if ($item->type === 'container') { | ||||
|                 $exclude    = (array) $itemParams->get('hideitems') ?: []; | ||||
|                 $components = MenusHelper::getMenuItems('main', false, $exclude); | ||||
|  | ||||
|                 // We are adding the nodes first to preprocess them, then sort them and add them again. | ||||
|                 foreach ($components->getChildren() as $c) { | ||||
|                     if (!$c->hasChildren()) { | ||||
|                         $temp = clone $c; | ||||
|                         $c->addChild($temp); | ||||
|                     } | ||||
|  | ||||
|                     $item->addChild($c); | ||||
|                 } | ||||
|  | ||||
|                 self::preprocess($item); | ||||
|                 $children = ArrayHelper::sortObjects($item->getChildren(), 'text', 1, false, true); | ||||
|  | ||||
|                 foreach ($children as $c) { | ||||
|                     $parent->addChild($c); | ||||
|                 } | ||||
|  | ||||
|                 $parent->removeChild($item); | ||||
|                 continue; | ||||
|             } | ||||
|  | ||||
|             // Exclude Mass Mail if disabled in global configuration | ||||
|             if ($item->scope === 'massmail' && ($app->get('massmailoff', 0) == 1)) { | ||||
|                 $parent->removeChild($item); | ||||
|                 continue; | ||||
|             } | ||||
|  | ||||
|             // Exclude item if the component is not authorised | ||||
|             $assetName = $item->element; | ||||
|  | ||||
|             if ($item->element === 'com_categories') { | ||||
|                 $assetName = $query['extension'] ?? 'com_content'; | ||||
|             } elseif ($item->element === 'com_fields') { | ||||
|                 parse_str($item->link, $query); | ||||
|  | ||||
|                 // Only display Fields menus when enabled in the component | ||||
|                 $createFields = null; | ||||
|  | ||||
|                 if (isset($query['context'])) { | ||||
|                     $createFields = ComponentHelper::getParams(strstr($query['context'], '.', true))->get('custom_fields_enable', 1); | ||||
|                 } | ||||
|  | ||||
|                 if (!$createFields || !$user->authorise('core.manage', 'com_users')) { | ||||
|                     $parent->removeChild($item); | ||||
|                     continue; | ||||
|                 } | ||||
|             } elseif ($item->element === 'com_workflow') { | ||||
|                 parse_str($item->link, $query); | ||||
|  | ||||
|                 // Only display Workflow menus when enabled in the component | ||||
|                 $workflow = null; | ||||
|  | ||||
|                 if (isset($query['extension'])) { | ||||
|                     $parts = explode('.', $query['extension']); | ||||
|  | ||||
|                     $workflow = ComponentHelper::getParams($parts[0])->get('workflow_enabled') && $user->authorise('core.manage.workflow', $parts[0]); | ||||
|                 } | ||||
|  | ||||
|                 if (!$workflow) { | ||||
|                     $parent->removeChild($item); | ||||
|                     continue; | ||||
|                 } | ||||
|  | ||||
|                 [$assetName] = isset($query['extension']) ? explode('.', $query['extension'], 2) : ['com_workflow']; | ||||
|             } elseif (\in_array($item->element, ['com_config', 'com_privacy', 'com_actionlogs'], true) && !$user->authorise('core.admin')) { | ||||
|                 // Special case for components which only allow super user access | ||||
|                 $parent->removeChild($item); | ||||
|                 continue; | ||||
|             } elseif ($item->element === 'com_joomlaupdate' && !$user->authorise('core.admin')) { | ||||
|                 $parent->removeChild($item); | ||||
|                 continue; | ||||
|             } elseif ( | ||||
|                 ($item->link === 'index.php?option=com_installer&view=install' || $item->link === 'index.php?option=com_installer&view=languages') | ||||
|                 && !$user->authorise('core.admin') | ||||
|             ) { | ||||
|                 continue; | ||||
|             } elseif ($item->element === 'com_admin') { | ||||
|                 parse_str($item->link, $query); | ||||
|  | ||||
|                 if (isset($query['view']) && $query['view'] === 'sysinfo' && !$user->authorise('core.admin')) { | ||||
|                     $parent->removeChild($item); | ||||
|                     continue; | ||||
|                 } | ||||
|             } elseif ($item->element === 'com_menus') { | ||||
|                 // Get badges for Menus containing a Home page. | ||||
|                 $iconImage = $item->icon; | ||||
|  | ||||
|                 if ($iconImage) { | ||||
|                     if (substr($iconImage, 0, 6) === 'class:' && substr($iconImage, 6) === 'icon-home') { | ||||
|                         $iconImage = '<span class="home-image icon-home" aria-hidden="true"></span>'; | ||||
|                         $iconImage .= '<span class="visually-hidden">' . Text::_('JDEFAULT') . '</span>'; | ||||
|                     } elseif (substr($iconImage, 0, 6) === 'image:') { | ||||
|                         $iconImage = ' <span class="badge bg-secondary">' . substr($iconImage, 6) . '</span>'; | ||||
|                     } | ||||
|  | ||||
|                     $item->iconImage = $iconImage; | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             if ($assetName && !$user->authorise(($item->scope === 'edit') ? 'core.create' : 'core.manage', $assetName)) { | ||||
|                 $parent->removeChild($item); | ||||
|                 continue; | ||||
|             } | ||||
|  | ||||
|             if ($item->hasChildren()) { | ||||
|                 self::preprocess($item); | ||||
|             } | ||||
|  | ||||
|             // Ok we passed everything, load language at last only | ||||
|             if ($item->element) { | ||||
|                 $language->load($item->element . '.sys', JPATH_ADMINISTRATOR) || | ||||
|                 $language->load($item->element . '.sys', JPATH_ADMINISTRATOR . '/components/' . $item->element); | ||||
|             } | ||||
|  | ||||
|             if ($item->type === 'separator' && $item->getParams()->get('text_separator') == 0) { | ||||
|                 $item->title = ''; | ||||
|             } | ||||
|  | ||||
|             $item->text = Text::_($item->title); | ||||
|         } | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user