Proyectos de Subversion Moodle

Rev

Rev 291 | Rev 379 | Ir a la última revisión | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |

<?php

require_once(__DIR__ . '/cesa.php');

class StaticsBlocks extends Cesa
{

    public function __construct($title)
    {
        global $USER, $PAGE, $SITE;
        require_login(null, false);

        if (isguestuser()) {
            throw new require_login_exception('Guests are not allowed here.');
        }

        $this->userID = optional_param('userid', $USER->id, PARAM_INT);
        $this->currentUser = $this->userID == $USER->id;
        $this->user = core_user::get_user($this->userID);
        $this->title = get_string($title);
        $this->blockManager = $PAGE->blocks;

        // Definimos varias regiones
        $this->regions = ['side-post', 'side-pre', 'bellow-content', 'right'];
        $this->blockNames = ['cesa_course_rating', 'comments', 'messageteacher', 'mynotes'];
        $this->blockExists = true;

        if (!$this->user || !core_user::is_real_user($this->userID)) {
            throw new moodle_exception('invaliduser', 'error');
        }

        // Asignar y validar los bloques en todas las regiones
        foreach ($this->regions as $region) {
            $this->regionName = $region;

            // Añadir la región si no existe
            $this->addRegion($this->regionName);

            // Validar si los bloques existen
            if (!$this->validateIfExistBlocks($this->regionName)) {
                // Añadir bloques si no existen
                $this->addBlocksIfNotExist($this->regionName);
            }
        }
    }

    public function addRegion($region)
    {
        // Validación alternativa: Verificamos si la región está en una lista predefinida de regiones.
        $existingRegions = $this->blockManager->get_regions();

        // Si la región no está presente en las regiones existentes, la añadimos.
        if (!in_array($region, $existingRegions)) {
            $this->blockManager->add_region($region);
        }
    }

    public function validateIfExistBlocks($region)
    {
        // Obtener los bloques de la región actual.
        $blocks = $this->blockManager->get_blocks_for_region($region);

        // Crear un array para llevar el registro de los bloques encontrados.
        $foundBlocks = [];

        // Validar si todos los bloques especificados existen en esta región y que no se repitan.
        foreach ($blocks as $block) {
            $blockClass = get_class($block);
            if (in_array($blockClass, $foundBlocks)) {
                // Si el bloque ya fue encontrado antes, devolvemos false.
                return false;
            }
            $foundBlocks[] = $blockClass;
        }

        // Verificar si todos los bloques especificados están en la región.
        foreach ($this->blockNames as $blockName) {
            $expectedBlockClass = 'block_' . $blockName;
            if (!in_array($expectedBlockClass, $foundBlocks)) {
                // Si algún bloque esperado no se encuentra, devolvemos false.
                return false;
            }
        }

        // Si todos los bloques existen y son únicos, devolvemos true.
        return true;
    }

    public function addBlocksIfNotExist($page = 'courses')
    {
        // Obtener los bloques actuales en todas las regiones
        $allBlocks = [];
        foreach ($this->regions as $region) {
            $blocks = $this->blockManager->get_blocks_for_region($region);
            foreach ($blocks as $block) {
                $blockClass = get_class($block);
                if (!isset($allBlocks[$blockClass])) {
                    $allBlocks[$blockClass] = $region;
                } else {
                    // Si el bloque ya existe en otra región, marcarlo como duplicado
                    $allBlocks[$blockClass] = 'duplicate';
                }
            }
        }

        $count = 1;

        // Añadir los bloques si no existen en la región actual
        foreach ($this->blockNames as $blockName) {
            $expectedBlockClass = 'block_' . $blockName;

            // Verificar si el bloque es único y no está marcado como duplicado
            if (!isset($allBlocks[$expectedBlockClass]) || $allBlocks[$expectedBlockClass] === $this->regionName) {
                // Solo añadir el bloque si no está en la lista de bloques existentes de la región actual
                if (!$this->blockExistsInRegion($expectedBlockClass, $this->regionName)) {
                    $this->blockManager->add_block($blockName, $this->regionName, $count, true);
                    $count = $count + 1;
                }
            }
        }
    }

    private function blockExistsInRegion($blockClass, $region)
    {
        // Obtener los bloques actuales en la región especificada
        $blocks = $this->blockManager->get_blocks_for_region($region);

        // Verificar si el bloque ya existe en la región
        foreach ($blocks as $block) {
            if (get_class($block) === $blockClass) {
                return true;
            }
        }

        return false;
    }


    public function renderBlocks()
    {
        global $OUTPUT;

        $blocksView = '';
        // Renderizar bloques para cada región
        foreach ($this->regions as $region) {
            $this->regionName = $region;
            $this->blockManager->load_blocks(true); // Cargar bloques en la región
            $blocksView .= $OUTPUT->blocks_for_region($this->regionName); // Renderizar bloques
        }

        return $blocksView; // Devolver bloques renderizados
    }
}



/* // Instanciamos y renderizamos la página con los bloques estáticos
$statics_blocks = new StaticsBlocks();
echo $statics_blocks->renderBlocks(); */