mirror of
https://github.com/moodle/moodle.git
synced 2025-08-04 16:36:37 +02:00
MDL-21193 finally fixed YUI3 laoding - now fully cached and working - yay!
This commit is contained in:
parent
7a82b2afc8
commit
945f19f77d
4 changed files with 90 additions and 60 deletions
|
@ -25,54 +25,6 @@
|
|||
*/
|
||||
|
||||
|
||||
/**
|
||||
* Initialise a {@link page_requirements_manager} with the bits of JavaScript that every
|
||||
* Moodle page should have.
|
||||
*
|
||||
* @param page_requirements_manager $requires The page_requirements_manager to initialise.
|
||||
*/
|
||||
function setup_core_javascript(page_requirements_manager $requires) {
|
||||
global $CFG, $OUTPUT, $PAGE;
|
||||
|
||||
// JavaScript should always work with $CFG->httpswwwroot rather than $CFG->wwwroot.
|
||||
// Otherwise, in some situations, users will get warnings about insecure content
|
||||
// on sercure pages from their web browser.
|
||||
|
||||
$config = array(
|
||||
'wwwroot' => $CFG->httpswwwroot, // Yes, really. See above.
|
||||
'sesskey' => sesskey(),
|
||||
'loadingicon' => $OUTPUT->pix_url('i/loading_small', 'moodle')->out_raw(),
|
||||
'themerev' => theme_get_revision(),
|
||||
'theme' => $PAGE->theme->name,
|
||||
);
|
||||
if (debugging('', DEBUG_DEVELOPER)) {
|
||||
$config['developerdebug'] = true;
|
||||
}
|
||||
$requires->data_for_js('moodle_cfg', $config)->in_head();
|
||||
|
||||
if (debugging('', DEBUG_DEVELOPER)) {
|
||||
$requires->yui2_lib('logger');
|
||||
}
|
||||
|
||||
// YUI3 init code
|
||||
$requires->yui3_lib(array('cssreset', 'cssbase', 'cssfonts', 'cssgrids')); // full CSS reset
|
||||
$requires->yui3_lib('yui'); // allows autoloading of everything else
|
||||
|
||||
|
||||
$requires->skip_link_to('maincontent', get_string('tocontent', 'access'));
|
||||
|
||||
// Note that, as a short-cut, the code
|
||||
// $js = "document.body.className += ' jsenabled';\n";
|
||||
// is hard-coded in {@link page_requirements_manager::get_top_of_body_code)
|
||||
$requires->yui2_lib('container');
|
||||
$requires->yui2_lib('connection');
|
||||
$requires->string_for_js('confirmation', 'admin');
|
||||
$requires->string_for_js('cancel', 'moodle');
|
||||
$requires->string_for_js('yes', 'moodle');
|
||||
$requires->js_function_call('init_help_icons');
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* This class tracks all the things that are needed by the current page.
|
||||
*
|
||||
|
@ -110,16 +62,19 @@ class page_requirements_manager {
|
|||
protected $headdone = false;
|
||||
protected $topofbodydone = false;
|
||||
|
||||
/** YUI PHPLoader instance responsible for YUI3 laoding in page head only */
|
||||
protected $yui3loader;
|
||||
/** YUI PHPLoader instance responsible for YUI2 laoding */
|
||||
/** YUI PHPLoader instance responsible for YUI2 loading from PHP only */
|
||||
protected $yui2loader;
|
||||
/** YUI PHPLoader instance responsible for YUI3 loading from PHP only */
|
||||
protected $yui3loader;
|
||||
/** YUI PHPLoader instance responsible for YUI3 loading from javascript */
|
||||
protected $json_yui3loader;
|
||||
|
||||
/**
|
||||
* Page requirements constructor.
|
||||
*/
|
||||
public function __construct() {
|
||||
global $CFG;
|
||||
|
||||
require_once("$CFG->libdir/yui/phploader/phploader/loader.php");
|
||||
|
||||
$this->yui3loader = new YAHOO_util_Loader($CFG->yui3version);
|
||||
|
@ -136,18 +91,84 @@ class page_requirements_manager {
|
|||
if (!empty($CFG->useexternalyui)) {
|
||||
$this->yui3loader->base = 'http://yui.yahooapis.com/' . $CFG->yui3version . '/build/';
|
||||
$this->yui2loader->base = 'http://yui.yahooapis.com/' . $CFG->yui2version . '/build/';
|
||||
$this->yui3loader->comboBase = 'http://yui.yahooapis.com/combo?';
|
||||
$this->yui2loader->comboBase = 'http://yui.yahooapis.com/combo?';
|
||||
} else {
|
||||
$this->yui3loader->base = $CFG->httpswwwroot . '/lib/yui/'. $CFG->yui3version . '/build/';
|
||||
$this->yui2loader->base = $CFG->httpswwwroot . '/lib/yui/'. $CFG->yui2version . '/build/';
|
||||
$this->yui3loader->comboBase = $CFG->httpswwwroot . '/theme/yui_combo.php?';
|
||||
$this->yui2loader->comboBase = $CFG->httpswwwroot . '/theme/yui_combo.php?';
|
||||
}
|
||||
|
||||
// This file helps to minimise number of http requests and implements proper caching
|
||||
$this->yui3loader->comboBase = $CFG->httpswwwroot . '/theme/yui_combo.php?';
|
||||
$this->yui2loader->comboBase = $CFG->httpswwwroot . '/theme/yui_combo.php?';
|
||||
|
||||
// enable combo loader? this significantly helps with caching and performance
|
||||
// enable combo loader? this significantly helps with caching and performance!
|
||||
$this->yui3loader->combine = !empty($CFG->yuicomboloading);
|
||||
$this->yui2loader->combine = !empty($CFG->yuicomboloading);
|
||||
|
||||
// set up JS loader helper object
|
||||
$this->json_yui3loader = new stdClass();
|
||||
$this->json_yui3loader->base = $this->yui3loader->base;
|
||||
$this->json_yui3loader->comboBase = $this->yui3loader->comboBase;
|
||||
$this->json_yui3loader->combine = $this->yui3loader->combine;
|
||||
$this->json_yui3loader->filter = ($this->yui3loader->filter == YUI_DEBUG) ? 'debug' : '';
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialise with the bits of JavaScript that every Moodle page should have.
|
||||
*
|
||||
* @param moodle_page $page
|
||||
* @param core_renderer $output
|
||||
*/
|
||||
function setup_core_javascript(moodle_page $page, core_renderer $output) {
|
||||
global $CFG;
|
||||
|
||||
// JavaScript should always work with $CFG->httpswwwroot rather than $CFG->wwwroot.
|
||||
// Otherwise, in some situations, users will get warnings about insecure content
|
||||
// on sercure pages from their web browser.
|
||||
|
||||
//TODO: problem here is we may need this in some included JS - move this somehow to the very beginning
|
||||
// right after the YUI loading
|
||||
$config = array(
|
||||
'wwwroot' => $CFG->httpswwwroot, // Yes, really. See above.
|
||||
'sesskey' => sesskey(),
|
||||
'loadingicon' => $output->pix_url('i/loading_small', 'moodle')->out_raw(),
|
||||
'themerev' => theme_get_revision(),
|
||||
'theme' => $page->theme->name,
|
||||
'yui2loaderBase' => $this->yui2loader->base,
|
||||
'yui3loaderBase' => $this->yui3loader->base,
|
||||
'yui2loaderComboBase' => $this->yui2loader->comboBase,
|
||||
'yui3loaderComboBase' => $this->yui3loader->comboBase,
|
||||
'yuicombine' => (int)$this->yui3loader->combine,
|
||||
'yuifilter' => debugging('', DEBUG_DEVELOPER) ? 'debug' : '',
|
||||
|
||||
);
|
||||
if (debugging('', DEBUG_DEVELOPER)) {
|
||||
$config['developerdebug'] = true;
|
||||
}
|
||||
$this->data_for_js('moodle_cfg', $config)->in_head();
|
||||
|
||||
// note: in JavaScript use "YUI(yui3loader).use('overlay', function(Y) { .... });"
|
||||
$this->data_for_js('yui3loader', $this->json_yui3loader)->in_head();
|
||||
|
||||
if (debugging('', DEBUG_DEVELOPER)) {
|
||||
$this->yui2_lib('logger');
|
||||
}
|
||||
|
||||
// YUI3 init code
|
||||
$this->yui3_lib(array('cssreset', 'cssbase', 'cssfonts', 'cssgrids')); // full CSS reset
|
||||
$this->yui3_lib(array('yui', 'loader')); // allows autoloading of everything else
|
||||
|
||||
|
||||
$this->skip_link_to('maincontent', get_string('tocontent', 'access'));
|
||||
|
||||
// Note that, as a short-cut, the code
|
||||
// $js = "document.body.className += ' jsenabled';\n";
|
||||
// is hard-coded in {@link page_requirements_manager::get_top_of_body_code)
|
||||
$this->yui2_lib('container');
|
||||
$this->yui2_lib('connection');
|
||||
$this->string_for_js('confirmation', 'admin');
|
||||
$this->string_for_js('cancel', 'moodle');
|
||||
$this->string_for_js('yes', 'moodle');
|
||||
$this->js_function_call('init_help_icons');
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -199,7 +220,7 @@ class page_requirements_manager {
|
|||
* of other libraries) it will only be linked to once.
|
||||
*
|
||||
* The library is leaded as soon as possible, if $OUTPUT->header() not used yet it
|
||||
* is put into the page header, otherwise it is loaded in the page footer.
|
||||
* is put into the page header, otherwise it is loaded in the page footer.
|
||||
*
|
||||
* @param string|array $libname the name of the YUI2 library you require. For example 'autocomplete'.
|
||||
* @return void
|
||||
|
@ -511,8 +532,10 @@ class page_requirements_manager {
|
|||
*
|
||||
* @return string the HTML code to to inside the <head> tag.
|
||||
*/
|
||||
public function get_head_code() {
|
||||
setup_core_javascript($this);
|
||||
public function get_head_code($page, $output) {
|
||||
// note: the $page and $output are not stored here because it would
|
||||
// create circular references in memory which prevents garbage collection
|
||||
$this->setup_core_javascript($page, $output);
|
||||
$output = $this->get_yui3lib_headcode();
|
||||
$output .= $this->get_yui2lib_code();
|
||||
$output .= $this->get_linked_resources_code(self::WHEN_IN_HEAD);
|
||||
|
|
|
@ -394,7 +394,7 @@ class core_renderer extends renderer_base {
|
|||
}
|
||||
|
||||
// Get any HTML from the page_requirements_manager.
|
||||
$output .= $this->page->requires->get_head_code();
|
||||
$output .= $this->page->requires->get_head_code($this->page, $this);
|
||||
|
||||
// List alternate versions.
|
||||
foreach ($this->page->alternateversions as $type => $alt) {
|
||||
|
|
|
@ -33,6 +33,8 @@ if (!$parts = combo_params()) {
|
|||
combo_not_found();
|
||||
}
|
||||
|
||||
$parts = trim($parts, '&');
|
||||
|
||||
// find out what we are serving - only one type per request
|
||||
$content = '';
|
||||
if (substr($parts, -3) === '.js') {
|
||||
|
@ -46,6 +48,9 @@ if (substr($parts, -3) === '.js') {
|
|||
$parts = explode('&', $parts);
|
||||
|
||||
foreach ($parts as $part) {
|
||||
if (empty($part)) {
|
||||
continue;
|
||||
}
|
||||
$part = min_clean_param($part, 'SAFEPATH');
|
||||
$bits = explode('/', $part);
|
||||
if (count($bits) < 2) {
|
||||
|
@ -81,6 +86,7 @@ function combo_send_cached($content, $mimetype) {
|
|||
header('Last-Modified: '. gmdate('D, d M Y H:i:s', time()) .' GMT');
|
||||
header('Expires: '. gmdate('D, d M Y H:i:s', time() + $lifetime) .' GMT');
|
||||
header('Pragma: ');
|
||||
header('Cache-Control: max-age=315360000');
|
||||
header('Accept-Ranges: none');
|
||||
header('Content-Type: '.$mimetype);
|
||||
header('Content-Length: '.strlen($content));
|
||||
|
|
|
@ -70,6 +70,7 @@ function yui_image_cached($imagepath) {
|
|||
header('Last-Modified: '. gmdate('D, d M Y H:i:s', filemtime($imagepath)) .' GMT');
|
||||
header('Expires: '. gmdate('D, d M Y H:i:s', time() + $lifetime) .' GMT');
|
||||
header('Pragma: ');
|
||||
header('Cache-Control: max-age=315360000');
|
||||
header('Accept-Ranges: none');
|
||||
header('Content-Type: '.$mimetype);
|
||||
header('Content-Length: '.filesize($imagepath));
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue