Rev 16945 | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |
<?php
/**
* Menu Helper Template
*
* Este archivo genera el menú del sidebar dinámicamente basado en:
* - El tipo de usuario (empresa o sistema)
* - Los permisos ACL del usuario actual
* - La estructura de menú definida en acl.config.php
*/
// Obtener información del usuario actual
$currentUserPlugin = $this->currentUserHelper();
$currentUser = $currentUserPlugin->getUser();
$currentCompany = $currentUserPlugin->getCompany();
// Seleccionar el menú apropiado según el contexto
if ($currentCompany) {
// Usuario de empresa: cargar menú de empresa
$menu = getAclMenuCompany();
} else {
// Usuario de sistema: cargar menú de administración del sistema
$menu = getAclMenuSystem();
}
// Obtener el tipo de usuario para validación de permisos
$usertype_id = $currentUser->usertype_id;
// Procesar la URI actual para resaltar elementos activos del menú
$request_uri = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : '';
if ($request_uri) {
// Remover slash inicial si existe
if (substr($request_uri, 0, 1) == '/') {
$request_uri = substr($request_uri, 1);
}
// Remover slash final si existe
if (substr($request_uri, strlen($request_uri) - 1, 1) == '/') {
$request_uri = substr($request_uri, 0, strlen($request_uri) - 1);
}
}
// Obtener el objeto ACL para validación de permisos
$acl = $this->viewModel()->getCurrent()->getVariable('acl');
// Contador para IDs únicos de elementos colapsables
$liCount = 0;
// Iterar sobre el primer nivel del menú (categorías principales)
foreach ($menu as $level1) :
// Validar que el elemento existe y el usuario tiene permisos
if (!$level1 || !$level1['route'] || !$acl->isAllowed($usertype_id, $level1['route'])) {
continue;
}
$liCount++;
// Si no tiene páginas hijas, es un enlace directo
if (empty($level1['pages'])) :
?>
<!-- Elemento de menú directo (sin submenús) -->
<li class="nav-item">
<a href="/<?php echo $level1['route'] ?>" class="nav-link">
<span class="link-title"><?php echo $level1['label'] ?></span>
</a>
</li>
<?php else : ?>
<!-- Categoría de menú con submenús -->
<li class="nav-item nav-category"><?php echo $level1['label'] ?></li>
<?php
// Iterar sobre el segundo nivel del menú (módulos)
foreach ($level1['pages'] as $level2) :
// Validar permisos para el segundo nivel
if (!$level2 || !$level2['route'] || !$acl->isAllowed($usertype_id, $level2['route'])) {
continue;
}
$liCount++;
// Si no tiene subpáginas, es un enlace directo de segundo nivel
if (empty($level2['pages'])) :
?>
<!-- Elemento de segundo nivel (enlace directo) -->
<li class="nav-item">
<a href="/<?php echo $level2['route'] ?>" class="nav-link">
<span class="link-title"><?php echo $level2['label'] ?></span>
</a>
</li>
<?php else : ?>
<!-- Elemento de segundo nivel con submenús colapsables -->
<li class="nav-item">
<a class="nav-link"
data-bs-toggle="collapse"
href="#li<?php echo $liCount; ?>"
role="button"
aria-expanded="false"
aria-controls="li<?php echo $liCount; ?>">
<span class="link-title"><?php echo $level2['label'] ?></span>
</a>
<!-- Contenedor colapsable para submenús -->
<div class="collapse" id="li<?php echo $liCount; ?>">
<ul class="nav sub-menu">
<?php
// Iterar sobre el tercer nivel del menú (subpáginas)
foreach ($level2['pages'] as $level3) :
// Validar permisos para el tercer nivel
if (!$level3 || !$level3['route'] || !$acl->isAllowed($usertype_id, $level3['route'])) {
continue;
}
$liCount++;
// Si no tiene subpáginas de cuarto nivel, es un enlace directo
if (empty($level3['pages'])) :
?>
<!-- Elemento de tercer nivel (enlace directo) -->
<li class="nav-item">
<a href="/<?php echo $level3['route'] ?>" class="nav-link">
<?php echo $level3['label'] ?>
</a>
</li>
<?php else : ?>
<!-- Elemento de tercer nivel con submenús de cuarto nivel -->
<li class="nav-item">
<a href="#li<?php echo $liCount; ?>" class="nav-link">
<?php echo $level3['label'] ?>
</a>
<!-- Submenú de cuarto nivel -->
<ul class="nav sub-menu">
<?php
// Iterar sobre el cuarto nivel del menú
foreach ($level3['pages'] as $level4) :
// Validar permisos para el cuarto nivel
if (!$level4 || !$level4['route'] || !$acl->isAllowed($usertype_id, $level4['route'])) {
continue;
}
$liCount++;
?>
<!-- Elemento de cuarto nivel (enlace directo) -->
<li class="nav-item">
<a href="/<?php echo $level4['route'] ?>" class="nav-link">
<?php echo $level4['label'] ?>
</a>
</li>
<?php endforeach; ?>
</ul>
</li>
<?php endif; ?>
<?php endforeach; ?>
</ul>
</div>
</li>
<?php endif; ?>
<?php endforeach; ?>
<?php endif; ?>
<?php endforeach; ?>