diff --git a/libraries/joomla/document/renderer/html/modules.php b/libraries/joomla/document/renderer/html/modules.php index 6780a8e8eca16..fb50cb5a4eff9 100644 --- a/libraries/joomla/document/renderer/html/modules.php +++ b/libraries/joomla/document/renderer/html/modules.php @@ -50,6 +50,8 @@ public function render($position, $params = array(), $content = null) $buffer .= $moduleHtml; } + JEventDispatcher::getInstance()->trigger('onAfterRenderModules', array(&$buffer, &$params)); + return $buffer; } } diff --git a/tests/unit/suites/libraries/joomla/document/renderer/JDocumentRendererHtmlModulesTest.php b/tests/unit/suites/libraries/joomla/document/renderer/JDocumentRendererHtmlModulesTest.php new file mode 100644 index 0000000000000..4eb4de9ea392b --- /dev/null +++ b/tests/unit/suites/libraries/joomla/document/renderer/JDocumentRendererHtmlModulesTest.php @@ -0,0 +1,128 @@ +saveFactoryState(); + + JFactory::$application = $this->getMockCmsApp(); + JFactory::$session = $this->getMockSession(); + $this->dispatcher = new JEventDispatcher; + TestReflection::setValue($this->dispatcher, 'instance', $this->dispatcher); + $this->dispatcher->register('onAfterRenderModules', array($this, 'eventCallback')); + } + + /** + * Tears down the fixture, for example, closes a network connection. + * This method is called after a test is executed. + * + * @return void + * + * @since 3.6 + */ + protected function tearDown() + { + $this->restoreFactoryState(); + TestReflection::setValue($this->dispatcher, 'instance', null); + parent::tearDown(); + } + + /** + * Gets the data set to be loaded into the database during setup + * + * @return PHPUnit_Extensions_Database_DataSet_CsvDataSet + * + * @since 3.6 + */ + protected function getDataSet() + { + $dataSet = new PHPUnit_Extensions_Database_DataSet_CsvDataSet(',', "'", '\\'); + + $dataSet->addTable('jos_extensions', JPATH_TEST_DATABASE . '/jos_extensions.csv'); + $dataSet->addTable('jos_modules', JPATH_TEST_DATABASE . '/jos_modules.csv'); + $dataSet->addTable('jos_modules_menu', JPATH_TEST_DATABASE . '/jos_modules_menu.csv'); + + return $dataSet; + } + + /** + * Test JDocumentRendererHtmlModules::render + * + * @return void + * + * @since 3.6 + */ + public function testRender() + { + $document = new JDocumentHtml; + $renderer = $document->loadRenderer('modules'); + $params = array('name' => 'position-0', 'style' => 'xhtml'); + $this->callbackExecuted = false; + $output = $renderer->render('position-0', $params); + $htmlClean = trim(preg_replace('~>\s+<~', '><', $output)); + $this->assertTrue($this->callbackExecuted, 'onAfterRenderModules event is not executed'); + $html = '

Search

'; + $this->assertEquals($html, $htmlClean, 'render output does not match expected content'); + } + + /** + * Callback for event 'onAfterRenderModules' + * + * @param string &$buffer contains rendered output from JDocumentRendererHtmlModules::render + * + * @param array &$params template position and style parameters + * + * @return void + * + * @since 3.6 + */ + public function eventCallback(&$buffer, &$params) + { + $this->assertContains('mod_search63', $buffer, 'buffer empty when processing onAfterRenderModules event'); + $this->assertArrayHasKey('name', $params, "params['name'] empty when processing onAfterRenderModules event"); + $this->callbackExecuted = true; + } +} +