Rev 292 | Rev 379 | Ir a la última revisión | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |
<?phprequire_once(__DIR__ . '/cesa.php');class StaticsBlocks extends Cesa{public $regions = ['side-post', 'side-pre', 'bellow-content', 'right'];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->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 regionesforeach ($this->regions as $region) {$this->regionName = $region;// Añadir la región si no existe$this->addRegion($this->regionName);// Validar si los bloques existenif (!$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 actualforeach ($this->blockNames as $blockName) {$expectedBlockClass = 'block_' . $blockName;// Verificar si el bloque es único y no está marcado como duplicadoif (!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 actualif (!$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ónforeach ($blocks as $block) {if (get_class($block) === $blockClass) {return true;}}return false;}public function renderBlocks(){global $OUTPUT;$blocksView = '';// Renderizar bloques para cada regiónforeach ($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(); */