Search moodle.org's
Developer Documentation


  • Bug fixes for general core bugs in 2.8.x ended 9 November 2015 (12 months).
  • Bug fixes for security issues in 2.8.x ended 9 May 2016 (18 months).
  • minimum PHP 5.4.4 (always use latest PHP 5.4.x or 5.5.x on Windows - http://windows.php.net/download/), PHP 7 is NOT supported
  • Differences Between: [Versions 28 and 30] [Versions 28 and 31] [Versions 28 and 32] [Versions 28 and 33] [Versions 28 and 34] [Versions 28 and 35] [Versions 28 and 36] [Versions 28 and 37]

       1  <?php
       2  
       3  // This file is part of Moodle - http://moodle.org/
       4  //
       5  // Moodle is free software: you can redistribute it and/or modify
       6  // it under the terms of the GNU General Public License as published by
       7  // the Free Software Foundation, either version 3 of the License, or
       8  // (at your option) any later version.
       9  //
      10  // Moodle is distributed in the hope that it will be useful,
      11  // but WITHOUT ANY WARRANTY; without even the implied warranty of
      12  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      13  // GNU General Public License for more details.
      14  //
      15  // You should have received a copy of the GNU General Public License
      16  // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
      17  
      18  /**
      19   * Private resource module utility functions
      20   *
      21   * @package    mod_resource
      22   * @copyright  2009 Petr Skoda  {@link http://skodak.org}
      23   * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
      24   */
      25  
      26  defined('MOODLE_INTERNAL') || die;
      27  
      28  require_once("$CFG->libdir/filelib.php");
      29  require_once("$CFG->libdir/resourcelib.php");
      30  require_once("$CFG->dirroot/mod/resource/lib.php");
      31  
      32  /**
      33   * Redirected to migrated resource if needed,
      34   * return if incorrect parameters specified
      35   * @param int $oldid
      36   * @param int $cmid
      37   * @return void
      38   */
      39  function resource_redirect_if_migrated($oldid, $cmid) {
      40      global $DB, $CFG;
      41  
      42      if ($oldid) {
      43          $old = $DB->get_record('resource_old', array('oldid'=>$oldid));
      44      } else {
      45          $old = $DB->get_record('resource_old', array('cmid'=>$cmid));
      46      }
      47  
      48      if (!$old) {
      49          return;
      50      }
      51  
      52      redirect("$CFG->wwwroot/mod/$old->newmodule/view.php?id=".$old->cmid);
      53  }
      54  
      55  /**
      56   * Display embedded resource file.
      57   * @param object $resource
      58   * @param object $cm
      59   * @param object $course
      60   * @param stored_file $file main file
      61   * @return does not return
      62   */
      63  function resource_display_embed($resource, $cm, $course, $file) {
      64      global $CFG, $PAGE, $OUTPUT;
      65  
      66      $clicktoopen = resource_get_clicktoopen($file, $resource->revision);
      67  
      68      $context = context_module::instance($cm->id);
      69      $path = '/'.$context->id.'/mod_resource/content/'.$resource->revision.$file->get_filepath().$file->get_filename();
      70      $fullurl = file_encode_url($CFG->wwwroot.'/pluginfile.php', $path, false);
      71      $moodleurl = new moodle_url('/pluginfile.php' . $path);
      72  
      73      $mimetype = $file->get_mimetype();
      74      $title    = $resource->name;
      75  
      76      $extension = resourcelib_get_extension($file->get_filename());
      77  
      78      $mediarenderer = $PAGE->get_renderer('core', 'media');
      79      $embedoptions = array(
      80          core_media::OPTION_TRUSTED => true,
      81          core_media::OPTION_BLOCK => true,
      82      );
      83  
      84      if (file_mimetype_in_typegroup($mimetype, 'web_image')) {  // It's an image
      85          $code = resourcelib_embed_image($fullurl, $title);
      86  
      87      } else if ($mimetype === 'application/pdf') {
      88          // PDF document
      89          $code = resourcelib_embed_pdf($fullurl, $title, $clicktoopen);
      90  
      91      } else if ($mediarenderer->can_embed_url($moodleurl, $embedoptions)) {
      92          // Media (audio/video) file.
      93          $code = $mediarenderer->embed_url($moodleurl, $title, 0, 0, $embedoptions);
      94  
      95      } else {
      96          // anything else - just try object tag enlarged as much as possible
      97          $code = resourcelib_embed_general($fullurl, $title, $clicktoopen, $mimetype);
      98      }
      99  
     100      resource_print_header($resource, $cm, $course);
     101      resource_print_heading($resource, $cm, $course);
     102  
     103      echo $code;
     104  
     105      resource_print_intro($resource, $cm, $course);
     106  
     107      echo $OUTPUT->footer();
     108      die;
     109  }
     110  
     111  /**
     112   * Display resource frames.
     113   * @param object $resource
     114   * @param object $cm
     115   * @param object $course
     116   * @param stored_file $file main file
     117   * @return does not return
     118   */
     119  function resource_display_frame($resource, $cm, $course, $file) {
     120      global $PAGE, $OUTPUT, $CFG;
     121  
     122      $frame = optional_param('frameset', 'main', PARAM_ALPHA);
     123  
     124      if ($frame === 'top') {
     125          $PAGE->set_pagelayout('frametop');
     126          resource_print_header($resource, $cm, $course);
     127          resource_print_heading($resource, $cm, $course);
     128          resource_print_intro($resource, $cm, $course);
     129          echo $OUTPUT->footer();
     130          die;
     131  
     132      } else {
     133          $config = get_config('resource');
     134          $context = context_module::instance($cm->id);
     135          $path = '/'.$context->id.'/mod_resource/content/'.$resource->revision.$file->get_filepath().$file->get_filename();
     136          $fileurl = file_encode_url($CFG->wwwroot.'/pluginfile.php', $path, false);
     137          $navurl = "$CFG->wwwroot/mod/resource/view.php?id=$cm->id&amp;frameset=top";
     138          $title = strip_tags(format_string($course->shortname.': '.$resource->name));
     139          $framesize = $config->framesize;
     140          $contentframetitle = s(format_string($resource->name));
     141          $modulename = s(get_string('modulename','resource'));
     142          $dir = get_string('thisdirection', 'langconfig');
     143  
     144          $file = <<<EOF
     145  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
     146  <html dir="$dir">
     147    <head>
     148      <meta http-equiv="content-type" content="text/html; charset=utf-8" />
     149      <title>$title</title>
     150    </head>
     151    <frameset rows="$framesize,*">
     152      <frame src="$navurl" title="$modulename" />
     153      <frame src="$fileurl" title="$contentframetitle" />
     154    </frameset>
     155  </html>
     156  EOF;
     157  
     158          @header('Content-Type: text/html; charset=utf-8');
     159          echo $file;
     160          die;
     161      }
     162  }
     163  
     164  /**
     165   * Internal function - create click to open text with link.
     166   */
     167  function resource_get_clicktoopen($file, $revision, $extra='') {
     168      global $CFG;
     169  
     170      $filename = $file->get_filename();
     171      $path = '/'.$file->get_contextid().'/mod_resource/content/'.$revision.$file->get_filepath().$file->get_filename();
     172      $fullurl = file_encode_url($CFG->wwwroot.'/pluginfile.php', $path, false);
     173  
     174      $string = get_string('clicktoopen2', 'resource', "<a href=\"$fullurl\" $extra>$filename</a>");
     175  
     176      return $string;
     177  }
     178  
     179  /**
     180   * Internal function - create click to open text with link.
     181   */
     182  function resource_get_clicktodownload($file, $revision) {
     183      global $CFG;
     184  
     185      $filename = $file->get_filename();
     186      $path = '/'.$file->get_contextid().'/mod_resource/content/'.$revision.$file->get_filepath().$file->get_filename();
     187      $fullurl = file_encode_url($CFG->wwwroot.'/pluginfile.php', $path, true);
     188  
     189      $string = get_string('clicktodownload', 'resource', "<a href=\"$fullurl\">$filename</a>");
     190  
     191      return $string;
     192  }
     193  
     194  /**
     195   * Print resource info and workaround link when JS not available.
     196   * @param object $resource
     197   * @param object $cm
     198   * @param object $course
     199   * @param stored_file $file main file
     200   * @return does not return
     201   */
     202  function resource_print_workaround($resource, $cm, $course, $file) {
     203      global $CFG, $OUTPUT;
     204  
     205      resource_print_header($resource, $cm, $course);
     206      resource_print_heading($resource, $cm, $course, true);
     207      resource_print_intro($resource, $cm, $course, true);
     208  
     209      $resource->mainfile = $file->get_filename();
     210      echo '<div class="resourceworkaround">';
     211      switch (resource_get_final_display_type($resource)) {
     212          case RESOURCELIB_DISPLAY_POPUP:
     213              $path = '/'.$file->get_contextid().'/mod_resource/content/'.$resource->revision.$file->get_filepath().$file->get_filename();
     214              $fullurl = file_encode_url($CFG->wwwroot.'/pluginfile.php', $path, false);
     215              $options = empty($resource->displayoptions) ? array() : unserialize($resource->displayoptions);
     216              $width  = empty($options['popupwidth'])  ? 620 : $options['popupwidth'];
     217              $height = empty($options['popupheight']) ? 450 : $options['popupheight'];
     218              $wh = "width=$width,height=$height,toolbar=no,location=no,menubar=no,copyhistory=no,status=no,directories=no,scrollbars=yes,resizable=yes";
     219              $extra = "onclick=\"window.open('$fullurl', '', '$wh'); return false;\"";
     220              echo resource_get_clicktoopen($file, $resource->revision, $extra);
     221              break;
     222  
     223          case RESOURCELIB_DISPLAY_NEW:
     224              $extra = 'onclick="this.target=\'_blank\'"';
     225              echo resource_get_clicktoopen($file, $resource->revision, $extra);
     226              break;
     227  
     228          case RESOURCELIB_DISPLAY_DOWNLOAD:
     229              echo resource_get_clicktodownload($file, $resource->revision);
     230              break;
     231  
     232          case RESOURCELIB_DISPLAY_OPEN:
     233          default:
     234              echo resource_get_clicktoopen($file, $resource->revision);
     235              break;
     236      }
     237      echo '</div>';
     238  
     239      echo $OUTPUT->footer();
     240      die;
     241  }
     242  
     243  /**
     244   * Print resource header.
     245   * @param object $resource
     246   * @param object $cm
     247   * @param object $course
     248   * @return void
     249   */
     250  function resource_print_header($resource, $cm, $course) {
     251      global $PAGE, $OUTPUT;
     252  
     253      $PAGE->set_title($course->shortname.': '.$resource->name);
     254      $PAGE->set_heading($course->fullname);
     255      $PAGE->set_activity_record($resource);
     256      $PAGE->set_button(update_module_button($cm->id, '', get_string('modulename', 'resource')));
     257      echo $OUTPUT->header();
     258  }
     259  
     260  /**
     261   * Print resource heading.
     262   * @param object $resource
     263   * @param object $cm
     264   * @param object $course
     265   * @param bool $notused This variable is no longer used
     266   * @return void
     267   */
     268  function resource_print_heading($resource, $cm, $course, $notused = false) {
     269      global $OUTPUT;
     270      echo $OUTPUT->heading(format_string($resource->name), 2);
     271  }
     272  
     273  /**
     274   * Gets optional details for a resource, depending on resource settings.
     275   *
     276   * Result may include the file size and type if those settings are chosen,
     277   * or blank if none.
     278   *
     279   * @param object $resource Resource table row
     280   * @param object $cm Course-module table row
     281   * @return string Size and type or empty string if show options are not enabled
     282   */
     283  function resource_get_optional_details($resource, $cm) {
     284      global $DB;
     285  
     286      $details = '';
     287  
     288      $options = empty($resource->displayoptions) ? array() : unserialize($resource->displayoptions);
     289      if (!empty($options['showsize']) || !empty($options['showtype'])) {
     290          $context = context_module::instance($cm->id);
     291          $size = '';
     292          $type = '';
     293          $fs = get_file_storage();
     294          $files = $fs->get_area_files($context->id, 'mod_resource', 'content', 0, 'sortorder DESC, id ASC', false);
     295          if (!empty($options['showsize']) && count($files)) {
     296              $sizebytes = 0;
     297              foreach ($files as $file) {
     298                  // this will also synchronize the file size for external files if needed
     299                  $sizebytes += $file->get_filesize();
     300              }
     301              if ($sizebytes) {
     302                  $size = display_size($sizebytes);
     303              }
     304          }
     305          if (!empty($options['showtype']) && count($files)) {
     306              // For a typical file resource, the sortorder is 1 for the main file
     307              // and 0 for all other files. This sort approach is used just in case
     308              // there are situations where the file has a different sort order
     309              $mainfile = reset($files);
     310              $type = get_mimetype_description($mainfile);
     311              // Only show type if it is not unknown
     312              if ($type === get_mimetype_description('document/unknown')) {
     313                  $type = '';
     314              }
     315          }
     316  
     317          if ($size && $type) {
     318              // Depending on language it may be necessary to show both options in
     319              // different order, so use a lang string
     320              $details = get_string('resourcedetails_sizetype', 'resource',
     321                      (object)array('size'=>$size, 'type'=>$type));
     322          } else {
     323              // Either size or type is set, but not both, so just append
     324              $details = $size . $type;
     325          }
     326      }
     327  
     328      return $details;
     329  }
     330  
     331  /**
     332   * Print resource introduction.
     333   * @param object $resource
     334   * @param object $cm
     335   * @param object $course
     336   * @param bool $ignoresettings print even if not specified in modedit
     337   * @return void
     338   */
     339  function resource_print_intro($resource, $cm, $course, $ignoresettings=false) {
     340      global $OUTPUT;
     341  
     342      $options = empty($resource->displayoptions) ? array() : unserialize($resource->displayoptions);
     343  
     344      $extraintro = resource_get_optional_details($resource, $cm);
     345      if ($extraintro) {
     346          // Put a paragaph tag around the details
     347          $extraintro = html_writer::tag('p', $extraintro, array('class' => 'resourcedetails'));
     348      }
     349  
     350      if ($ignoresettings || !empty($options['printintro']) || $extraintro) {
     351          $gotintro = trim(strip_tags($resource->intro));
     352          if ($gotintro || $extraintro) {
     353              echo $OUTPUT->box_start('mod_introbox', 'resourceintro');
     354              if ($gotintro) {
     355                  echo format_module_intro('resource', $resource, $cm->id);
     356              }
     357              echo $extraintro;
     358              echo $OUTPUT->box_end();
     359          }
     360      }
     361  }
     362  
     363  /**
     364   * Print warning that instance not migrated yet.
     365   * @param object $resource
     366   * @param object $cm
     367   * @param object $course
     368   * @return void, does not return
     369   */
     370  function resource_print_tobemigrated($resource, $cm, $course) {
     371      global $DB, $OUTPUT;
     372  
     373      $resource_old = $DB->get_record('resource_old', array('oldid'=>$resource->id));
     374      resource_print_header($resource, $cm, $course);
     375      resource_print_heading($resource, $cm, $course);
     376      resource_print_intro($resource, $cm, $course);
     377      echo $OUTPUT->notification(get_string('notmigrated', 'resource', $resource_old->type));
     378      echo $OUTPUT->footer();
     379      die;
     380  }
     381  
     382  /**
     383   * Print warning that file can not be found.
     384   * @param object $resource
     385   * @param object $cm
     386   * @param object $course
     387   * @return void, does not return
     388   */
     389  function resource_print_filenotfound($resource, $cm, $course) {
     390      global $DB, $OUTPUT;
     391  
     392      $resource_old = $DB->get_record('resource_old', array('oldid'=>$resource->id));
     393      resource_print_header($resource, $cm, $course);
     394      resource_print_heading($resource, $cm, $course);
     395      resource_print_intro($resource, $cm, $course);
     396      if ($resource_old) {
     397          echo $OUTPUT->notification(get_string('notmigrated', 'resource', $resource_old->type));
     398      } else {
     399          echo $OUTPUT->notification(get_string('filenotfound', 'resource'));
     400      }
     401      echo $OUTPUT->footer();
     402      die;
     403  }
     404  
     405  /**
     406   * Decide the best display format.
     407   * @param object $resource
     408   * @return int display type constant
     409   */
     410  function resource_get_final_display_type($resource) {
     411      global $CFG, $PAGE;
     412  
     413      if ($resource->display != RESOURCELIB_DISPLAY_AUTO) {
     414          return $resource->display;
     415      }
     416  
     417      if (empty($resource->mainfile)) {
     418          return RESOURCELIB_DISPLAY_DOWNLOAD;
     419      } else {
     420          $mimetype = mimeinfo('type', $resource->mainfile);
     421      }
     422  
     423      if (file_mimetype_in_typegroup($mimetype, 'archive')) {
     424          return RESOURCELIB_DISPLAY_DOWNLOAD;
     425      }
     426      if (file_mimetype_in_typegroup($mimetype, array('web_image', '.htm', 'web_video', 'web_audio'))) {
     427          return RESOURCELIB_DISPLAY_EMBED;
     428      }
     429  
     430      // let the browser deal with it somehow
     431      return RESOURCELIB_DISPLAY_OPEN;
     432  }
     433  
     434  /**
     435   * File browsing support class
     436   */
     437  class resource_content_file_info extends file_info_stored {
     438      public function get_parent() {
     439          if ($this->lf->get_filepath() === '/' and $this->lf->get_filename() === '.') {
     440              return $this->browser->get_file_info($this->context);
     441          }
     442          return parent::get_parent();
     443      }
     444      public function get_visible_name() {
     445          if ($this->lf->get_filepath() === '/' and $this->lf->get_filename() === '.') {
     446              return $this->topvisiblename;
     447          }
     448          return parent::get_visible_name();
     449      }
     450  }
     451  
     452  function resource_set_mainfile($data) {
     453      global $DB;
     454      $fs = get_file_storage();
     455      $cmid = $data->coursemodule;
     456      $draftitemid = $data->files;
     457  
     458      $context = context_module::instance($cmid);
     459      if ($draftitemid) {
     460          file_save_draft_area_files($draftitemid, $context->id, 'mod_resource', 'content', 0, array('subdirs'=>true));
     461      }
     462      $files = $fs->get_area_files($context->id, 'mod_resource', 'content', 0, 'sortorder', false);
     463      if (count($files) == 1) {
     464          // only one file attached, set it as main file automatically
     465          $file = reset($files);
     466          file_set_sortorder($context->id, 'mod_resource', 'content', 0, $file->get_filepath(), $file->get_filename(), 1);
     467      }
     468  }
    

    Search This Site: