Search moodle.org's
Developer Documentation


Long Term Support Release

  • Bug fixes for general core bugs in 3.9.x will end* 10 May 2021 (12 months).
  • Bug fixes for security issues in 3.9.x will end* 8 May 2023 (36 months).
  • PHP version: minimum PHP 7.2.0 Note: minimum PHP version has increased since Moodle 3.8. PHP 7.3.x and 7.4.x are supported too.
  •    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   * This file is responsible for serving the one huge CSS of each theme.
      19   *
      20   * @package   core
      21   * @copyright 2009 Petr Skoda (skodak)  {@link http://skodak.org}
      22   * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
      23   */
      24  
      25  
      26  // disable moodle specific debug messages and any errors in output,
      27  // comment out when debugging or better look into error log!
      28  define('NO_DEBUG_DISPLAY', true);
      29  
      30  // we need just the values from config.php and minlib.php
      31  define('ABORT_AFTER_CONFIG', true);
      32  require('../config.php'); // this stops immediately at the beginning of lib/setup.php
      33  require_once("$CFG->dirroot/lib/jslib.php");
      34  
      35  if ($slashargument = min_get_slash_argument()) {
      36      $slashargument = ltrim($slashargument, '/');
      37      if (substr_count($slashargument, '/') < 2) {
      38          header('HTTP/1.0 404 not found');
      39          die('Slash argument must contain both a revision and a file path');
      40      }
      41      // image must be last because it may contain "/"
      42      list($themename, $rev, $type) = explode('/', $slashargument, 3);
      43      $themename = min_clean_param($themename, 'SAFEDIR');
      44      $rev       = min_clean_param($rev, 'INT');
      45      $type      = min_clean_param($type, 'SAFEDIR');
      46  
      47  } else {
      48      $themename = min_optional_param('theme', 'standard', 'SAFEDIR');
      49      $rev       = min_optional_param('rev', -1, 'INT');
      50      $type      = min_optional_param('type', 'head', 'RAW');
      51  }
      52  
      53  if ($type !== 'head' and $type !== 'footer') {
      54      header('HTTP/1.0 404 not found');
      55      die('Theme was not found, sorry.');
      56  }
      57  
      58  if (file_exists("$CFG->dirroot/theme/$themename/config.php")) {
      59      // exists
      60  } else if (!empty($CFG->themedir) and file_exists("$CFG->themedir/$themename/config.php")) {
      61      // exists
      62  } else {
      63      header('HTTP/1.0 404 not found');
      64      die('Theme was not found, sorry.');
      65  }
      66  
      67  $candidate = "$CFG->localcachedir/theme/$rev/$themename/javascript_$type.js";
      68  $etag = sha1("$rev/$themename/$type");
      69  
      70  if ($rev > 0 and file_exists($candidate)) {
      71      if (!empty($_SERVER['HTTP_IF_NONE_MATCH']) || !empty($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
      72          // we do not actually need to verify the etag value because our files
      73          // never change in cache because we increment the rev parameter
      74          js_send_unmodified(filemtime($candidate), $etag);
      75      }
      76      js_send_cached($candidate, $etag);
      77  }
      78  
      79  //=================================================================================
      80  // ok, now we need to start normal moodle script, we need to load all libs and $DB
      81  define('ABORT_AFTER_CONFIG_CANCEL', true);
      82  
      83  define('NO_MOODLE_COOKIES', true); // Session not used here
      84  define('NO_UPGRADE_CHECK', true);  // Ignore upgrade check
      85  
      86  require("$CFG->dirroot/lib/setup.php");
      87  
      88  $theme = theme_config::load($themename);
      89  $themerev = theme_get_revision();
      90  
      91  if ($themerev <= 0 or $rev != $themerev) {
      92      // Do not send caching headers if they do not request current revision,
      93      // we do not want to pollute browser caches with outdated JS.
      94      js_send_uncached($theme->javascript_content($type));
      95  }
      96  
      97  make_localcache_directory('theme', false);
      98  
      99  js_write_cache_file_content($candidate, core_minify::js_files($theme->javascript_files($type)));
     100  // Verify nothing failed in cache file creation.
     101  clearstatcache();
     102  if (file_exists($candidate)) {
     103      js_send_cached($candidate, $etag);
     104  }
     105  
     106  js_send_uncached($theme->javascript_content($type));
    

    Search This Site: