]> git.mjollnir.org Git - moodle.git/commitdiff
Reworked require_js() so that it will not load libraries more than once.
authorvyshane <vyshane>
Fri, 2 Feb 2007 06:35:25 +0000 (06:35 +0000)
committervyshane <vyshane>
Fri, 2 Feb 2007 06:35:25 +0000 (06:35 +0000)
Related to MDL-7682 and MDL-8374.

lib/ajax/ajaxlib.php

index e910176f24c31329c3b9cbbd7b4246840a8fbb67..e9eb01055cc50dcb1126c9d72dc93c4a8b189b58 100644 (file)
@@ -1,19 +1,72 @@
-<?php // Library functions for using AJAX with Moodle
+<?php
+/**
+ * Library functions for using AJAX with Moodle.
+ */
+
+
 
 /**
- * Print require statements for javascript libraries.
- * Takes in an array of either full paths or shortnames and it will translate
- * them to full paths.
- **/
-function require_js($list) {
+ * Used to include JavaScript libraries.
+ *
+ * When the $lib parameter is given, the function will add $lib to an
+ * internal list of libraries. When called without any parameters, it will
+ * return the html that is needed to load the JavaScript libraries in that
+ * list. Libraries that are included more than once will still only get loaded
+ * once, so this works like require_once() in PHP.
+ *
+ * @param $lib - string or array of strings
+ *               string(s) should be the shortname for the library or the
+ *               full path to the library file.
+ * @return string or false or nothing.
+ */
+function require_js($lib='') {
     global $CFG;
-    $output = '';
+    static $loadlibs = array();
 
     if (!ajaxenabled()) {
-        return;
+        return false;
+    }
+
+    if (!empty($lib)) {
+        // Add the lib to the list of libs to be loaded, if it isn't already
+        // in the list.
+        if (is_array($lib)) {
+            array_map('require_js', $lib);
+        } else {
+            $libpath = ajax_get_lib($lib);
+            if (array_search($libpath, $loadlibs) === false) {
+                array_push($loadlibs, $libpath);
+            }
+        }
+    } else {
+        // Return the html needed to load the JavaScript files defined in
+        // our list of libs to be loaded.
+        $output = '';
+
+        foreach ($loadlibs as $loadlib) {
+            $output .= '<script type="text/javascript" ';
+            $output .= " src=\"$loadlib\"></script>\n";
+            if ($loadlib == $CFG->wwwroot.'/lib/yui/logger/logger-min.js') {
+                // Special case, we need the CSS too.
+                $output .= '<link type="text/css" rel="stylesheet" ';
+                $output .= " href=\"{$CFG->wwwroot}/lib/yui/logger/assets/logger.css\" />\n";
+            }
+        }
+        return $output;
     }
+}
+
+
+/**
+ * Get the path to a JavaScript library.
+ * @param $libname - the name of the library whose path we need.
+ * @return string
+ */
+function ajax_get_lib($libname) {
+
+    global $CFG;
+    $libpath = '';
 
-    //list of shortname to filepath translations
     $translatelist = array(
             'yui_yahoo' => '/lib/yui/yahoo/yahoo-min.js',
                        'yui_animation' => '/lib/yui/animation/animation-min.js',
@@ -36,18 +89,18 @@ function require_js($list) {
             'ajaxcourse' => '/lib/ajax/ajaxcourse.js'
             );
 
-    for ($i=0; $i<count($list); $i++) {
-        if ($translatelist[$list[$i]]) {
-            $output .= "<script type='text/javascript' src='".$CFG->wwwroot.''.$translatelist[$list[$i]]."'></script>\n";
-            if ($translatelist[$list[$i]] == '/lib/yui/logger/logger-min.js') {
-                // Special case. We need the css.
-                $output .= "<link type='text/css' rel='stylesheet' href='{$CFG->wwwroot}/lib/yui/logger/assets/logger.css' />";
-            }
-        } else {
-            $output .= "<script type='text/javascript' src='".$CFG->wwwroot.''.$list[$i]."'></script>\n";
-        }
+    if (array_key_exists($libname, $translatelist)) {
+        $libpath = $CFG->wwwroot . $translatelist[$libname];
+    } else {
+        $libpath = $libname;
     }
-    return $output;
+
+    $testpath = str_replace($CFG->wwwroot, $CFG->dirroot, $libpath);
+    if (!file_exists($testpath)) {        
+        error('require_js: '.$libpath.' - file not found.');
+    }
+
+    return $libpath;
 }