cuadro_clasificacion.php Árbol jerárquico (cuadro ISAD(G)) 1 líneas
1
<?php
$titulo_pagina = 'Cuadro de Clasificación';
require_once 'conexion.php';
require_once 'helpers.php';
require_once 'header.php';

$niveles_abiertos = [
    'Fondo',
    '1era División de Fondo',
    '2da División de Fondo',
    'Subfondo',
    ];

$sql = "SELECT id, parent_id, titulo, nivel_descripcion, codigo_referencia
        FROM descripcion_isadg
        ORDER BY nivel_descripcion, codigo_referencia ASC";

$resultado = mysqli_query($conexion, $sql);

if (!$resultado) {
    die('<p class="alerta alerta--error">Error al consultar el árbol: '
        . h(mysqli_error($conexion)) . '</p>');
}

$arbol_indexado = [];
while ($fila = mysqli_fetch_assoc($resultado)) {
    $pid = $fila['parent_id'] ?? null;
    $arbol_indexado[$pid][] = $fila;
}
mysqli_free_result($resultado);

function renderizar_nodo(
    ?int $padre_id,
    array &$arbol,
    bool $es_admin,
    array $niveles_abiertos,
    bool $es_raiz = false
): void {

    if (!isset($arbol[$padre_id])) {
        return;
    }

    echo '<ul class="atom-rama">';

    foreach ($arbol[$padre_id] as $nodo) {

        $id          = (int) $nodo['id'];
        $titulo      = h($nodo['titulo']);
        $codigo      = h($nodo['codigo_referencia']);
        $nivel       = $nodo['nivel_descripcion'];
        $prefijo     = prefijo_nivel($nivel);
        $tiene_hijos = isset($arbol[$id]);
        $abrir       = in_array($nivel, $niveles_abiertos, true);

        echo '<li class="atom-nodo">';

        if ($tiene_hijos) {
            $open_attr = $abrir ? ' open' : '';
            echo '<details' . $open_attr . '>';
            echo '<summary class="atom-fila">';
                echo '<span class="atom-toggle"></span>';
                echo '<span class="atom-prefijo nivel-' . strtolower($prefijo) . '">[' . $prefijo . ']</span>';
                echo '<a href="/apps/side-arc/ficha.php?id=' . $id . '" class="atom-titulo" onclick="event.stopPropagation()">'
                    . $titulo . '</a>';
                echo '<span class="atom-fila-derecha">';
                    if (!empty($codigo)) {
                        echo '<span class="atom-codigo">' . $codigo . '</span>';
                    }
                    if ($es_admin) {
                        echo '<a href="/apps/side-arc/ingreso.php?parent_id=' . $id . '" '
                            . 'class="btn btn--agregar-hijo" '
                            . 'onclick="event.stopPropagation()" '
                            . 'title="Agregar registro subordinado">+ Subordinado</a>';
                    }
                echo '</span>';
            echo '</summary>';
            renderizar_nodo($id, $arbol, $es_admin, $niveles_abiertos);
            echo '</details>';

        } else {
            echo '<div class="atom-fila">';
                echo '<span class="atom-toggle sin-hijos"></span>';
                echo '<span class="atom-prefijo nivel-' . strtolower($prefijo) . '">[' . $prefijo . ']</span>';
                echo '<a href="/apps/side-arc/ficha.php?id=' . $id . '" class="atom-titulo">'
                    . $titulo . '</a>';
                echo '<span class="atom-fila-derecha">';
                    if (!empty($codigo)) {
                        echo '<span class="atom-codigo">' . $codigo . '</span>';
                    }
                    if ($es_admin && $nivel !== 'Unidad Documental Simple') {
                        echo '<a href="/apps/side-arc/ingreso.php?parent_id=' . $id . '" '
                            . 'class="btn btn--agregar-hijo" '
                            . 'title="Agregar registro subordinado">+ Subordinado</a>';
                    }
                echo '</span>';
            echo '</div>';
        }

        echo '</li>';
    }

    echo '</ul>';
}
?>

<div class="cuadro-pagina">

    <div class="cuadro-header">
        <h1 class="cuadro-header__titulo">Cuadro de Clasificación</h1>
        <?php if ($es_admin): ?>
            <a href="/apps/side-arc/ingreso.php" class="btn-add-fondo">
                Ingresar nuevo Fondo
            </a>
        <?php endif; ?>
    </div>

    <?php
    $check = mysqli_query($conexion, "SELECT COUNT(*) AS total FROM descripcion_isadg");
    $total = mysqli_fetch_assoc($check)['total'];

    if ($total == 0):
    ?>
        <div class="alerta alerta--info">
            El fondo documental está vacío.
            <?php if ($es_admin): ?>
                <a href="/apps/side-arc/ingreso.php">Cree el primer registro</a>.
            <?php else: ?>
                Contacte al administrador del sistema.
            <?php endif; ?>
        </div>
    <?php else: ?>
        <div class="cuadro-arbol-box" role="tree">
            <?php renderizar_nodo(null, $arbol_indexado, $es_admin, $niveles_abiertos, true); ?>
        </div>
    <?php endif; ?>

</div>

<?php
mysqli_close($conexion);
require_once 'footer.php';
?>