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.
This commit is contained in:
Petr Škoda 2012-06-21 09:58:45 +02:00
parent 2cbdaa77ea
commit af225f6c9c
2 changed files with 68 additions and 6 deletions

View 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
*/ */
@ -861,15 +866,17 @@ class page_requirements_manager {
* @param mixed $a any extra data to add into the string (optional). * @param mixed $a any extra data to add into the string (optional).
*/ */
public function string_for_js($identifier, $component, $a = NULL) { 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;
} }
/** /**
@ -1212,7 +1219,13 @@ class page_requirements_manager {
// add all needed strings // add all needed strings
if (!empty($this->stringsforjs)) { 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

View File

@ -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.
}
}