Autoría | Ultima modificación | Ver Log |
<?php// This file is part of Moodle - http://moodle.org///// Moodle is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.//// Moodle is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.//// You should have received a copy of the GNU General Public License// along with Moodle. If not, see <http://www.gnu.org/licenses/>./*** format_buttons_renderer** @package format_buttons* @author Rodrigo Brandão <https://www.linkedin.com/in/brandaorodrigo>* @copyright 2020 Rodrigo Brandão <rodrigo.brandao.contato@gmail.com>* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later*/defined('MOODLE_INTERNAL') || die();require_once($CFG->dirroot.'/course/format/topics/renderer.php');/*** Format_buttons_renderer** @package format_buttons* @author Rodrigo Brandão <https://www.linkedin.com/in/brandaorodrigo>* @copyright 2020 Rodrigo Brandão <rodrigo.brandao.contato@gmail.com>* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later*/class format_buttons_renderer extends format_topics_renderer{/*** Get_button_section** @param stdclass $course* @param string $name* @return string*/protected function get_color_config($course, $name) {$return = false;if (isset($course->{$name})) {$color = str_replace('#', '', $course->{$name});$color = substr($color, 0, 6);if (preg_match('/^#?[a-f0-9]{6}$/i', $color)) {$return = '#'.$color;}}return $return;}/*** Number_to_roman** @param integer $number* @return string*/protected function number_to_roman($number) {$number = intval($number);$return = '';$romanarray = ['M' => 1000,'CM' => 900,'D' => 500,'CD' => 400,'C' => 100,'XC' => 90,'L' => 50,'XL' => 40,'X' => 10,'IX' => 9,'V' => 5,'IV' => 4,'I' => 1];foreach ($romanarray as $roman => $value) {$matches = intval($number / $value);$return .= str_repeat($roman, $matches);$number = $number % $value;}return $return;}/*** Number_to_alphabet** @param integer $number* @return string*/protected function number_to_alphabet($number) {$number = $number - 1;$alphabet = range("A", "Z");if ($number <= 25) {return $alphabet[$number];} else if ($number > 25) {$dividend = ($number + 1);$alpha = '';while ($dividend > 0) {$modulo = ($dividend - 1) % 26;$alpha = $alphabet[$modulo] . $alpha;$dividend = floor((($dividend - $modulo) / 26));}return $alpha;}}/*** Get_button_section** @param stdclass $course* @param string $sectionvisible* @return string*/protected function get_button_section($course, $sectionvisible) {global $PAGE;$html = '';$css = '';if ($colorcurrent = $this->get_color_config($course, 'colorcurrent')) {$css .='#buttonsectioncontainer .buttonsection.current {background: ' . $colorcurrent . ';}';}if ($colorvisible = $this->get_color_config($course, 'colorvisible')) {$css .='#buttonsectioncontainer .buttonsection.sectionvisible {background: ' . $colorvisible . ';}';}if ($css) {$html .= html_writer::tag('style', $css);}$withoutdivisor = true;for ($k = 1; $k <= 12; $k++) {if ($course->{'divisor' . $k}) {$withoutdivisor = false;}}if ($withoutdivisor) {$course->divisor1 = 999;}$divisorshow = false;$count = 1;$currentdivisor = 1;$modinfo = get_fast_modinfo($course);$inline = '';foreach ($modinfo->get_section_info_all() as $section => $thissection) {if ($section == 0) {continue;}if ($section > $course->numsections) {continue;}if ($course->hiddensections && !(int)$thissection->visible) {continue;}if (isset($course->{'divisor' . $currentdivisor}) &&$count > $course->{'divisor' . $currentdivisor}) {$currentdivisor++;$count = 1;}if (isset($course->{'divisor' . $currentdivisor}) &&$course->{'divisor' . $currentdivisor} != 0 &&!isset($divisorshow[$currentdivisor])) {$currentdivisorhtml = format_string($course->{'divisortext' . $currentdivisor});$currentdivisorhtml = str_replace('[br]', '<br>', $currentdivisorhtml);$currentdivisorhtml = html_writer::tag('div', $currentdivisorhtml, ['class' => 'divisortext']);if ($course->inlinesections) {$inline = 'inlinebuttonsections';}$html .= html_writer::tag('div', $currentdivisorhtml, ['class' => "divisorsection $inline"]);$divisorshow[$currentdivisor] = true;}$id = 'buttonsection-' . $section;if ($course->sequential) {$name = $section;} else {if (isset($course->{'divisor' . $currentdivisor}) &&$course->{'divisor' . $currentdivisor} == 1) {$name = '•••';} else {$name = $count;}}if ($course->sectiontype == 'alphabet' && is_numeric($name)) {$name = $this->number_to_alphabet($name);}if ($course->sectiontype == 'roman' && is_numeric($name)) {$name = $this->number_to_roman($name);}$class = 'buttonsection';$onclick = 'M.format_buttons.show(' . $section . ',' . $course->id . ')';if (!$thissection->available &&!empty($thissection->availableinfo)) {$class .= ' sectionhidden';} else if (!$thissection->uservisible || !$thissection->visible) {$class .= ' sectionhidden';$onclick = false;}if ($course->marker == $section) {$class .= ' current';}if ($sectionvisible == $section) {$class .= ' sectionvisible';}if ($PAGE->user_is_editing()) {$onclick = false;}$html .= html_writer::tag('div', $name, ['id' => $id, 'class' => $class, 'onclick' => $onclick]);$count++;}$html = html_writer::tag('div', $html, ['id' => 'buttonsectioncontainer', 'class' => $course->buttonstyle]);if ($PAGE->user_is_editing()) {$html .= html_writer::tag('div', get_string('editing', 'format_buttons'), ['class' => 'alert alert-warning alert-block fade in']);}return $html;}/*** Start_section_list** @return string*/protected function start_section_list() {return html_writer::start_tag('ul', ['class' => 'buttons']);}/*** Section_header** @param stdclass $section* @param stdclass $course* @param bool $onsectionpage* @param int $sectionreturn* @return string*/protected function section_header($section, $course, $onsectionpage, $sectionreturn = null) {global $PAGE;$o = '';$currenttext = '';$sectionstyle = '';if ($section->section != 0) {// Only in the non-general sections.if (!$section->visible) {$sectionstyle = ' hidden';}if (course_get_format($course)->is_section_current($section)) {$sectionstyle = ' current';}}$o.= html_writer::start_tag('li', array('id' => 'section-'.$section->section,'class' => 'section main clearfix'.$sectionstyle, 'role'=>'region','aria-label'=> get_section_name($course, $section)));// Create a span that contains the section title to be used to create the keyboard section move menu.$o .= html_writer::tag('span', get_section_name($course, $section), array('class' => 'hidden sectionname'));$leftcontent = $this->section_left_content($section, $course, $onsectionpage);$o.= html_writer::tag('div', $leftcontent, array('class' => 'left side'));$rightcontent = $this->section_right_content($section, $course, $onsectionpage);$o.= html_writer::tag('div', $rightcontent, array('class' => 'right side'));$o.= html_writer::start_tag('div', array('class' => 'content'));// When not on a section page, we display the section titles except the general section if null$hasnamenotsecpg = (!$onsectionpage && ($section->section != 0 || !is_null($section->name)));// When on a section page, we only display the general section title, if title is not the default one$hasnamesecpg = ($onsectionpage && ($section->section == 0 && !is_null($section->name)));$classes = ' accesshide';if ($hasnamenotsecpg || $hasnamesecpg) {$classes = '';}$sectionname = html_writer::tag('span', $this->section_title($section, $course));// Button format - iniif ($course->showdefaultsectionname) {$o.= $this->output->heading($sectionname, 3, 'sectionname' . $classes);}// Button format - end$o .= $this->section_availability($section);$o .= html_writer::start_tag('div', array('class' => 'summary'));if ($section->uservisible || $section->visible) {// Show summary if section is available or has availability restriction information.// Do not show summary if section is hidden but we still display it because of course setting// "Hidden sections are shown in collapsed form".$o .= $this->format_summary_text($section);}$o .= html_writer::end_tag('div');return $o;}/*** Print_multiple_section_page** @param stdclass $course* @param array $sections (argument not used)* @param array $mods (argument not used)* @param array $modnames (argument not used)* @param array $modnamesused (argument not used)*/public function print_multiple_section_page($course, $sections, $mods, $modnames, $modnamesused) {global $PAGE;$modinfo = get_fast_modinfo($course);$course = course_get_format($course)->get_course();$context = context_course::instance($course->id);// Title with completion help icon.$completioninfo = new completion_info($course);// buttons format - iniif (isset($_COOKIE['sectionvisible_' . $course->id])) {$sectionvisible = $_COOKIE['sectionvisible_' . $course->id];} else if ($course->marker > 0) {$sectionvisible = $course->marker;} else {$sectionvisible = 1;}$htmlsection = false;foreach ($modinfo->get_section_info_all() as $section => $thissection) {$htmlsection[$section] = '';if ($section == 0) {$section0 = $thissection;continue;}if ($section > $course->numsections) {continue;}/* If is not editing verify the rules to display the sections */if (!$PAGE->user_is_editing()) {if ($course->hiddensections && !(int)$thissection->visible) {continue;}if (!$thissection->available && !empty($thissection->availableinfo)) {$htmlsection[$section] .= $this->section_header($thissection, $course, false, 0);continue;}if (!$thissection->uservisible || !$thissection->visible) {$htmlsection[$section] .= $this->section_hidden($section, $course->id);continue;}}$htmlsection[$section] .= $this->section_header($thissection, $course, false, 0);if ($thissection->uservisible) {$htmlsection[$section] .= $this->courserenderer->course_section_cm_list($course, $thissection, 0);$htmlsection[$section] .= $this->courserenderer->course_section_add_cm_control($course, $section, 0);}$htmlsection[$section] .= $this->section_footer();}if ($section0->summary || !empty($modinfo->sections[0]) || $PAGE->user_is_editing()) {$htmlsection0 = $this->section_header($section0, $course, false, 0);$htmlsection0 .= $this->courserenderer->course_section_cm_list($course, $section0, 0);$htmlsection0 .= $this->courserenderer->course_section_add_cm_control($course, 0, 0);$htmlsection0 .= $this->section_footer();}echo $completioninfo->display_help_icon();echo $this->output->heading($this->page_title(), 2, 'accesshide');echo $this->course_activity_clipboard($course, 0);echo $this->start_section_list();if ($course->sectionposition == 0 and isset($htmlsection0)) {echo html_writer::tag('span', $htmlsection0, ['class' => 'above']);}echo $this->get_button_section($course, $sectionvisible);foreach ($htmlsection as $current) {echo $current;}if ($course->sectionposition == 1 and isset($htmlsection0)) {echo html_writer::tag('span', $htmlsection0, ['class' => 'below']);}if ($PAGE->user_is_editing() and has_capability('moodle/course:update', $context)) {foreach ($modinfo->get_section_info_all() as $section => $thissection) {if ($section <= $course->numsections or empty($modinfo->sections[$section])) {continue;}echo $this->stealth_section_header($section);echo $this->courserenderer->course_section_cm_list($course, $thissection, 0);echo $this->stealth_section_footer();}echo $this->end_section_list();echo html_writer::start_tag('div', ['id' => 'changenumsections', 'class' => 'mdl-right']);$straddsection = get_string('increasesections', 'moodle');$url = new moodle_url('/course/changenumsections.php', ['courseid' => $course->id,'increase' => true, 'sesskey' => sesskey()]);$icon = $this->output->pix_icon('t/switch_plus', $straddsection);echo html_writer::link($url, $icon.get_accesshide($straddsection), ['class' => 'increase-sections']);if ($course->numsections > 0) {$strremovesection = get_string('reducesections', 'moodle');$url = new moodle_url('/course/changenumsections.php', ['courseid' => $course->id,'increase' => false, 'sesskey' => sesskey()]);$icon = $this->output->pix_icon('t/switch_minus', $strremovesection);echo html_writer::link($url,$icon.get_accesshide($strremovesection),['class' => 'reduce-sections']);}echo html_writer::end_tag('div');} else {echo $this->end_section_list();}if (!$PAGE->user_is_editing()) {$PAGE->requires->js_init_call('M.format_buttons.init', [$course->numsections, $sectionvisible, $course->id]);}// Button format - end}}