diff --git a/lib/tests/moodle_url_test.php b/lib/tests/moodle_url_test.php index 61b39455e643e..eb33e6ba76a9f 100644 --- a/lib/tests/moodle_url_test.php +++ b/lib/tests/moodle_url_test.php @@ -50,6 +50,9 @@ public function test_moodle_url_constructor() { $url = new \moodle_url('/index.php', null, 'test'); $this->assertSame($CFG->wwwroot.'/index.php#test', $url->out()); + $url = new \moodle_url('/index.php', null, 'Long "Anchor"'); + $this->assertSame($CFG->wwwroot . '/index.php#Long%20%22Anchor%22', $url->out()); + $url = new \moodle_url('/index.php', array('id' => 2), 'test'); $this->assertSame($CFG->wwwroot.'/index.php?id=2#test', $url->out()); } @@ -136,6 +139,18 @@ public function test_moodle_url_round_trip_array_params() { $this->assertSame($strurl, $url->out(false)); } + /** + * Test returning URL without parameters + */ + public function test_out_omit_querystring(): void { + global $CFG; + + $url = new \moodle_url('/index.php', ['id' => 2], 'Long "Anchor"'); + + $this->assertSame($CFG->wwwroot . '/index.php', $url->out_omit_querystring()); + $this->assertSame($CFG->wwwroot . '/index.php#Long%20%22Anchor%22', $url->out_omit_querystring(true)); + } + public function test_compare_url() { $url1 = new \moodle_url('index.php', array('var1' => 1, 'var2' => 2)); $url2 = new \moodle_url('index2.php', array('var1' => 1, 'var2' => 2, 'var3' => 3)); diff --git a/lib/weblib.php b/lib/weblib.php index 7111dd5e070ec..a2cdd9d0a3d19 100644 --- a/lib/weblib.php +++ b/lib/weblib.php @@ -619,7 +619,7 @@ public function raw_out($escaped = true, array $overrideparams = null) { $uri .= '?' . $querystring; } if (!is_null($this->anchor)) { - $uri .= '#'.$this->anchor; + $uri .= '#' . rawurlencode($this->anchor); } return $uri; @@ -639,7 +639,7 @@ public function out_omit_querystring($includeanchor = false) { $uri .= $this->port ? ':'.$this->port : ''; $uri .= $this->path ? $this->path : ''; if ($includeanchor and !is_null($this->anchor)) { - $uri .= '#' . $this->anchor; + $uri .= '#' . rawurlencode($this->anchor); } return $uri;