From c8b70884634499a0462f6edfd839bc3d605b4192 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Petr=20=C5=A0koda?= Date: Thu, 21 Jun 2012 09:58:45 +0200 Subject: [PATCH] MDL-33887 delay string fetching in PAGE->requires->string_for_js() till page footer This should resolve problems with language switching such as when forcing course language. --- lib/outputrequirementslib.php | 25 +++++++++--- lib/tests/outputrequirementslib_test.php | 49 ++++++++++++++++++++++++ 2 files changed, 68 insertions(+), 6 deletions(-) create mode 100644 lib/tests/outputrequirementslib_test.php diff --git a/lib/outputrequirementslib.php b/lib/outputrequirementslib.php index 5329958a924..e438abf7257 100644 --- a/lib/outputrequirementslib.php +++ b/lib/outputrequirementslib.php @@ -63,6 +63,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 */ @@ -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) { - $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 @@ class page_requirements_manager { // 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 diff --git a/lib/tests/outputrequirementslib_test.php b/lib/tests/outputrequirementslib_test.php new file mode 100644 index 00000000000..b5b1b20ac55 --- /dev/null +++ b/lib/tests/outputrequirementslib_test.php @@ -0,0 +1,49 @@ +. + +/** + * 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. + } +} -- 2.43.0