Permalink
Browse files

MDL-33887 delay string fetching in PAGE->requires->string_for_js() ti…

…ll page footer

This should resolve problems with language switching such as when forcing course language.
  • Loading branch information...
1 parent c82d7fc commit c8b70884634499a0462f6edfd839bc3d605b4192 @skodak skodak committed with Sam Hemelryk Jun 21, 2012
Showing with 68 additions and 6 deletions.
  1. +19 −6 lib/outputrequirementslib.php
  2. +49 −0 lib/tests/outputrequirementslib_test.php
@@ -64,6 +64,11 @@ class page_requirements_manager {
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
*/
protected $jsinitvariables = array('head'=>array(), 'footer'=>array());
@@ -867,15 +872,17 @@ public function js_init_code($jscode, $ondomready = false, array $module = 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) {
- 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' " .
- "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 @@ public function get_end_code() {
// 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
@@ -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.
+ }
+}

0 comments on commit c8b7088

Please sign in to comment.