diff --git a/lib/accesslib.php b/lib/accesslib.php index cf029043ac1..4c81e300672 100644 --- a/lib/accesslib.php +++ b/lib/accesslib.php @@ -5779,6 +5779,13 @@ class context_helper extends context { protected function __construct() { } + /** + * Reset internal context levels array. + */ + public static function reset_levels() { + self::$alllevels = null; + } + /** * Initialise context levels, call before using self::$alllevels. */ @@ -5801,8 +5808,17 @@ class context_helper extends context { return; } + $levels = $CFG->custom_context_classes; + if (!is_array($levels)) { + $levels = @unserialize($levels); + } + if (!is_array($levels)) { + debugging('Invalid $CFG->custom_context_classes detected, value ignored.', DEBUG_DEVELOPER); + return; + } + // Unsupported custom levels, use with care!!! - foreach ($CFG->custom_context_classes as $level => $classname) { + foreach ($levels as $level => $classname) { self::$alllevels[$level] = $classname; } ksort(self::$alllevels); diff --git a/lib/tests/customcontext_test.php b/lib/tests/customcontext_test.php new file mode 100644 index 00000000000..eaa2f3c888e --- /dev/null +++ b/lib/tests/customcontext_test.php @@ -0,0 +1,138 @@ +. + +/** + * Code quality unit tests that are fast enough to run each time. + * + * @package core + * @category phpunit + * @copyright (C) 2013 onwards Remote Learner.net Inc (http://www.remote-learner.net) + * @author Brent Boghosian (brent.boghosian@remote-learner.net) + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +defined('MOODLE_INTERNAL') || die(); + +/** + * Bogus custom context class for testing + */ +class context_bogus1 extends context { + /** + * Returns the most relevant URL for this context. + * + * @return moodle_url + */ + public function get_url() { + global $ME; + return $ME; + } + + /** + * Returns array of relevant context capability records. + * + * @return array + */ + public function get_capabilities() { + return array(); + } +} + +/** + * Bogus custom context class for testing + */ +class context_bogus2 extends context { + /** + * Returns the most relevant URL for this context. + * + * @return moodle_url + */ + public function get_url() { + global $ME; + return $ME; + } + + /** + * Returns array of relevant context capability records. + * + * @return array + */ + public function get_capabilities() { + return array(); + } +} + +/** + * Bogus custom context class for testing + */ +class context_bogus3 extends context { + /** + * Returns the most relevant URL for this context. + * + * @return moodle_url + */ + public function get_url() { + global $ME; + return $ME; + } + + /** + * Returns array of relevant context capability records. + * + * @return array + */ + public function get_capabilities() { + return array(); + } +} + +class customcontext_testcase extends advanced_testcase { + + /** + * Perform setup before every test. This tells Moodle's phpunit to reset the database after every test. + */ + protected function setUp() { + parent::setUp(); + $this->resetAfterTest(true); + } + + /** + * Test case for custom context classes + */ + public function test_customcontexts() { + global $CFG; + static $customcontexts = array( + 11 => 'context_bogus1', + 12 => 'context_bogus2', + 13 => 'context_bogus3' + ); + + // save any existing custom contexts + $existingcustomcontexts = get_config(null, 'custom_context_classes'); + + set_config('custom_context_classes', serialize($customcontexts)); + initialise_cfg(); + context_helper::reset_levels(); + $alllevels = context_helper::get_all_levels(); + $this->assertEquals($alllevels[11], 'context_bogus1'); + $this->assertEquals($alllevels[12], 'context_bogus2'); + $this->assertEquals($alllevels[13], 'context_bogus3'); + + // clean-up & restore any custom contexts + set_config('custom_context_classes', ($existingcustomcontexts === false) ? null : $existingcustomcontexts); + initialise_cfg(); + context_helper::reset_levels(); + } +}