@@ -226,17 +226,74 @@ public static function replaceAdditionals($id_module, $query)
226226 /**
227227 * Restituisce tutte le informazioni dei moduli installati in una scala gerarchica fino alla profondità indicata.
228228 *
229+ * @param bool $filter_permissions Se true, filtra solo i moduli con permessi di accesso
229230 * @return array
230231 */
231- public static function getHierarchy ()
232+ public static function getHierarchy ($ filter_permissions = false )
232233 {
233234 if (!isset (self ::$ hierarchy )) {
234235 self ::$ hierarchy = Module::getHierarchy ()->toArray ();
235236 }
236237
238+ if ($ filter_permissions ) {
239+ return self ::filterHierarchyByPermissions (self ::$ hierarchy );
240+ }
241+
237242 return self ::$ hierarchy ;
238243 }
239244
245+ /**
246+ * Restituisce la gerarchia dei moduli filtrata per i permessi di accesso.
247+ *
248+ * @return array
249+ */
250+ public static function getAvailableHierarchy ()
251+ {
252+ return self ::getHierarchy (true );
253+ }
254+
255+ /**
256+ * Filtra ricorsivamente la gerarchia dei moduli in base ai permessi di accesso.
257+ *
258+ * @param array $hierarchy
259+ * @param array|null $availableModulesIds Cache degli ID dei moduli disponibili per ottimizzare le performance
260+ * @return array
261+ */
262+ protected static function filterHierarchyByPermissions ($ hierarchy , $ availableModulesIds = null )
263+ {
264+ // Ottimizzazione: carica una sola volta i moduli disponibili
265+ if ($ availableModulesIds === null ) {
266+ $ availableModules = self ::getAvailableModules ();
267+ // Crea un array associativo per lookup veloce
268+ $ availableModulesIds = [];
269+ foreach ($ availableModules as $ module ) {
270+ $ availableModulesIds [$ module ->id ] = true ;
271+ }
272+ }
273+
274+ $ filtered = [];
275+
276+ foreach ($ hierarchy as $ element ) {
277+ // Verifica se l'elemento ha permessi di accesso usando il cache
278+ $ hasPermission = isset ($ availableModulesIds [$ element ['id ' ]]) && !empty ($ element ['enabled ' ]);
279+
280+ // Filtra ricorsivamente i figli
281+ $ filteredChildren = [];
282+ if (!empty ($ element ['all_children ' ])) {
283+ $ filteredChildren = self ::filterHierarchyByPermissions ($ element ['all_children ' ], $ availableModulesIds );
284+ }
285+
286+ // Include l'elemento se ha permessi o se ha figli con permessi
287+ if ($ hasPermission || !empty ($ filteredChildren )) {
288+ $ element ['all_children ' ] = $ filteredChildren ;
289+ $ element ['has_permission ' ] = $ hasPermission ;
290+ $ filtered [] = $ element ;
291+ }
292+ }
293+
294+ return $ filtered ;
295+ }
296+
240297 /**
241298 * Restituisce il menu principale del progetto.
242299 *
@@ -246,7 +303,8 @@ public static function getHierarchy()
246303 */
247304 public static function getMainMenu ($ depth = 3 )
248305 {
249- $ menus = self ::getHierarchy ();
306+ // Utilizza la gerarchia filtrata per i permessi per ottimizzare le performance
307+ $ menus = self ::getAvailableHierarchy ();
250308
251309 $ module = Modules::getCurrent ();
252310 $ module_name = isset ($ module ) ? $ module ->getTranslation ('title ' ) : '' ;
@@ -319,25 +377,30 @@ public static function filepath($element, $file)
319377 * @param int $max_depth
320378 * @param int $actual_depth
321379 *
322- * @return string
380+ * @return array Array contenente [html_string, is_active, should_show]
323381 */
324382 protected static function sidebarMenu ($ element , $ actual = null , $ max_depth = 3 , $ actual_depth = 0 )
325383 {
326384 if ($ actual_depth >= $ max_depth ) {
327- return '' ;
385+ return [ '' , false , false ] ;
328386 }
329387
330388 $ link = (!empty ($ element ['option ' ]) && $ element ['option ' ] != 'menu ' ) ? base_path ().'/controller.php?id_module= ' .$ element ['id ' ] : 'javascript:; ' ;
331389 $ title = $ element ['title ' ];
332390 $ target = '_self ' ;
333391 $ active = ($ actual == $ title );
334- $ show = (self ::getPermission ($ element ['id ' ]) != '- ' && !empty ($ element ['enabled ' ])) ? true : false ;
392+
393+ // Utilizza le informazioni sui permessi già filtrate se disponibili
394+ // Altrimenti fallback alla verifica tradizionale per compatibilità
395+ $ show = isset ($ element ['has_permission ' ]) ?
396+ $ element ['has_permission ' ] :
397+ (self ::getPermission ($ element ['id ' ]) != '- ' && !empty ($ element ['enabled ' ]));
335398
336399 $ submenus = $ element ['all_children ' ];
337400 if (!empty ($ submenus )) {
338401 $ temp = '' ;
339402 foreach ($ submenus as $ submenu ) {
340- $ r = self ::sidebarMenu ($ submenu , $ actual , $ actual_depth + 1 );
403+ $ r = self ::sidebarMenu ($ submenu , $ actual , $ max_depth , $ actual_depth + 1 );
341404 $ active = $ active || $ r [1 ];
342405 if (!$ show && $ r [2 ]) {
343406 $ link = 'javascript:; ' ;
0 commit comments