From 0a1e9aa03719704aaff01ea79ef0baf6e02fa0b7 Mon Sep 17 00:00:00 2001 From: Alex Pott <alex.a.pott@googlemail.com> Date: Mon, 10 Feb 2014 09:39:44 +0000 Subject: [PATCH] Issue #2084907 by clemens.tolboom, chris_hall_hu_cheng, Noe_, discipolo, Xano, patrickd, damiankloip, alexpott | Jeff Burnz: Hook_views_pre_render() is broken if your theme implements a base theme. --- .../test_basetheme/test_basetheme.theme | 23 +++++ .../themes/test_subtheme/test_subtheme.theme | 24 +++++ .../views/Tests/ViewsThemeIntegrationTest.php | 93 +++++++++++++++++++ .../views/lib/Drupal/views/ViewExecutable.php | 4 +- 4 files changed, 142 insertions(+), 2 deletions(-) create mode 100644 core/modules/system/tests/themes/test_basetheme/test_basetheme.theme create mode 100644 core/modules/system/tests/themes/test_subtheme/test_subtheme.theme create mode 100644 core/modules/views/lib/Drupal/views/Tests/ViewsThemeIntegrationTest.php diff --git a/core/modules/system/tests/themes/test_basetheme/test_basetheme.theme b/core/modules/system/tests/themes/test_basetheme/test_basetheme.theme new file mode 100644 index 000000000000..ef6e071d553d --- /dev/null +++ b/core/modules/system/tests/themes/test_basetheme/test_basetheme.theme @@ -0,0 +1,23 @@ +<?php + +/** + * @file + * Add hooks for tests to use. + */ +use Drupal\views\ViewExecutable; + +/** + * Implements hook_views_pre_render(). + */ +function test_basetheme_views_pre_render(ViewExecutable $view) { + // We append the function name to the title for test to check for. + $view->setTitle($view->getTitle() . ":" . __FUNCTION__); +} + +/** + * Implements hook_views_post_render(). + */ +function test_basetheme_views_post_render(ViewExecutable $view) { + // We append the function name to the title for test to check for. + $view->setTitle($view->getTitle() . ":" . __FUNCTION__); +} diff --git a/core/modules/system/tests/themes/test_subtheme/test_subtheme.theme b/core/modules/system/tests/themes/test_subtheme/test_subtheme.theme new file mode 100644 index 000000000000..e651807ae9f4 --- /dev/null +++ b/core/modules/system/tests/themes/test_subtheme/test_subtheme.theme @@ -0,0 +1,24 @@ +<?php + +/** + * @file + * Add hooks for tests to use. + */ + +use Drupal\views\ViewExecutable; + +/** + * Implements hook_views_pre_render(). + */ +function test_subtheme_views_pre_render(ViewExecutable $view) { + // We append the function name to the title for test to check for. + $view->setTitle($view->getTitle() . ":" . __FUNCTION__); +} + +/** + * Implements hook_views_post_render(). + */ +function test_subtheme_views_post_render(ViewExecutable $view) { + // We append the function name to the title for test to check for. + $view->setTitle($view->getTitle() . ":" . __FUNCTION__); +} diff --git a/core/modules/views/lib/Drupal/views/Tests/ViewsThemeIntegrationTest.php b/core/modules/views/lib/Drupal/views/Tests/ViewsThemeIntegrationTest.php new file mode 100644 index 000000000000..9f2ed2e8f540 --- /dev/null +++ b/core/modules/views/lib/Drupal/views/Tests/ViewsThemeIntegrationTest.php @@ -0,0 +1,93 @@ +<?php + +/** + * @file + * Contains \Drupal\views\Tests\ViewsThemeIntegrationTest. + */ + +namespace Drupal\views\Tests; + +/** + * As views uses a lot of theme related functionality we need to test these too. + * + * We test against test_basetheme and test_subtheme provided by theme_test + */ +class ViewsThemeIntegrationTest extends ViewTestBase { + + /** + * Views used by this test. + * + * @var array + */ + public static $testViews = array('test_page_display'); + + + /** + * Used by WebTestBase::setup() + * + * We need theme_test for testing against test_basetheme and test_subtheme. + * + * @var array + * + * @see \Drupal\simpletest\WebTestBase::setup() + */ + public static $modules = array('views', 'theme_test'); + + /** + * {@inheritdoc} + */ + public static function getInfo() { + return array( + 'name' => 'Views theme integration test', + 'description' => 'Tests the Views theme integration.', + 'group' => 'Views', + ); + } + + /** + * {@inheritdoc} + */ + protected function setUp() { + parent::setUp(); + + $this->enableViewsTestModule(); + } + + /** + * Tests for exceptions and successful execution of hook_views_pre_render() + * and hook_views_post_render() in theme and subtheme. + */ + public function testThemedViewPage() { + + \Drupal::service('theme_handler')->enable(array('test_basetheme', 'test_subtheme')); + + // Make base theme default then test for hook invocations. + \Drupal::config('system.theme') + ->set('default', 'test_basetheme') + ->save(); + $this->assertEqual(\Drupal::config('system.theme')->get('default'), 'test_basetheme'); + + // Make sure a views rendered page is touched. + $this->drupalGet('test_page_display_200'); + + $this->assertRaw("test_basetheme_views_pre_render", "Views title changed by test_basetheme.test_basetheme_views_pre_render"); + $this->assertRaw("test_basetheme_views_post_render", "Views title changed by test_basetheme.test_basetheme_views_post_render"); + + // Make sub theme default to test for hook invocation + // from both sub and base theme. + \Drupal::config('system.theme') + ->set('default', 'test_subtheme') + ->save(); + $this->assertEqual(\Drupal::config('system.theme')->get('default'), 'test_subtheme'); + + // Make sure a views rendered page is touched. + $this->drupalGet('test_page_display_200'); + + $this->assertRaw("test_subtheme_views_pre_render", "Views title changed by test_usetheme.test_subtheme_views_pre_render"); + $this->assertRaw("test_subtheme_views_post_render", "Views title changed by test_usetheme.test_subtheme_views_post_render"); + + $this->assertRaw("test_basetheme_views_pre_render", "Views title changed by test_basetheme.test_basetheme_views_pre_render"); + $this->assertRaw("test_basetheme_views_post_render", "Views title changed by test_basetheme.test_basetheme_views_post_render"); + } + +} diff --git a/core/modules/views/lib/Drupal/views/ViewExecutable.php b/core/modules/views/lib/Drupal/views/ViewExecutable.php index 88ebefc54932..9d9c857ed325 100644 --- a/core/modules/views/lib/Drupal/views/ViewExecutable.php +++ b/core/modules/views/lib/Drupal/views/ViewExecutable.php @@ -1360,7 +1360,7 @@ public function render($display_id = NULL) { // Let the themes play too, because pre render is a very themey thing. if (isset($GLOBALS['base_theme_info']) && isset($GLOBALS['theme'])) { foreach ($GLOBALS['base_theme_info'] as $base) { - $module_handler->invoke($base, 'views_pre_render', array($this)); + $module_handler->invoke($base->name, 'views_pre_render', array($this)); } $module_handler->invoke($GLOBALS['theme'], 'views_pre_render', array($this)); @@ -1384,7 +1384,7 @@ public function render($display_id = NULL) { // Let the themes play too, because post render is a very themey thing. if (isset($GLOBALS['base_theme_info']) && isset($GLOBALS['theme'])) { foreach ($GLOBALS['base_theme_info'] as $base) { - $module_handler->invoke($base, 'views_post_render', array($this)); + $module_handler->invoke($base->name, 'views_post_render', array($this)); } $module_handler->invoke($GLOBALS['theme'], 'views_post_render', array($this)); -- GitLab