MDL-33887 delay string fetching in PAGE->requires->string_for_js() till page footer
authorPetr Škoda <commits@skodak.org>
Thu, 21 Jun 2012 07:58:45 +0000 (09:58 +0200)
committerSam Hemelryk <sam@moodle.com>
Tue, 10 Jul 2012 03:08:26 +0000 (15:08 +1200)
This should resolve problems with language switching such as when forcing course language.

lib/outputrequirementslib.php
lib/tests/outputrequirementslib_test.php [new file with mode: 0644]

index 5329958..e438abf 100644 (file)
@@ -63,6 +63,11 @@ class page_requirements_manager {
      */
     protected $stringsforjs = array();
 
      */
     protected $stringsforjs = array();
 
+    /**
+     * @var array List of get_string $a parameters - used for validation only.
+     */
+    protected $stringsforjs_as = array();
+
     /**
      * @var array List of JS variables to be initialised
      */
     /**
      * @var array List of JS variables to be initialised
      */
@@ -867,15 +872,17 @@ class page_requirements_manager {
      * @param mixed $a any extra data to add into the string (optional).
      */
     public function string_for_js($identifier, $component, $a = NULL) {
      * @param mixed $a any extra data to add into the string (optional).
      */
     public function string_for_js($identifier, $component, $a = NULL) {
-        $string = get_string($identifier, $component, $a);
         if (!$component) {
         if (!$component) {
-            throw new coding_exception('The $module parameter is required for page_requirements_manager::string_for_js.');
+            throw new coding_exception('The $component parameter is required for page_requirements_manager::string_for_js().');
         }
         }
-        if (isset($this->stringsforjs[$component][$identifier]) && $this->stringsforjs[$component][$identifier] !== $string) {
+        if (isset($this->stringsforjs_as[$component][$identifier]) and $this->stringsforjs_as[$component][$identifier] !== $a) {
             throw new coding_exception("Attempt to re-define already required string '$identifier' " .
             throw new coding_exception("Attempt to re-define already required string '$identifier' " .
-                    "from lang file '$component'. Did you already ask for it with a different \$a? {$this->stringsforjs[$component][$identifier]} !== $string");
+                    "from lang file '$component' with different \$a parameter?");
+        }
+        if (!isset($this->stringsforjs[$component][$identifier])) {
+            $this->stringsforjs[$component][$identifier] = new lang_string($identifier, $component, $a);
+            $this->stringsforjs_as[$component][$identifier] = $a;
         }
         }
-        $this->stringsforjs[$component][$identifier] = $string;
     }
 
     /**
     }
 
     /**
@@ -1218,7 +1225,13 @@ class page_requirements_manager {
 
         // add all needed strings
         if (!empty($this->stringsforjs)) {
 
         // add all needed strings
         if (!empty($this->stringsforjs)) {
-            $output .= html_writer::script(js_writer::set_variable('M.str', $this->stringsforjs));
+            $strings = array();
+            foreach ($this->stringsforjs as $component=>$v) {
+                foreach($v as $indentifier => $langstring) {
+                    $strings[$component][$indentifier] = $langstring->out();
+                }
+            }
+            $output .= html_writer::script(js_writer::set_variable('M.str', $strings));
         }
 
         // add variables
         }
 
         // add variables
diff --git a/lib/tests/outputrequirementslib_test.php b/lib/tests/outputrequirementslib_test.php
new file mode 100644 (file)
index 0000000..b5b1b20
--- /dev/null
@@ -0,0 +1,49 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+ * Unit tests for lib/outputrequirementslibphp.
+ *
+ * @package   core
+ * @category  phpunit
+ * @copyright 2012 Petr Škoda
+ * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+defined('MOODLE_INTERNAL') || die();
+
+global $CFG;
+require_once($CFG->libdir . '/outputrequirementslib.php');
+
+
+class outputrequirements_test extends advanced_testcase {
+    public function test_string_for_js() {
+        $this->resetAfterTest();
+
+        $page = new moodle_page();
+        $page->requires->string_for_js('course', 'moodle', 1);
+        $page->requires->string_for_js('course', 'moodle', 1);
+        try {
+            $page->requires->string_for_js('course', 'moodle', 2);
+            $this->fail('Exception expected when the same string with different $a requested');
+        } catch (Exception $e) {
+            $this->assertInstanceOf('coding_exception', $e);
+        }
+
+        // Note: we can not switch languages in phpunit yet,
+        //       it would be nice to test that the strings are actually fetched in the footer.
+    }
+}