From 7402dcd5fdbb9cfda0b42b677aff7f578276b192 Mon Sep 17 00:00:00 2001 From: Andrew Nicols Date: Sun, 1 Sep 2013 23:52:58 +0100 Subject: [PATCH] MDL-41516 Themes: Ensure that blocks are set up early Blocks can require JavaScript which must be set up early in the page lifecycle. In order to do so, we should ensure that content is created in the standard head setup before any other output is created so that any subsequent use of block instances are no longer the first such use when they may already be too late in the lifecycle. --- lib/blocklib.php | 2 +- lib/outputrenderers.php | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/lib/blocklib.php b/lib/blocklib.php index 54f08a8c8a2..58855e72293 100644 --- a/lib/blocklib.php +++ b/lib/blocklib.php @@ -993,7 +993,7 @@ class block_manager { * * @param string $region The name of the region to check */ - protected function ensure_content_created($region, $output) { + public function ensure_content_created($region, $output) { $this->ensure_instances_exist($region); if (!array_key_exists($region, $this->visibleblockcontent)) { $contents = array(); diff --git a/lib/outputrenderers.php b/lib/outputrenderers.php index 033471ba740..da3dbc73be9 100644 --- a/lib/outputrenderers.php +++ b/lib/outputrenderers.php @@ -345,6 +345,16 @@ class core_renderer extends renderer_base { */ public function standard_head_html() { global $CFG, $SESSION; + + // Before we output any content, we need to ensure that certain + // page components are set up. + + // Blocks must be set up early as they may require javascript which + // has to be included in the page header before output is created. + foreach ($this->page->blocks->get_regions() as $region) { + $this->page->blocks->ensure_content_created($region, $this); + } + $output = ''; $output .= '' . "\n"; $output .= '' . "\n";