[ Index ]

PHP Cross Reference of Unnamed Project

title

Body

[close]

/course/format/ -> renderer.php (source)

   1  <?php
   2  // This file is part of Moodle - http://moodle.org/
   3  //
   4  // Moodle is free software: you can redistribute it and/or modify
   5  // it under the terms of the GNU General Public License as published by
   6  // the Free Software Foundation, either version 3 of the License, or
   7  // (at your option) any later version.
   8  //
   9  // Moodle is distributed in the hope that it will be useful,
  10  // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12  // GNU General Public License for more details.
  13  //
  14  // You should have received a copy of the GNU General Public License
  15  // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
  16  
  17  /**
  18   * Base renderer for outputting course formats.
  19   *
  20   * @package core
  21   * @copyright 2012 Dan Poltawski
  22   * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  23   * @since Moodle 2.3
  24   */
  25  
  26  defined('MOODLE_INTERNAL') || die();
  27  
  28  
  29  /**
  30   * This is a convenience renderer which can be used by section based formats
  31   * to reduce code duplication. It is not necessary for all course formats to
  32   * use this and its likely to change in future releases.
  33   *
  34   * @package core
  35   * @copyright 2012 Dan Poltawski
  36   * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  37   * @since Moodle 2.3
  38   */
  39  abstract class format_section_renderer_base extends plugin_renderer_base {
  40  
  41      /** @var contains instance of core course renderer */
  42      protected $courserenderer;
  43  
  44      /**
  45       * Constructor method, calls the parent constructor
  46       *
  47       * @param moodle_page $page
  48       * @param string $target one of rendering target constants
  49       */
  50      public function __construct(moodle_page $page, $target) {
  51          parent::__construct($page, $target);
  52          $this->courserenderer = $this->page->get_renderer('core', 'course');
  53      }
  54  
  55      /**
  56       * Generate the starting container html for a list of sections
  57       * @return string HTML to output.
  58       */
  59      abstract protected function start_section_list();
  60  
  61      /**
  62       * Generate the closing container html for a list of sections
  63       * @return string HTML to output.
  64       */
  65      abstract protected function end_section_list();
  66  
  67      /**
  68       * Generate the title for this section page
  69       * @return string the page title
  70       */
  71      abstract protected function page_title();
  72  
  73      /**
  74       * Generate the section title, wraps it in a link to the section page if page is to be displayed on a separate page
  75       *
  76       * @param stdClass $section The course_section entry from DB
  77       * @param stdClass $course The course entry from DB
  78       * @return string HTML to output.
  79       */
  80      public function section_title($section, $course) {
  81          $title = get_section_name($course, $section);
  82          $url = course_get_url($course, $section->section, array('navigation' => true));
  83          if ($url) {
  84              $title = html_writer::link($url, $title);
  85          }
  86          return $title;
  87      }
  88  
  89      /**
  90       * Generate the section title to be displayed on the section page, without a link
  91       *
  92       * @param stdClass $section The course_section entry from DB
  93       * @param stdClass $course The course entry from DB
  94       * @return string HTML to output.
  95       */
  96      public function section_title_without_link($section, $course) {
  97          return get_section_name($course, $section);
  98      }
  99  
 100      /**
 101       * Generate the edit control action menu
 102       *
 103       * @param array $controls The edit control items from section_edit_control_items
 104       * @param stdClass $course The course entry from DB
 105       * @param stdClass $section The course_section entry from DB
 106       * @return string HTML to output.
 107       */
 108      protected function section_edit_control_menu($controls, $course, $section) {
 109          $o = "";
 110          if (!empty($controls)) {
 111              $menu = new action_menu();
 112              $menu->set_menu_trigger(get_string('edit'));
 113              $menu->attributes['class'] .= ' section-actions';
 114              foreach ($controls as $value) {
 115                  $url = empty($value['url']) ? '' : $value['url'];
 116                  $icon = empty($value['icon']) ? '' : $value['icon'];
 117                  $name = empty($value['name']) ? '' : $value['name'];
 118                  $attr = empty($value['attr']) ? array() : $value['attr'];
 119                  $class = empty($item['pixattr']['class']) ? '' : $item['pixattr']['class'];
 120                  $alt = empty($item['pixattr']['alt']) ? '' : $item['pixattr']['alt'];
 121                  $al = new action_menu_link_secondary(
 122                      new moodle_url($url),
 123                      new pix_icon($icon, $name, null, array('class' => "smallicon " . $class, 'alt' => $alt)),
 124                      $name,
 125                      $attr
 126                  );
 127                  $menu->add($al);
 128              }
 129  
 130              $o .= html_writer::div($this->render($menu), 'section_action_menu');
 131          }
 132  
 133          return $o;
 134      }
 135  
 136      /**
 137       * Generate the content to displayed on the right part of a section
 138       * before course modules are included
 139       *
 140       * @param stdClass $section The course_section entry from DB
 141       * @param stdClass $course The course entry from DB
 142       * @param bool $onsectionpage true if being printed on a section page
 143       * @return string HTML to output.
 144       */
 145      protected function section_right_content($section, $course, $onsectionpage) {
 146          $o = $this->output->spacer();
 147  
 148          $controls = $this->section_edit_control_items($course, $section, $onsectionpage);
 149          $o .= $this->section_edit_control_menu($controls, $course, $section);
 150  
 151          return $o;
 152      }
 153  
 154      /**
 155       * Generate the content to displayed on the left part of a section
 156       * before course modules are included
 157       *
 158       * @param stdClass $section The course_section entry from DB
 159       * @param stdClass $course The course entry from DB
 160       * @param bool $onsectionpage true if being printed on a section page
 161       * @return string HTML to output.
 162       */
 163      protected function section_left_content($section, $course, $onsectionpage) {
 164          $o = $this->output->spacer();
 165  
 166          if ($section->section != 0) {
 167              // Only in the non-general sections.
 168              if (course_get_format($course)->is_section_current($section)) {
 169                  $o = get_accesshide(get_string('currentsection', 'format_'.$course->format));
 170              }
 171          }
 172  
 173          return $o;
 174      }
 175  
 176      /**
 177       * Generate the display of the header part of a section before
 178       * course modules are included
 179       *
 180       * @param stdClass $section The course_section entry from DB
 181       * @param stdClass $course The course entry from DB
 182       * @param bool $onsectionpage true if being printed on a single-section page
 183       * @param int $sectionreturn The section to return to after an action
 184       * @return string HTML to output.
 185       */
 186      protected function section_header($section, $course, $onsectionpage, $sectionreturn=null) {
 187          global $PAGE;
 188  
 189          $o = '';
 190          $currenttext = '';
 191          $sectionstyle = '';
 192  
 193          if ($section->section != 0) {
 194              // Only in the non-general sections.
 195              if (!$section->visible) {
 196                  $sectionstyle = ' hidden';
 197              } else if (course_get_format($course)->is_section_current($section)) {
 198                  $sectionstyle = ' current';
 199              }
 200          }
 201  
 202          $o.= html_writer::start_tag('li', array('id' => 'section-'.$section->section,
 203              'class' => 'section main clearfix'.$sectionstyle, 'role'=>'region',
 204              'aria-label'=> get_section_name($course, $section)));
 205  
 206          // Create a span that contains the section title to be used to create the keyboard section move menu.
 207          $o .= html_writer::tag('span', get_section_name($course, $section), array('class' => 'hidden sectionname'));
 208  
 209          $leftcontent = $this->section_left_content($section, $course, $onsectionpage);
 210          $o.= html_writer::tag('div', $leftcontent, array('class' => 'left side'));
 211  
 212          $rightcontent = $this->section_right_content($section, $course, $onsectionpage);
 213          $o.= html_writer::tag('div', $rightcontent, array('class' => 'right side'));
 214          $o.= html_writer::start_tag('div', array('class' => 'content'));
 215  
 216          // When not on a section page, we display the section titles except the general section if null
 217          $hasnamenotsecpg = (!$onsectionpage && ($section->section != 0 || !is_null($section->name)));
 218  
 219          // When on a section page, we only display the general section title, if title is not the default one
 220          $hasnamesecpg = ($onsectionpage && ($section->section == 0 && !is_null($section->name)));
 221  
 222          $classes = ' accesshide';
 223          if ($hasnamenotsecpg || $hasnamesecpg) {
 224              $classes = '';
 225          }
 226          $sectionname = html_writer::tag('span', $this->section_title($section, $course));
 227          $o.= $this->output->heading($sectionname, 3, 'sectionname' . $classes);
 228  
 229          $o.= html_writer::start_tag('div', array('class' => 'summary'));
 230          $o.= $this->format_summary_text($section);
 231          $o.= html_writer::end_tag('div');
 232  
 233          $context = context_course::instance($course->id);
 234          $o .= $this->section_availability_message($section,
 235                  has_capability('moodle/course:viewhiddensections', $context));
 236  
 237          return $o;
 238      }
 239  
 240      /**
 241       * Generate the display of the footer part of a section
 242       *
 243       * @return string HTML to output.
 244       */
 245      protected function section_footer() {
 246          $o = html_writer::end_tag('div');
 247          $o.= html_writer::end_tag('li');
 248  
 249          return $o;
 250      }
 251  
 252      /**
 253       * Generate the edit controls of a section
 254       *
 255       * @param stdClass $course The course entry from DB
 256       * @param stdClass $section The course_section entry from DB
 257       * @param bool $onsectionpage true if being printed on a section page
 258       * @return array of links with edit controls
 259       * @deprecated since Moodle 3.0 MDL-48947 - please do not use this function any more.
 260       * @see format_section_renderer_base::section_edit_control_items()
 261       */
 262      protected function section_edit_controls($course, $section, $onsectionpage = false) {
 263          global $PAGE;
 264  
 265          if (!$PAGE->user_is_editing()) {
 266              return array();
 267          }
 268  
 269          $controls = array();
 270          $items = $this->section_edit_control_items($course, $section, $onsectionpage);
 271  
 272          foreach ($items as $key => $item) {
 273                  $url = empty($item['url']) ? '' : $item['url'];
 274                  $icon = empty($item['icon']) ? '' : $item['icon'];
 275                  $name = empty($item['name']) ? '' : $item['name'];
 276                  $attr = empty($item['attr']) ? '' : $item['attr'];
 277                  $class = empty($item['pixattr']['class']) ? '' : $item['pixattr']['class'];
 278                  $alt = empty($item['pixattr']['alt']) ? '' : $item['pixattr']['alt'];
 279                  $controls[$key] = html_writer::link(
 280                      new moodle_url($url),
 281                      html_writer::empty_tag('img', array(
 282                          'src' => $this->output->pix_url($icon),
 283                          'class' => "icon " . $class,
 284                          'alt' => $alt
 285                      )),
 286                      $attr);
 287          }
 288  
 289          debugging('section_edit_controls() is deprecated, please use section_edit_control_items() instead.', DEBUG_DEVELOPER);
 290          return $controls;
 291      }
 292  
 293      /**
 294       * Generate the edit control items of a section
 295       *
 296       * @param stdClass $course The course entry from DB
 297       * @param stdClass $section The course_section entry from DB
 298       * @param bool $onsectionpage true if being printed on a section page
 299       * @return array of edit control items
 300       */
 301      protected function section_edit_control_items($course, $section, $onsectionpage = false) {
 302          global $PAGE;
 303  
 304          if (!$PAGE->user_is_editing()) {
 305              return array();
 306          }
 307  
 308          $coursecontext = context_course::instance($course->id);
 309          $isstealth = isset($course->numsections) && ($section->section > $course->numsections);
 310  
 311          if ($onsectionpage) {
 312              $baseurl = course_get_url($course, $section->section);
 313          } else {
 314              $baseurl = course_get_url($course);
 315          }
 316          $baseurl->param('sesskey', sesskey());
 317  
 318          $controls = array();
 319  
 320          if (!$isstealth && has_capability('moodle/course:update', $coursecontext)) {
 321              if ($section->section > 0
 322                  && get_string_manager()->string_exists('editsection', 'format_'.$course->format)) {
 323                  $streditsection = get_string('editsection', 'format_'.$course->format);
 324              } else {
 325                  $streditsection = get_string('editsection');
 326              }
 327  
 328              $sectionreturn = $onsectionpage ? $section->section : 0;
 329              $controls['edit'] = array(
 330                  'url'   => new moodle_url('/course/editsection.php', array('id' => $section->id, 'sr' => $sectionreturn)),
 331                  'icon' => 'i/settings',
 332                  'name' => $streditsection,
 333                  'pixattr' => array('class' => '', 'alt' => $streditsection),
 334                  'attr' => array('class' => 'icon edit', 'title' => $streditsection));
 335          }
 336  
 337          if ($section->section) {
 338              $url = clone($baseurl);
 339              if (!$isstealth) {
 340                  if (has_capability('moodle/course:sectionvisibility', $coursecontext)) {
 341                      if ($section->visible) { // Show the hide/show eye.
 342                          $strhidefromothers = get_string('hidefromothers', 'format_'.$course->format);
 343                          $url->param('hide', $section->section);
 344                          $controls['visiblity'] = array(
 345                              'url' => $url,
 346                              'icon' => 'i/hide',
 347                              'name' => $strhidefromothers,
 348                              'pixattr' => array('class' => '', 'alt' => $strhidefromothers),
 349                              'attr' => array('class' => 'icon editing_showhide', 'title' => $strhidefromothers));
 350                      } else {
 351                          $strshowfromothers = get_string('showfromothers', 'format_'.$course->format);
 352                          $url->param('show',  $section->section);
 353                          $controls['visiblity'] = array(
 354                              'url' => $url,
 355                              'icon' => 'i/show',
 356                              'name' => $strshowfromothers,
 357                              'pixattr' => array('class' => '', 'alt' => $strshowfromothers),
 358                              'attr' => array('class' => 'icon editing_showhide', 'title' => $strshowfromothers));
 359                      }
 360                  }
 361  
 362                  if (!$onsectionpage) {
 363                      if (has_capability('moodle/course:movesections', $coursecontext)) {
 364                          $url = clone($baseurl);
 365                          if ($section->section > 1) { // Add a arrow to move section up.
 366                              $url->param('section', $section->section);
 367                              $url->param('move', -1);
 368                              $strmoveup = get_string('moveup');
 369                              $controls['moveup'] = array(
 370                                  'url' => $url,
 371                                  'icon' => 'i/up',
 372                                  'name' => $strmoveup,
 373                                  'pixattr' => array('class' => '', 'alt' => $strmoveup),
 374                                  'attr' => array('class' => 'icon moveup', 'title' => $strmoveup));
 375                          }
 376  
 377                          $url = clone($baseurl);
 378                          if ($section->section < $course->numsections) { // Add a arrow to move section down.
 379                              $url->param('section', $section->section);
 380                              $url->param('move', 1);
 381                              $strmovedown = get_string('movedown');
 382                              $controls['movedown'] = array(
 383                                  'url' => $url,
 384                                  'icon' => 'i/down',
 385                                  'name' => $strmovedown,
 386                                  'pixattr' => array('class' => '', 'alt' => $strmovedown),
 387                                  'attr' => array('class' => 'icon movedown', 'title' => $strmovedown));
 388                          }
 389                      }
 390                  }
 391              }
 392  
 393              if (course_can_delete_section($course, $section)) {
 394                  if (get_string_manager()->string_exists('deletesection', 'format_'.$course->format)) {
 395                      $strdelete = get_string('deletesection', 'format_'.$course->format);
 396                  } else {
 397                      $strdelete = get_string('deletesection');
 398                  }
 399                  $url = new moodle_url('/course/editsection.php', array(
 400                      'id' => $section->id,
 401                      'sr' => $onsectionpage ? $section->section : 0,
 402                      'delete' => 1));
 403                  $controls['delete'] = array(
 404                      'url' => $url,
 405                      'icon' => 'i/delete',
 406                      'name' => $strdelete,
 407                      'pixattr' => array('class' => '', 'alt' => $strdelete),
 408                      'attr' => array('class' => 'icon delete', 'title' => $strdelete));
 409              }
 410          }
 411  
 412          return $controls;
 413      }
 414  
 415      /**
 416       * Generate a summary of a section for display on the 'coruse index page'
 417       *
 418       * @param stdClass $section The course_section entry from DB
 419       * @param stdClass $course The course entry from DB
 420       * @param array    $mods (argument not used)
 421       * @return string HTML to output.
 422       */
 423      protected function section_summary($section, $course, $mods) {
 424          $classattr = 'section main section-summary clearfix';
 425          $linkclasses = '';
 426  
 427          // If section is hidden then display grey section link
 428          if (!$section->visible) {
 429              $classattr .= ' hidden';
 430              $linkclasses .= ' dimmed_text';
 431          } else if (course_get_format($course)->is_section_current($section)) {
 432              $classattr .= ' current';
 433          }
 434  
 435          $title = get_section_name($course, $section);
 436          $o = '';
 437          $o .= html_writer::start_tag('li', array('id' => 'section-'.$section->section,
 438              'class' => $classattr, 'role'=>'region', 'aria-label'=> $title));
 439  
 440          $o .= html_writer::tag('div', '', array('class' => 'left side'));
 441          $o .= html_writer::tag('div', '', array('class' => 'right side'));
 442          $o .= html_writer::start_tag('div', array('class' => 'content'));
 443  
 444          if ($section->uservisible) {
 445              $title = html_writer::tag('a', $title,
 446                      array('href' => course_get_url($course, $section->section), 'class' => $linkclasses));
 447          }
 448          $o .= $this->output->heading($title, 3, 'section-title');
 449  
 450          $o.= html_writer::start_tag('div', array('class' => 'summarytext'));
 451          $o.= $this->format_summary_text($section);
 452          $o.= html_writer::end_tag('div');
 453          $o.= $this->section_activity_summary($section, $course, null);
 454  
 455          $context = context_course::instance($course->id);
 456          $o .= $this->section_availability_message($section,
 457                  has_capability('moodle/course:viewhiddensections', $context));
 458  
 459          $o .= html_writer::end_tag('div');
 460          $o .= html_writer::end_tag('li');
 461  
 462          return $o;
 463      }
 464  
 465      /**
 466       * Generate a summary of the activites in a section
 467       *
 468       * @param stdClass $section The course_section entry from DB
 469       * @param stdClass $course the course record from DB
 470       * @param array    $mods (argument not used)
 471       * @return string HTML to output.
 472       */
 473      protected function section_activity_summary($section, $course, $mods) {
 474          $modinfo = get_fast_modinfo($course);
 475          if (empty($modinfo->sections[$section->section])) {
 476              return '';
 477          }
 478  
 479          // Generate array with count of activities in this section:
 480          $sectionmods = array();
 481          $total = 0;
 482          $complete = 0;
 483          $cancomplete = isloggedin() && !isguestuser();
 484          $completioninfo = new completion_info($course);
 485          foreach ($modinfo->sections[$section->section] as $cmid) {
 486              $thismod = $modinfo->cms[$cmid];
 487  
 488              if ($thismod->modname == 'label') {
 489                  // Labels are special (not interesting for students)!
 490                  continue;
 491              }
 492  
 493              if ($thismod->uservisible) {
 494                  if (isset($sectionmods[$thismod->modname])) {
 495                      $sectionmods[$thismod->modname]['name'] = $thismod->modplural;
 496                      $sectionmods[$thismod->modname]['count']++;
 497                  } else {
 498                      $sectionmods[$thismod->modname]['name'] = $thismod->modfullname;
 499                      $sectionmods[$thismod->modname]['count'] = 1;
 500                  }
 501                  if ($cancomplete && $completioninfo->is_enabled($thismod) != COMPLETION_TRACKING_NONE) {
 502                      $total++;
 503                      $completiondata = $completioninfo->get_data($thismod, true);
 504                      if ($completiondata->completionstate == COMPLETION_COMPLETE ||
 505                              $completiondata->completionstate == COMPLETION_COMPLETE_PASS) {
 506                          $complete++;
 507                      }
 508                  }
 509              }
 510          }
 511  
 512          if (empty($sectionmods)) {
 513              // No sections
 514              return '';
 515          }
 516  
 517          // Output section activities summary:
 518          $o = '';
 519          $o.= html_writer::start_tag('div', array('class' => 'section-summary-activities mdl-right'));
 520          foreach ($sectionmods as $mod) {
 521              $o.= html_writer::start_tag('span', array('class' => 'activity-count'));
 522              $o.= $mod['name'].': '.$mod['count'];
 523              $o.= html_writer::end_tag('span');
 524          }
 525          $o.= html_writer::end_tag('div');
 526  
 527          // Output section completion data
 528          if ($total > 0) {
 529              $a = new stdClass;
 530              $a->complete = $complete;
 531              $a->total = $total;
 532  
 533              $o.= html_writer::start_tag('div', array('class' => 'section-summary-activities mdl-right'));
 534              $o.= html_writer::tag('span', get_string('progresstotal', 'completion', $a), array('class' => 'activity-count'));
 535              $o.= html_writer::end_tag('div');
 536          }
 537  
 538          return $o;
 539      }
 540  
 541      /**
 542       * If section is not visible, display the message about that ('Not available
 543       * until...', that sort of thing). Otherwise, returns blank.
 544       *
 545       * For users with the ability to view hidden sections, it shows the
 546       * information even though you can view the section and also may include
 547       * slightly fuller information (so that teachers can tell when sections
 548       * are going to be unavailable etc). This logic is the same as for
 549       * activities.
 550       *
 551       * @param stdClass $section The course_section entry from DB
 552       * @param bool $canviewhidden True if user can view hidden sections
 553       * @return string HTML to output
 554       */
 555      protected function section_availability_message($section, $canviewhidden) {
 556          global $CFG;
 557          $o = '';
 558          if (!$section->uservisible) {
 559              // Note: We only get to this function if availableinfo is non-empty,
 560              // so there is definitely something to print.
 561              $formattedinfo = \core_availability\info::format_info(
 562                      $section->availableinfo, $section->course);
 563              $o .= html_writer::div($formattedinfo, 'availabilityinfo');
 564          } else if ($canviewhidden && !empty($CFG->enableavailability) && $section->visible) {
 565              $ci = new \core_availability\info_section($section);
 566              $fullinfo = $ci->get_full_information();
 567              if ($fullinfo) {
 568                  $formattedinfo = \core_availability\info::format_info(
 569                          $fullinfo, $section->course);
 570                  $o .= html_writer::div($formattedinfo, 'availabilityinfo');
 571              }
 572          }
 573          return $o;
 574      }
 575  
 576      /**
 577       * Show if something is on on the course clipboard (moving around)
 578       *
 579       * @param stdClass $course The course entry from DB
 580       * @param int $sectionno The section number in the coruse which is being dsiplayed
 581       * @return string HTML to output.
 582       */
 583      protected function course_activity_clipboard($course, $sectionno = null) {
 584          global $USER;
 585  
 586          $o = '';
 587          // If currently moving a file then show the current clipboard.
 588          if (ismoving($course->id)) {
 589              $url = new moodle_url('/course/mod.php',
 590                  array('sesskey' => sesskey(),
 591                        'cancelcopy' => true,
 592                        'sr' => $sectionno,
 593                  )
 594              );
 595  
 596              $o.= html_writer::start_tag('div', array('class' => 'clipboard'));
 597              $o.= strip_tags(get_string('activityclipboard', '', $USER->activitycopyname));
 598              $o.= ' ('.html_writer::link($url, get_string('cancel')).')';
 599              $o.= html_writer::end_tag('div');
 600          }
 601  
 602          return $o;
 603      }
 604  
 605      /**
 606       * Generate next/previous section links for naviation
 607       *
 608       * @param stdClass $course The course entry from DB
 609       * @param array $sections The course_sections entries from the DB
 610       * @param int $sectionno The section number in the coruse which is being dsiplayed
 611       * @return array associative array with previous and next section link
 612       */
 613      protected function get_nav_links($course, $sections, $sectionno) {
 614          // FIXME: This is really evil and should by using the navigation API.
 615          $course = course_get_format($course)->get_course();
 616          $canviewhidden = has_capability('moodle/course:viewhiddensections', context_course::instance($course->id))
 617              or !$course->hiddensections;
 618  
 619          $links = array('previous' => '', 'next' => '');
 620          $back = $sectionno - 1;
 621          while ($back > 0 and empty($links['previous'])) {
 622              if ($canviewhidden || $sections[$back]->uservisible) {
 623                  $params = array();
 624                  if (!$sections[$back]->visible) {
 625                      $params = array('class' => 'dimmed_text');
 626                  }
 627                  $previouslink = html_writer::tag('span', $this->output->larrow(), array('class' => 'larrow'));
 628                  $previouslink .= get_section_name($course, $sections[$back]);
 629                  $links['previous'] = html_writer::link(course_get_url($course, $back), $previouslink, $params);
 630              }
 631              $back--;
 632          }
 633  
 634          $forward = $sectionno + 1;
 635          while ($forward <= $course->numsections and empty($links['next'])) {
 636              if ($canviewhidden || $sections[$forward]->uservisible) {
 637                  $params = array();
 638                  if (!$sections[$forward]->visible) {
 639                      $params = array('class' => 'dimmed_text');
 640                  }
 641                  $nextlink = get_section_name($course, $sections[$forward]);
 642                  $nextlink .= html_writer::tag('span', $this->output->rarrow(), array('class' => 'rarrow'));
 643                  $links['next'] = html_writer::link(course_get_url($course, $forward), $nextlink, $params);
 644              }
 645              $forward++;
 646          }
 647  
 648          return $links;
 649      }
 650  
 651      /**
 652       * Generate the header html of a stealth section
 653       *
 654       * @param int $sectionno The section number in the coruse which is being dsiplayed
 655       * @return string HTML to output.
 656       */
 657      protected function stealth_section_header($sectionno) {
 658          $o = '';
 659          $o.= html_writer::start_tag('li', array('id' => 'section-'.$sectionno, 'class' => 'section main clearfix orphaned hidden'));
 660          $o.= html_writer::tag('div', '', array('class' => 'left side'));
 661          $course = course_get_format($this->page->course)->get_course();
 662          $section = course_get_format($this->page->course)->get_section($sectionno);
 663          $rightcontent = $this->section_right_content($section, $course, false);
 664          $o.= html_writer::tag('div', $rightcontent, array('class' => 'right side'));
 665          $o.= html_writer::start_tag('div', array('class' => 'content'));
 666          $o.= $this->output->heading(get_string('orphanedactivitiesinsectionno', '', $sectionno), 3, 'sectionname');
 667          return $o;
 668      }
 669  
 670      /**
 671       * Generate footer html of a stealth section
 672       *
 673       * @return string HTML to output.
 674       */
 675      protected function stealth_section_footer() {
 676          $o = html_writer::end_tag('div');
 677          $o.= html_writer::end_tag('li');
 678          return $o;
 679      }
 680  
 681      /**
 682       * Generate the html for a hidden section
 683       *
 684       * @param int $sectionno The section number in the coruse which is being dsiplayed
 685       * @param int|stdClass $courseorid The course to get the section name for (object or just course id)
 686       * @return string HTML to output.
 687       */
 688      protected function section_hidden($sectionno, $courseorid = null) {
 689          if ($courseorid) {
 690              $sectionname = get_section_name($courseorid, $sectionno);
 691              $strnotavailable = get_string('notavailablecourse', '', $sectionname);
 692          } else {
 693              $strnotavailable = get_string('notavailable');
 694          }
 695  
 696          $o = '';
 697          $o.= html_writer::start_tag('li', array('id' => 'section-'.$sectionno, 'class' => 'section main clearfix hidden'));
 698          $o.= html_writer::tag('div', '', array('class' => 'left side'));
 699          $o.= html_writer::tag('div', '', array('class' => 'right side'));
 700          $o.= html_writer::start_tag('div', array('class' => 'content'));
 701          $o.= html_writer::tag('div', $strnotavailable);
 702          $o.= html_writer::end_tag('div');
 703          $o.= html_writer::end_tag('li');
 704          return $o;
 705      }
 706  
 707      /**
 708       * Generate the html for the 'Jump to' menu on a single section page.
 709       *
 710       * @param stdClass $course The course entry from DB
 711       * @param array $sections The course_sections entries from the DB
 712       * @param $displaysection the current displayed section number.
 713       *
 714       * @return string HTML to output.
 715       */
 716      protected function section_nav_selection($course, $sections, $displaysection) {
 717          global $CFG;
 718          $o = '';
 719          $sectionmenu = array();
 720          $sectionmenu[course_get_url($course)->out(false)] = get_string('maincoursepage');
 721          $modinfo = get_fast_modinfo($course);
 722          $section = 1;
 723          while ($section <= $course->numsections) {
 724              $thissection = $modinfo->get_section_info($section);
 725              $showsection = $thissection->uservisible or !$course->hiddensections;
 726              if (($showsection) && ($section != $displaysection) && ($url = course_get_url($course, $section))) {
 727                  $sectionmenu[$url->out(false)] = get_section_name($course, $section);
 728              }
 729              $section++;
 730          }
 731  
 732          $select = new url_select($sectionmenu, '', array('' => get_string('jumpto')));
 733          $select->class = 'jumpmenu';
 734          $select->formid = 'sectionmenu';
 735          $o .= $this->output->render($select);
 736  
 737          return $o;
 738      }
 739  
 740      /**
 741       * Output the html for a single section page .
 742       *
 743       * @param stdClass $course The course entry from DB
 744       * @param array $sections (argument not used)
 745       * @param array $mods (argument not used)
 746       * @param array $modnames (argument not used)
 747       * @param array $modnamesused (argument not used)
 748       * @param int $displaysection The section number in the course which is being displayed
 749       */
 750      public function print_single_section_page($course, $sections, $mods, $modnames, $modnamesused, $displaysection) {
 751          global $PAGE;
 752  
 753          $modinfo = get_fast_modinfo($course);
 754          $course = course_get_format($course)->get_course();
 755  
 756          // Can we view the section in question?
 757          if (!($sectioninfo = $modinfo->get_section_info($displaysection))) {
 758              // This section doesn't exist
 759              print_error('unknowncoursesection', 'error', null, $course->fullname);
 760              return;
 761          }
 762  
 763          if (!$sectioninfo->uservisible) {
 764              if (!$course->hiddensections) {
 765                  echo $this->start_section_list();
 766                  echo $this->section_hidden($displaysection, $course->id);
 767                  echo $this->end_section_list();
 768              }
 769              // Can't view this section.
 770              return;
 771          }
 772  
 773          // Copy activity clipboard..
 774          echo $this->course_activity_clipboard($course, $displaysection);
 775          $thissection = $modinfo->get_section_info(0);
 776          if ($thissection->summary or !empty($modinfo->sections[0]) or $PAGE->user_is_editing()) {
 777              echo $this->start_section_list();
 778              echo $this->section_header($thissection, $course, true, $displaysection);
 779              echo $this->courserenderer->course_section_cm_list($course, $thissection, $displaysection);
 780              echo $this->courserenderer->course_section_add_cm_control($course, 0, $displaysection);
 781              echo $this->section_footer();
 782              echo $this->end_section_list();
 783          }
 784  
 785          // Start single-section div
 786          echo html_writer::start_tag('div', array('class' => 'single-section'));
 787  
 788          // The requested section page.
 789          $thissection = $modinfo->get_section_info($displaysection);
 790  
 791          // Title with section navigation links.
 792          $sectionnavlinks = $this->get_nav_links($course, $modinfo->get_section_info_all(), $displaysection);
 793          $sectiontitle = '';
 794          $sectiontitle .= html_writer::start_tag('div', array('class' => 'section-navigation navigationtitle'));
 795          $sectiontitle .= html_writer::tag('span', $sectionnavlinks['previous'], array('class' => 'mdl-left'));
 796          $sectiontitle .= html_writer::tag('span', $sectionnavlinks['next'], array('class' => 'mdl-right'));
 797          // Title attributes
 798          $classes = 'sectionname';
 799          if (!$thissection->visible) {
 800              $classes .= ' dimmed_text';
 801          }
 802          $sectionname = html_writer::tag('span', $this->section_title_without_link($thissection, $course));
 803          $sectiontitle .= $this->output->heading($sectionname, 3, $classes);
 804  
 805          $sectiontitle .= html_writer::end_tag('div');
 806          echo $sectiontitle;
 807  
 808          // Now the list of sections..
 809          echo $this->start_section_list();
 810  
 811          echo $this->section_header($thissection, $course, true, $displaysection);
 812          // Show completion help icon.
 813          $completioninfo = new completion_info($course);
 814          echo $completioninfo->display_help_icon();
 815  
 816          echo $this->courserenderer->course_section_cm_list($course, $thissection, $displaysection);
 817          echo $this->courserenderer->course_section_add_cm_control($course, $displaysection, $displaysection);
 818          echo $this->section_footer();
 819          echo $this->end_section_list();
 820  
 821          // Display section bottom navigation.
 822          $sectionbottomnav = '';
 823          $sectionbottomnav .= html_writer::start_tag('div', array('class' => 'section-navigation mdl-bottom'));
 824          $sectionbottomnav .= html_writer::tag('span', $sectionnavlinks['previous'], array('class' => 'mdl-left'));
 825          $sectionbottomnav .= html_writer::tag('span', $sectionnavlinks['next'], array('class' => 'mdl-right'));
 826          $sectionbottomnav .= html_writer::tag('div', $this->section_nav_selection($course, $sections, $displaysection),
 827              array('class' => 'mdl-align'));
 828          $sectionbottomnav .= html_writer::end_tag('div');
 829          echo $sectionbottomnav;
 830  
 831          // Close single-section div.
 832          echo html_writer::end_tag('div');
 833      }
 834  
 835      /**
 836       * Output the html for a multiple section page
 837       *
 838       * @param stdClass $course The course entry from DB
 839       * @param array $sections (argument not used)
 840       * @param array $mods (argument not used)
 841       * @param array $modnames (argument not used)
 842       * @param array $modnamesused (argument not used)
 843       */
 844      public function print_multiple_section_page($course, $sections, $mods, $modnames, $modnamesused) {
 845          global $PAGE;
 846  
 847          $modinfo = get_fast_modinfo($course);
 848          $course = course_get_format($course)->get_course();
 849  
 850          $context = context_course::instance($course->id);
 851          // Title with completion help icon.
 852          $completioninfo = new completion_info($course);
 853          echo $completioninfo->display_help_icon();
 854          echo $this->output->heading($this->page_title(), 2, 'accesshide');
 855  
 856          // Copy activity clipboard..
 857          echo $this->course_activity_clipboard($course, 0);
 858  
 859          // Now the list of sections..
 860          echo $this->start_section_list();
 861  
 862          foreach ($modinfo->get_section_info_all() as $section => $thissection) {
 863              if ($section == 0) {
 864                  // 0-section is displayed a little different then the others
 865                  if ($thissection->summary or !empty($modinfo->sections[0]) or $PAGE->user_is_editing()) {
 866                      echo $this->section_header($thissection, $course, false, 0);
 867                      echo $this->courserenderer->course_section_cm_list($course, $thissection, 0);
 868                      echo $this->courserenderer->course_section_add_cm_control($course, 0, 0);
 869                      echo $this->section_footer();
 870                  }
 871                  continue;
 872              }
 873              if ($section > $course->numsections) {
 874                  // activities inside this section are 'orphaned', this section will be printed as 'stealth' below
 875                  continue;
 876              }
 877              // Show the section if the user is permitted to access it, OR if it's not available
 878              // but there is some available info text which explains the reason & should display.
 879              $showsection = $thissection->uservisible ||
 880                      ($thissection->visible && !$thissection->available &&
 881                      !empty($thissection->availableinfo));
 882              if (!$showsection) {
 883                  // If the hiddensections option is set to 'show hidden sections in collapsed
 884                  // form', then display the hidden section message - UNLESS the section is
 885                  // hidden by the availability system, which is set to hide the reason.
 886                  if (!$course->hiddensections && $thissection->available) {
 887                      echo $this->section_hidden($section, $course->id);
 888                  }
 889  
 890                  continue;
 891              }
 892  
 893              if (!$PAGE->user_is_editing() && $course->coursedisplay == COURSE_DISPLAY_MULTIPAGE) {
 894                  // Display section summary only.
 895                  echo $this->section_summary($thissection, $course, null);
 896              } else {
 897                  echo $this->section_header($thissection, $course, false, 0);
 898                  if ($thissection->uservisible) {
 899                      echo $this->courserenderer->course_section_cm_list($course, $thissection, 0);
 900                      echo $this->courserenderer->course_section_add_cm_control($course, $section, 0);
 901                  }
 902                  echo $this->section_footer();
 903              }
 904          }
 905  
 906          if ($PAGE->user_is_editing() and has_capability('moodle/course:update', $context)) {
 907              // Print stealth sections if present.
 908              foreach ($modinfo->get_section_info_all() as $section => $thissection) {
 909                  if ($section <= $course->numsections or empty($modinfo->sections[$section])) {
 910                      // this is not stealth section or it is empty
 911                      continue;
 912                  }
 913                  echo $this->stealth_section_header($section);
 914                  echo $this->courserenderer->course_section_cm_list($course, $thissection, 0);
 915                  echo $this->stealth_section_footer();
 916              }
 917  
 918              echo $this->end_section_list();
 919  
 920              echo html_writer::start_tag('div', array('id' => 'changenumsections', 'class' => 'mdl-right'));
 921  
 922              // Increase number of sections.
 923              $straddsection = get_string('increasesections', 'moodle');
 924              $url = new moodle_url('/course/changenumsections.php',
 925                  array('courseid' => $course->id,
 926                        'increase' => true,
 927                        'sesskey' => sesskey()));
 928              $icon = $this->output->pix_icon('t/switch_plus', $straddsection);
 929              echo html_writer::link($url, $icon.get_accesshide($straddsection), array('class' => 'increase-sections'));
 930  
 931              if ($course->numsections > 0) {
 932                  // Reduce number of sections sections.
 933                  $strremovesection = get_string('reducesections', 'moodle');
 934                  $url = new moodle_url('/course/changenumsections.php',
 935                      array('courseid' => $course->id,
 936                            'increase' => false,
 937                            'sesskey' => sesskey()));
 938                  $icon = $this->output->pix_icon('t/switch_minus', $strremovesection);
 939                  echo html_writer::link($url, $icon.get_accesshide($strremovesection), array('class' => 'reduce-sections'));
 940              }
 941  
 942              echo html_writer::end_tag('div');
 943          } else {
 944              echo $this->end_section_list();
 945          }
 946  
 947      }
 948  
 949      /**
 950       * Generate html for a section summary text
 951       *
 952       * @param stdClass $section The course_section entry from DB
 953       * @return string HTML to output.
 954       */
 955      protected function format_summary_text($section) {
 956          $context = context_course::instance($section->course);
 957          $summarytext = file_rewrite_pluginfile_urls($section->summary, 'pluginfile.php',
 958              $context->id, 'course', 'section', $section->id);
 959  
 960          $options = new stdClass();
 961          $options->noclean = true;
 962          $options->overflowdiv = true;
 963          return format_text($summarytext, $section->summaryformat, $options);
 964      }
 965  }


Generated: Thu Aug 11 10:00:09 2016 Cross-referenced by PHPXref 0.7.1