diff --git a/core/modules/block/lib/Drupal/block/Annotation/Block.php b/core/modules/block/lib/Drupal/block/Annotation/Block.php index 62541ab..64987e6 100644 --- a/core/modules/block/lib/Drupal/block/Annotation/Block.php +++ b/core/modules/block/lib/Drupal/block/Annotation/Block.php @@ -30,6 +30,6 @@ class Block extends Plugin { * * @ingroup plugin_translatable */ - public $admin_label; + public $admin_label = ''; } diff --git a/core/modules/block/lib/Drupal/block/Entity/Block.php b/core/modules/block/lib/Drupal/block/Entity/Block.php index 44fa169..02b1d76 100644 --- a/core/modules/block/lib/Drupal/block/Entity/Block.php +++ b/core/modules/block/lib/Drupal/block/Entity/Block.php @@ -121,7 +121,13 @@ public function getPlugin() { */ public function label($langcode = NULL) { $settings = $this->get('settings'); - return $settings['label']; + if ($settings['label']) { + return $settings['label']; + } + else { + $definition = $this->getPlugin()->getPluginDefinition(); + return $definition['admin_label']; + } } /** diff --git a/core/modules/block/lib/Drupal/block/Tests/Views/DisplayBlockTest.php b/core/modules/block/lib/Drupal/block/Tests/Views/DisplayBlockTest.php index 5d90a05..fd9d254 100644 --- a/core/modules/block/lib/Drupal/block/Tests/Views/DisplayBlockTest.php +++ b/core/modules/block/lib/Drupal/block/Tests/Views/DisplayBlockTest.php @@ -221,6 +221,37 @@ public function testViewsBlockForm() { $config = $block->getPlugin()->getConfiguration(); $this->assertEqual(5, $config['items_per_page'], "'Items per page' is properly saved."); + + // Tests the override of the label capability. + $edit = array(); + $edit['settings[views_label_checkbox]'] = 1; + $edit['settings[views_label]'] = 'Custom title'; + $this->drupalPostForm('admin/structure/block/add/views_block:test_view_block-block_1/' . $default_theme, $edit, t('Save block')); + + $block = $storage->load('views_block__test_view_block_block_1_5'); + $config = $block->getPlugin()->getConfiguration(); + $this->assertEqual('Custom title', $config['views_label'], "'Label' is properly saved."); + } + + /** + * Tests the actual rendering of the views block. + */ + public function testBlockRendering() { + // Create a block and set a custom title. + $block = $this->drupalPlaceBlock('views_block:test_view_block-block_1', array('title' => 'test_view_block-block_1:1', 'views_label' => 'Custom title')); + $this->drupalGet(''); + + $result = $this->xpath('//div[contains(@class, "region-sidebar-first")]/div[contains(@class, "block-views")]/h2'); + $this->assertEqual((string) $result[0], 'Custom title'); + + // Don't override the title anymore. + $plugin = $block->getPlugin(); + $plugin->setConfigurationValue('views_label', ''); + $block->save(); + + $this->drupalGet(''); + $result = $this->xpath('//div[contains(@class, "region-sidebar-first")]/div[contains(@class, "block-views")]/h2'); + $this->assertEqual((string) $result[0], 'test_view_block'); } /** diff --git a/core/modules/views/lib/Drupal/views/Plugin/Block/ViewsBlock.php b/core/modules/views/lib/Drupal/views/Plugin/Block/ViewsBlock.php index 3f3fe30..dac57a0 100644 --- a/core/modules/views/lib/Drupal/views/Plugin/Block/ViewsBlock.php +++ b/core/modules/views/lib/Drupal/views/Plugin/Block/ViewsBlock.php @@ -32,7 +32,13 @@ public function build() { if ($output = $this->view->executeDisplay($this->displayID)) { // Set the label to the title configured in the view. - $this->configuration['label'] = Xss::filterAdmin($this->view->getTitle()); + if (empty($this->configuration['views_label'])) { + $this->configuration['label'] = Xss::filterAdmin($this->view->getTitle()); + } + else { + $this->configuration['label'] = $this->configuration['views_label']; + } + $this->configuration['label_display'] = TRUE; // Before returning the block output, convert it to a renderable array // with contextual links. $this->addContextualLinks($output); @@ -46,10 +52,10 @@ public function build() { * {@inheritdoc} */ public function defaultConfiguration() { - $settings = array(); + $settings = parent::defaultConfiguration(); if ($this->displaySet) { - return $this->view->display_handler->blockSettings($settings); + $settings += $this->view->display_handler->blockSettings($settings); } return $settings; @@ -79,6 +85,7 @@ public function blockValidate($form, &$form_state) { * {@inheritdoc} */ public function blockSubmit($form, &$form_state) { + parent::blockSubmit($form, $form_state); if ($this->displaySet) { $this->view->display_handler->blockSubmit($this, $form, $form_state); } diff --git a/core/modules/views/lib/Drupal/views/Plugin/Block/ViewsBlockBase.php b/core/modules/views/lib/Drupal/views/Plugin/Block/ViewsBlockBase.php index e20f146..5f32f15 100644 --- a/core/modules/views/lib/Drupal/views/Plugin/Block/ViewsBlockBase.php +++ b/core/modules/views/lib/Drupal/views/Plugin/Block/ViewsBlockBase.php @@ -41,7 +41,14 @@ protected $displaySet; /** - * Constructs a Drupal\Component\Plugin\PluginBase object. + * The current user. + * + * @var \Drupal\Core\Session\AccountInterface + */ + protected $user; + + /** + * Constructs a \Drupal\views\Plugin\Block\ViewsBlockBase object. * * @param array $configuration * A configuration array containing information about the plugin instance. @@ -53,8 +60,10 @@ * The view executable factory. * @param \Drupal\Core\Entity\EntityStorageControllerInterface $storage_controller * The views storage controller. + * @param \Drupal\Core\Session\AccountInterface $user + * The current user. */ - public function __construct(array $configuration, $plugin_id, array $plugin_definition, ViewExecutableFactory $executable_factory, EntityStorageControllerInterface $storage_controller) { + public function __construct(array $configuration, $plugin_id, array $plugin_definition, ViewExecutableFactory $executable_factory, EntityStorageControllerInterface $storage_controller, AccountInterface $user) { $this->pluginId = $plugin_id; list($plugin, $delta) = explode(':', $this->getPluginId()); list($name, $this->displayID) = explode('-', $delta, 2); @@ -62,6 +71,7 @@ public function __construct(array $configuration, $plugin_id, array $plugin_defi $view = $storage_controller->load($name); $this->view = $executable_factory->get($view); $this->displaySet = $this->view->setDisplay($this->displayID); + $this->user = $user; parent::__construct($configuration, $plugin_id, $plugin_definition); } @@ -73,7 +83,8 @@ public static function create(ContainerInterface $container, array $configuratio return new static( $configuration, $plugin_id, $plugin_definition, $container->get('views.executable'), - $container->get('entity.manager')->getStorageController('view') + $container->get('entity.manager')->getStorageController('view'), + $container->get('current_user') ); } @@ -87,6 +98,16 @@ public function access(AccountInterface $account) { /** * {@inheritdoc} */ + public function defaultConfiguration() { + $settings = array(); + $settings['views_label'] = ''; + + return $settings; + } + + /** + * {@inheritdoc} + */ public function buildConfigurationForm(array $form, array &$form_state) { $form = parent::buildConfigurationForm($form, $form_state); @@ -94,10 +115,67 @@ public function buildConfigurationForm(array $form, array &$form_state) { $form['label']['#default_value'] = ''; $form['label']['#access'] = FALSE; + // Unset the machine_name provided by BlockFormController. + unset($form['id']['#machine_name']['source']); + // Prevent users from changing the auto-generated block machine_name. + $form['id']['#access'] = FALSE; + $form['#pre_render'][] = '\Drupal\views\Plugin\views\PluginBase::preRenderAddFieldsetMarkup'; + + // Allow to override the label on the actual page. + $form['views_label_checkbox'] = array( + '#type' => 'checkbox', + '#title' => $this->t('Override title'), + '#default_value' => !empty($this->configuration['views_label']), + ); + + $form['views_label_fieldset'] = array( + '#type' => 'fieldset', + '#states' => array( + 'visible' => array( + array( + ':input[name="settings[views_label_checkbox]"]' => array('checked' => TRUE), + ), + ), + ), + ); + + $form['views_label'] = array( + '#title' => $this->t('Title'), + '#type' => 'textfield', + '#default_value' => $this->configuration['views_label'] ?: $this->view->getTitle(), + '#states' => array( + 'visible' => array( + array( + ':input[name="settings[views_label_checkbox]"]' => array('checked' => TRUE), + ), + ), + ), + '#fieldset' => 'views_label_fieldset', + ); + + if ($this->view->storage->access('edit') && \Drupal::moduleHandler()->moduleExists('views_ui')) { + $form['views_label']['#description'] = $this->t('Changing the title here, overrides the title created dynamically by view.', array('@url' => \Drupal::url('views_ui.edit', array('view' => $this->view->storage->id())))); + } + else { + $form['views_label']['#description'] = $this->t('Changing the title here, overrides the title created dynamically by the view."'); + } + return $form; } /** + * {@inheritdoc} + */ + public function blockSubmit($form, &$form_state) { + if (!empty($form_state['values']['views_label_checkbox'])) { + $this->configuration['views_label'] = $form_state['values']['views_label']; + } + else { + $this->configuration['views_label'] = ''; + } + } + + /** * Converts Views block content to a renderable array with contextual links. * * @param string|array $output