Skip to content

Commit 9ce5015

Browse files
committed
fix: caricamento moduli
1 parent d4a260c commit 9ce5015

1 file changed

Lines changed: 69 additions & 6 deletions

File tree

src/Modules.php

Lines changed: 69 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)