diff --git a/core/modules/views/lib/Drupal/views/Plugin/views/field/FieldPluginBase.php b/core/modules/views/lib/Drupal/views/Plugin/views/field/FieldPluginBase.php index e14b009..7b3f7a0 100644 --- a/core/modules/views/lib/Drupal/views/Plugin/views/field/FieldPluginBase.php +++ b/core/modules/views/lib/Drupal/views/Plugin/views/field/FieldPluginBase.php @@ -270,7 +270,7 @@ public function elementWrapperType($none_supported = FALSE, $default_empty = FAL * elements available, though this seems like it would be an incredibly * rare occurence. */ - public function getElements() { + public static function getHTMLElementTypes() { static $elements = NULL; if (!isset($elements)) { // @todo Add possible html5 elements. @@ -547,7 +547,7 @@ public function buildOptionsForm(&$form, &$form_state) { ); $form['element_type'] = array( '#title' => t('HTML element'), - '#options' => $this->getElements(), + '#options' => static::getHTMLElementTypes(), '#type' => 'select', '#default_value' => $this->options['element_type'], '#description' => t('Choose the HTML element to wrap around this field, e.g. H1, H2, etc.'), @@ -592,7 +592,7 @@ public function buildOptionsForm(&$form, &$form_state) { ); $form['element_label_type'] = array( '#title' => t('Label HTML element'), - '#options' => $this->getElements(FALSE), + '#options' => static::getHTMLElementTypes(FALSE), '#type' => 'select', '#default_value' => $this->options['element_label_type'], '#description' => t('Choose the HTML element to wrap around this label, e.g. H1, H2, etc.'), @@ -636,7 +636,7 @@ public function buildOptionsForm(&$form, &$form_state) { ); $form['element_wrapper_type'] = array( '#title' => t('Wrapper HTML element'), - '#options' => $this->getElements(FALSE), + '#options' => static::getHTMLElementTypes(FALSE), '#type' => 'select', '#default_value' => $this->options['element_wrapper_type'], '#description' => t('Choose the HTML element to wrap around this field and label, e.g. H1, H2, etc. This may not be used if the field and label are not rendered together, such as with a table.'), diff --git a/core/modules/views/lib/Drupal/views/Plugin/views/style/StylePluginBase.php b/core/modules/views/lib/Drupal/views/Plugin/views/style/StylePluginBase.php index a221f8f..8c8db4a 100644 --- a/core/modules/views/lib/Drupal/views/Plugin/views/style/StylePluginBase.php +++ b/core/modules/views/lib/Drupal/views/Plugin/views/style/StylePluginBase.php @@ -9,6 +9,7 @@ use Drupal\views\Plugin\views\PluginBase; use Drupal\views\Plugin\views\display\DisplayPluginBase; +use Drupal\views\Plugin\views\field\FieldPluginBase; use Drupal\views\Plugin\views\wizard\WizardInterface; use Drupal\Component\Annotation\Plugin; use Drupal\Core\Annotation\Translation; @@ -231,6 +232,7 @@ public function evenEmpty() { protected function defineOptions() { $options = parent::defineOptions(); $options['grouping'] = array('default' => array()); + $options['title_element_type'] = array('default' => 'h3'); if ($this->usesRowClass()) { $options['row_class'] = array('default' => ''); $options['default_row_class'] = array('default' => TRUE, 'bool' => TRUE); @@ -299,6 +301,20 @@ public function buildOptionsForm(&$form, &$form_state) { ); } } + + $form['title_element_type'] = array( + '#title' => t('Title HTML Element'), + '#type' => 'select', + '#default_value' => $this->options['title_element_type'], + '#options' => FieldPluginBase::getHTMLElementTypes(), + '#description' => t('Choose the HTML element to wrap around the grouping title of a view.'), + // Hide the element unless at least one grouping field is configured. + '#states' => array( + 'invisible' => array( + ':input[name="style_options[grouping][0][field]"]' => array('value' => ''), + ), + ), + ); } if ($this->usesRowClass()) { @@ -469,6 +485,7 @@ public function renderGroupingSets($sets, $level = 0) { '#grouping_level' => $level, '#rows' => $set['rows'], '#title' => $set['group'], + '#title_element_type' => $this->options['title_element_type'], ); } // Render as a record set. @@ -485,6 +502,7 @@ public function renderGroupingSets($sets, $level = 0) { $single_output = $this->renderRowGroup($set['rows']); $single_output['#grouping_level'] = $level; $single_output['#title'] = $set['group']; + $single_output['#title_element_type'] = $this->options['title_element_type']; $output[] = $single_output; } } diff --git a/core/modules/views/lib/Drupal/views/Plugin/views/style/Table.php b/core/modules/views/lib/Drupal/views/Plugin/views/style/Table.php index 178af9f..f0f908e 100644 --- a/core/modules/views/lib/Drupal/views/Plugin/views/style/Table.php +++ b/core/modules/views/lib/Drupal/views/Plugin/views/style/Table.php @@ -99,6 +99,9 @@ protected function defineOptions() { $options['description'] = array('default' => '', 'translatable' => TRUE); $options['empty_table'] = array('default' => FALSE, 'bool' => TRUE); + // Override to set the title to caption by default. + $options['title_element_type']['default'] = 'caption'; + return $options; } diff --git a/core/modules/views/lib/Drupal/views/Tests/Handler/FieldWebTest.php b/core/modules/views/lib/Drupal/views/Tests/Handler/FieldWebTest.php index 6d73636..fe27e2f 100644 --- a/core/modules/views/lib/Drupal/views/Tests/Handler/FieldWebTest.php +++ b/core/modules/views/lib/Drupal/views/Tests/Handler/FieldWebTest.php @@ -405,7 +405,7 @@ public function testFieldClasses() { } // Tests the available html elements. - $element_types = $id_field->getElements(); + $element_types = $id_field->getHTMLElementTypes(); $expected_elements = array( '', 0, diff --git a/core/modules/views/lib/Drupal/views/Tests/Plugin/StyleTest.php b/core/modules/views/lib/Drupal/views/Tests/Plugin/StyleTest.php index 25a10f3..206bf5a 100644 --- a/core/modules/views/lib/Drupal/views/Tests/Plugin/StyleTest.php +++ b/core/modules/views/lib/Drupal/views/Tests/Plugin/StyleTest.php @@ -249,6 +249,33 @@ function testCustomRowClasses() { } /** + * Tests the custom element type for group titles. + */ + public function testCustomElementTitle() { + $style_plugins = array('default', 'grid', 'table', 'html_list'); + $view = views_get_view('test_view'); + + foreach ($style_plugins as $plugin) { + $view->initDisplay(); + + $style = $view->display_handler->getOption('style'); + $style['type'] = 'table'; + $style['options']['title_element_type'] = 'h6'; + $style['options']['grouping'] = 'name'; + $view->display_handler->overrideOption('style', $style); + + $view->initStyle(); + + $output = $view->preview(); + $this->drupalSetContent(drupal_render($output)); + $elements = $this->xpath('//h6'); + $this->assertEqual(count($elements), 5, format_string('Custom element tag found for @plugin plugin', array('@plugin' => $plugin))); + + $view->destroy(); + } + } + + /** * Stores a view output in the elements. */ protected function storeViewPreview($output) { diff --git a/core/modules/views/templates/views-view-grid.html.twig b/core/modules/views/templates/views-view-grid.html.twig index 8b63792..4cb77a8 100644 --- a/core/modules/views/templates/views-view-grid.html.twig +++ b/core/modules/views/templates/views-view-grid.html.twig @@ -6,6 +6,7 @@ * Available variables: * - attributes: HTML attributes for the table element. * - title: The title of this group of rows. + * - title_element_type: The HTML tag element for the title. * - rows: A list of rows. Each row contains a list of columns. * - row_classes: HTML classes for each row including the row number and first * or last. @@ -18,7 +19,7 @@ */ #} {% if title %} -