diff --git a/core/modules/block/lib/Drupal/block/Entity/Block.php b/core/modules/block/lib/Drupal/block/Entity/Block.php index 44fa169..a8ea16e 100644 --- a/core/modules/block/lib/Drupal/block/Entity/Block.php +++ b/core/modules/block/lib/Drupal/block/Entity/Block.php @@ -121,7 +121,11 @@ public function getPlugin() { */ public function label($langcode = NULL) { $settings = $this->get('settings'); - return $settings['label']; + $definition = $this->getPlugin()->getPluginDefinition(); + $definition += array( + 'admin_label' => '', + ); + return $settings['label'] ?: $definition['admin_label']; } /** 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..9628826 100644 --- a/core/modules/views/lib/Drupal/views/Plugin/Block/ViewsBlock.php +++ b/core/modules/views/lib/Drupal/views/Plugin/Block/ViewsBlock.php @@ -46,7 +46,7 @@ public function build() { * {@inheritdoc} */ public function defaultConfiguration() { - $settings = array(); + $settings = parent::defaultConfiguration(); if ($this->displaySet) { return $this->view->display_handler->blockSettings($settings); 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..a04fd08 100644 --- a/core/modules/views/lib/Drupal/views/Plugin/Block/ViewsBlockBase.php +++ b/core/modules/views/lib/Drupal/views/Plugin/Block/ViewsBlockBase.php @@ -87,6 +87,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 +104,59 @@ public function buildConfigurationForm(array $form, array &$form_state) { $form['label']['#default_value'] = ''; $form['label']['#access'] = FALSE; + // 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_fieldset']['views_label_warning'] = array( + '#markup' => $this->t('
In most cases you better change the title directly on the view. Overriding the title here will remove dynamic title support from arguments for example.
'), + '#type' => 'item', + '#states' => array( + 'visible' => array(array( + ':input[name="settings[views_label_checkbox]"]' => array('checked' => TRUE), + ), + )), + ); + + $form['views_label_fieldset']['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), + ), + )), + ); + return $form; } /** + * {@inheritdoc}{ + */ + public function blockSubmit($form, &$form_state) { + if (!empty($form_state['values']['views_label_checkbox'])) { + $this->setConfigurationValue('views_label', $form_state['values']['label']); + } + else { + $this->setConfigurationValue('views_label', ''); + } + } + + /** * Converts Views block content to a renderable array with contextual links. * * @param string|array $output diff --git a/core/modules/views/views.module b/core/modules/views/views.module index 8445804..f71c966 100644 --- a/core/modules/views/views.module +++ b/core/modules/views/views.module @@ -1355,3 +1355,23 @@ function views_element_validate_tags($element, &$form_state) { } } } + + +/** + * Implements hook_form_FORM_ID_alter for block_form(). + * + * Views overrides block configuration form elements during + * \Drupal\views\Plugin\Block\ViewsBlock::form() but machine_name assignment is + * added later by \Drupal\block\BlockFormController::form() so we provide an + * override for the block machine_name here. + */ +function views_form_block_form_alter(&$form, &$form_state) { + // Ensure the block-form being altered is a Views block configuration form. + if ($form['settings']['module']['#value'] == 'views') { + // Unset the machine_name provided by BlockFormController. + unset($form['id']['#machine_name']['source']); + // Load the Views plugin object using form_state array and create a + // Prevent users from changing the auto-generated block machine_name. + $form['id']['#access'] = FALSE; + } +}