Proyectos de Subversion LeadersLinked - Backend

Rev

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; ?>