Issue #1956912 by dawehner, damiankloip, tim.plunkett: Fixed Title area handler sets the title even when it should not (results in 'Welcome to Drupal' never going away).

8.0.x
webchick 2013-04-05 10:23:10 -07:00
parent c1e57167ad
commit 9685483cd9
6 changed files with 149 additions and 6 deletions

View File

@ -26,6 +26,13 @@ use Drupal\views\Plugin\views\HandlerBase;
*/
abstract class AreaPluginBase extends HandlerBase {
/**
* The type of this area handler, i.e. 'header', 'footer', or 'empty'.
*
* @var string
*/
public $areaType;
/**
* Overrides Drupal\views\Plugin\views\HandlerBase::init().
*
@ -35,7 +42,7 @@ abstract class AreaPluginBase extends HandlerBase {
public function init(ViewExecutable $view, DisplayPluginBase $display, array &$options = NULL) {
parent::init($view, $display, $options);
if (isset($this->handler_type) && ($this->handler_type == 'empty')) {
if ($this->areaType == 'empty') {
$this->options['empty'] = TRUE;
}
}

View File

@ -50,12 +50,13 @@ class Title extends AreaPluginBase {
* Overrides Drupal\views\Plugin\views\AreaPluginBase::preRender().
*/
public function preRender(array $results) {
parent::preRender($results);
// If a title is provided, process it.
if (!empty($this->options['title'])) {
$value = $this->globalTokenReplace($this->options['title']);
$this->view->setTitle($this->sanitizeValue($value, 'xss_admin'), PASS_THROUGH);
}
return '';
}
/**

View File

@ -7,6 +7,7 @@
namespace Drupal\views\Plugin\views\display;
use Drupal\views\Plugin\views\area\AreaPluginBase;
use Drupal\views\ViewExecutable;
use \Drupal\views\Plugin\views\PluginBase;
use Drupal\views\Views;
@ -878,8 +879,8 @@ abstract class DisplayPluginBase extends PluginBase {
$handler = views_get_handler($info['table'], $info['field'], $handler_type, $override);
if ($handler) {
// Special override for area types so they know where they come from.
if ($handler_type == 'area') {
$handler->handler_type = $type;
if ($handler instanceof AreaPluginBase) {
$handler->areaType = $type;
}
$handler->init($this->view, $this, $info);

View File

@ -0,0 +1,67 @@
<?php
/**
* @file
* Contains \Drupal\views\Tests\Handler\AreaTitleTest.
*/
namespace Drupal\views\Tests\Handler;
use Drupal\views\Tests\ViewUnitTestBase;
/**
* Tests the title area handler.
*
* @see Drupal\views\Plugin\views\area\Title
*/
class AreaTitleTest extends ViewUnitTestBase {
/**
* Views used by this test.
*
* @var array
*/
public static $testViews = array('test_area_title');
public static function getInfo() {
return array(
'name' => 'Area: Title',
'description' => 'Tests the title area handler.',
'group' => 'Views Handlers',
);
}
/**
* Tests the title area handler.
*/
public function testTitleText() {
$view = views_get_view('test_area_title');
$view->setDisplay('default');
$this->executeView($view);
$view->render();
$this->assertFalse($view->getTitle(), 'The title area does not override the title if the view is not empty.');
$view->destroy();
$view->setDisplay('default');
$this->executeView($view);
$view->result = array();
$view->render();
$this->assertEqual($view->getTitle(), 'test_title_empty', 'The title area should override the title if the result is empty.');
$view->destroy();
$view->setDisplay('page_1');
$this->executeView($view);
$view->render();
$this->assertEqual($view->getTitle(), 'test_title_header', 'The title area on the header should override the title if the result is not empty.');
$view->destroy();
$view->setDisplay('page_1');
$this->executeView($view);
$view->result = array();
$view->render();
$this->assertEqual($view->getTitle(), 'test_title_header', 'The title area on the header should override the title if the result is empty.');
$view->destroy();
}
}

View File

@ -1287,7 +1287,12 @@ class ViewExecutable {
$this->style_plugin->pre_render($this->result);
// Let each area handler have access to the result set.
foreach (array('header', 'footer', 'empty') as $area) {
$areas = array('header', 'footer');
// Only call preRender() on the empty handlers if the result is empty.
if (empty($this->result)) {
$areas[] = 'empty';
}
foreach ($areas as $area) {
foreach ($this->{$area} as $handler) {
$handler->preRender($this->result);
}

View File

@ -0,0 +1,62 @@
base_table: views_test_data
core: '8'
description: ''
status: '1'
display:
default:
display_options:
defaults:
fields: '0'
pager: '0'
pager_options: '0'
sorts: '0'
fields:
id:
field: id
id: id
relationship: none
table: views_test_data
plugin_id: numeric
pager:
options:
offset: '0'
type: none
pager_options: { }
sorts:
id:
field: id
id: id
order: ASC
relationship: none
table: views_test_data
plugin_id: numeric
empty:
title:
field: title
id: title
table: views
plugin_id: title
title: test_title_empty
display_plugin: default
display_title: Master
id: default
position: '0'
page_1:
display_options:
defaults:
empty: '0'
header: '0'
header:
title:
field: title
id: title
table: views
plugin_id: title
title: test_title_header
display_plugin: page
display_title: Page 1
id: page_1
position: '1'
label: ''
id: test_area_title
tag: ''