Loading config/schema/fences.schema.yml +6 −0 Original line number Diff line number Diff line Loading @@ -8,6 +8,12 @@ field.formatter.third_party.fences: fences_field_classes: type: string label: 'The field CSS classes' fences_field_items_wrapper_tag: type: string label: 'The field items wrapper HTML tag' fences_field_items_wrapper_classes: type: string label: 'The field items wrapper CSS classes' fences_field_item_tag: type: string label: 'The field item HTML tag' Loading fences.install +30 −0 Original line number Diff line number Diff line <?php use Drupal\fences\TagManagerInterface; /** * @file * Installation hooks for Fences module. Loading @@ -11,3 +13,31 @@ function fences_update_8001() { return t('New Fences permission "Edit fences formatter settings" was added, adjust your permissions accordingly.'); } /** * Add new wrapper_tag configuration to all entity_view_displays using fences. * Check custom field.html.twig theme overwrites for differences. */ function fences_update_8301(&$sandbox) { // See https://www.drupal.org/docs/drupal-apis/update-api/updating-entities-and-fields-in-drupal-8#s-updating-entity-view-display-configs if ($view_displays = \Drupal::entityTypeManager()->getStorage('entity_view_display')->loadMultiple(NULL)) { // Loop through all entity view displays: foreach ($view_displays as $view_display) { $components = $view_display->getComponents(); foreach ($components as $componentName => $component) { if (!empty($component['third_party_settings']['fences'])) { // Explicitely set fences_field_items_wrapper_tag to 'none' if not existing yet. if (!isset($component['third_party_settings']['fences']['fences_field_items_wrapper_tag'])) { $component['third_party_settings']['fences']['fences_field_items_wrapper_tag'] = TagManagerInterface::NO_MARKUP_VALUE; } // Explicitely set fences_field_items_wrapper_classes to 'none' if not existing yet. if (!isset($component['third_party_settings']['fences']['fences_field_items_wrapper_classes'])) { $component['third_party_settings']['fences']['fences_field_items_wrapper_classes'] = TagManagerInterface::NO_MARKUP_VALUE; } // Save changes: $view_display->setComponent($componentName, $component)->save(); } } } } } fences.module +28 −1 Original line number Diff line number Diff line Loading @@ -9,6 +9,7 @@ use Drupal\Core\Field\FieldDefinitionInterface; use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Field\FormatterInterface; use Drupal\fences\TagManagerInterface; use Drupal\Core\Template\Attribute; /** * Implements hook_theme_registry_alter(). Loading Loading @@ -64,6 +65,18 @@ function fences_field_formatter_third_party_settings_form(FormatterInterface $pl '#default_value' => $plugin->getThirdPartySetting('fences', 'fences_field_classes'), '#states' => $invisible_on_none('fences_field_tag'), ]; $settings['fences']['fences_field_items_wrapper_tag'] = [ '#title' => t('Field Items Wrapper Tag'), '#type' => 'select', '#options' => $tag_options, '#default_value' => $plugin->getThirdPartySetting('fences', 'fences_field_items_wrapper_tag', TagManagerInterface::NO_MARKUP_VALUE), ]; $settings['fences']['fences_field_items_wrapper_classes'] = [ '#title' => t('Field Items Wrapper Classes'), '#type' => 'textfield', '#default_value' => $plugin->getThirdPartySetting('fences', 'fences_field_items_wrapper_classes'), '#states' => $invisible_on_none('fences_field_items_wrapper_tag'), ]; $settings['fences']['fences_field_item_tag'] = [ '#title' => t('Field Item Tag'), '#type' => 'select', Loading Loading @@ -98,6 +111,7 @@ function fences_preprocess_field(&$vars) { // Default to showing all markup. $vars['display_label_tag'] = TRUE; $vars['display_field_tag'] = TRUE; $vars['display_items_wrapper_tag'] = FALSE; $vars['display_item_tag'] = TRUE; if (isset($vars['element']['#third_party_settings']['fences'])) { Loading @@ -105,12 +119,16 @@ function fences_preprocess_field(&$vars) { $vars['display_label_tag'] = $fences_config['fences_label_tag'] !== TagManagerInterface::NO_MARKUP_VALUE; $vars['display_field_tag'] = $fences_config['fences_field_tag'] !== TagManagerInterface::NO_MARKUP_VALUE; $vars['display_items_wrapper_tag'] = !empty($fences_config['fences_field_items_wrapper_tag']) && $fences_config['fences_field_items_wrapper_tag'] !== TagManagerInterface::NO_MARKUP_VALUE; $vars['display_item_tag'] = $fences_config['fences_field_item_tag'] !== TagManagerInterface::NO_MARKUP_VALUE; $vars['label_tag'] = $fences_config['fences_label_tag']; $vars['field_tag'] = $fences_config['fences_field_tag']; $vars['field_items_wrapper_tag'] = !empty($fences_config['fences_field_items_wrapper_tag']) ? $fences_config['fences_field_items_wrapper_tag'] : NULL; $vars['field_item_tag'] = $fences_config['fences_field_item_tag']; // Prevent adding empty classes: if (!empty($fences_config['fences_field_classes'])) { $fences_field_classes = explode(' ', $fences_config['fences_field_classes']); foreach ($fences_field_classes as $class) { Loading @@ -126,7 +144,12 @@ function fences_preprocess_field(&$vars) { $vars['title_attributes']['class'][] = $class; } } if (!empty($fences_config['fences_field_classes'])) { $vars['attributes']['class'][] = $fences_config['fences_field_classes']; } if (!empty($fences_config['fences_label_classes'])) { $vars['title_attributes']['class'][] = $fences_config['fences_label_classes']; } if (!empty($fences_config['fences_field_item_classes'])) { $fences_field_item_classes = explode(' ', $fences_config['fences_field_item_classes']); foreach ($vars['items'] as $field_item) { Loading @@ -136,5 +159,9 @@ function fences_preprocess_field(&$vars) { } } } $vars['field_items_wrapper_attributes'] = new Attribute(); if (!empty($fences_config['fences_field_items_wrapper_classes'])) { $vars['field_items_wrapper_attributes']->addClass($fences_config['fences_field_items_wrapper_classes']); } } } field.html.twig +37 −14 Original line number Diff line number Diff line Loading @@ -10,6 +10,7 @@ 'field--name-' ~ field_name|clean_class, 'field--type-' ~ field_type|clean_class, 'field--label-' ~ label_display, not display_items_wrapper_tag ? 'field__items' ] %} {% Loading @@ -18,21 +19,43 @@ label_display == 'visually_hidden' ? 'visually-hidden', ] %} {%- if display_field_tag -%} <{{ field_tag|default('div') }}{{ attributes.addClass(classes, 'field__items') }}> {% endif -%} {%~ if not label_hidden and display_label_tag %} <{{ label_tag|default('div') }}{{ title_attributes.addClass(title_classes) }}>{{ label }}</{{ label_tag|default('div') }}> {%~ endif -%} {% block field %} {%- if display_field_tag ~%} <{{ field_tag|default('div') }}{{ attributes.addClass(classes) }}> {%- endif -%} {%- if not label_hidden -%} {%- block field_label ~%} {% if display_label_tag -%}<{{ label_tag|default('div') }}{{ title_attributes.addClass(title_classes) }}>{%- endif -%} {%- block field_label_value -%} {{ label }} {%- endblock field_label_value -%} {%- if display_label_tag -%} </{{ label_tag|default('div') }}> {%- endif -%} {%- endblock field_label -%} {%- endif -%} {%- block field_items -%} {% if display_items_wrapper_tag ~%} <{{ field_items_wrapper_tag|default('div') }}{{ field_items_wrapper_attributes.addClass('field__items') }}> {%- endif -%} {% for item in items %} {%- if display_item_tag %} {%- block field_item -%} {%- if display_item_tag ~%} <{{ field_item_tag|default('div') }}{{ item.attributes.addClass('field__item') }}> {%- endif -%} {%- block field_value -%} {{ item.content }} {%- endblock field_value -%} {%- if display_item_tag -%} </{{ field_item_tag|default('div') }}> {%~ endif -%} {%- endif -%} {%- endblock field_item -%} {% endfor %} {%- if display_field_tag -%} {%- if display_items_wrapper_tag ~%} </{{ field_items_wrapper_tag|default('div') }}> {%- endif -%} {%- endblock field_items -%} {% if display_field_tag ~%} </{{ field_tag|default('div') }}> {%- endif -%} {% endblock field %} tests/src/Kernel/FieldOutputTest.php +18 −0 Original line number Diff line number Diff line Loading @@ -72,6 +72,8 @@ class FieldOutputTest extends KernelTestBase { [ 'fences_field_tag' => 'none', 'fences_field_classes' => '', // 'fences_field_items_wrapper_tag' => 'none', // 'fences_field_items_wrapper_classes' => '', 'fences_field_item_tag' => 'none', 'fences_field_item_classes' => '', 'fences_label_tag' => 'none', Loading @@ -84,6 +86,8 @@ class FieldOutputTest extends KernelTestBase { [ 'fences_field_tag' => 'article', 'fences_field_classes' => '', // 'fences_field_items_wrapper_tag' => 'none', // 'fences_field_items_wrapper_classes' => '', 'fences_field_item_tag' => 'none', 'fences_field_item_classes' => '', 'fences_label_tag' => 'none', Loading @@ -96,6 +100,8 @@ class FieldOutputTest extends KernelTestBase { [ 'fences_field_tag' => 'none', 'fences_field_classes' => '', // 'fences_field_items_wrapper_tag' => 'none', // 'fences_field_items_wrapper_classes' => '', 'fences_field_item_tag' => 'none', 'fences_field_item_classes' => '', 'fences_label_tag' => 'none', Loading @@ -108,6 +114,8 @@ class FieldOutputTest extends KernelTestBase { [ 'fences_field_tag' => 'article', 'fences_field_classes' => '', // 'fences_field_items_wrapper_tag' => 'none', // 'fences_field_items_wrapper_classes' => '', 'fences_field_item_tag' => 'none', 'fences_field_item_classes' => '', 'fences_label_tag' => 'none', Loading @@ -120,6 +128,8 @@ class FieldOutputTest extends KernelTestBase { [ 'fences_field_tag' => 'article', 'fences_field_classes' => '', // 'fences_field_items_wrapper_tag' => 'none', // 'fences_field_items_wrapper_classes' => '', 'fences_field_item_tag' => 'none', 'fences_field_item_classes' => '', 'fences_label_tag' => 'h3', Loading @@ -132,6 +142,8 @@ class FieldOutputTest extends KernelTestBase { [ 'fences_field_tag' => 'article', 'fences_field_classes' => '', // 'fences_field_items_wrapper_tag' => 'none', // 'fences_field_items_wrapper_classes' => '', 'fences_field_item_tag' => 'h2', 'fences_field_item_classes' => '', 'fences_label_tag' => '', Loading @@ -144,6 +156,8 @@ class FieldOutputTest extends KernelTestBase { [ 'fences_field_tag' => '', 'fences_field_classes' => '', // 'fences_field_items_wrapper_tag' => 'none', // 'fences_field_items_wrapper_classes' => '', 'fences_field_item_tag' => '', 'fences_field_item_classes' => '', 'fences_label_tag' => '', Loading @@ -156,6 +170,8 @@ class FieldOutputTest extends KernelTestBase { [ 'fences_field_tag' => '', 'fences_field_classes' => '', // 'fences_field_items_wrapper_tag' => 'none', // 'fences_field_items_wrapper_classes' => '', 'fences_field_item_tag' => '', 'fences_field_item_classes' => '', 'fences_label_tag' => '', Loading @@ -168,6 +184,8 @@ class FieldOutputTest extends KernelTestBase { [ 'fences_field_tag' => 'ul', 'fences_field_classes' => 'item-list', // 'fences_field_items_wrapper_tag' => 'none', // 'fences_field_items_wrapper_classes' => '', 'fences_field_item_tag' => 'li', 'fences_field_item_classes' => 'item-list__item', 'fences_label_tag' => 'li', Loading Loading
config/schema/fences.schema.yml +6 −0 Original line number Diff line number Diff line Loading @@ -8,6 +8,12 @@ field.formatter.third_party.fences: fences_field_classes: type: string label: 'The field CSS classes' fences_field_items_wrapper_tag: type: string label: 'The field items wrapper HTML tag' fences_field_items_wrapper_classes: type: string label: 'The field items wrapper CSS classes' fences_field_item_tag: type: string label: 'The field item HTML tag' Loading
fences.install +30 −0 Original line number Diff line number Diff line <?php use Drupal\fences\TagManagerInterface; /** * @file * Installation hooks for Fences module. Loading @@ -11,3 +13,31 @@ function fences_update_8001() { return t('New Fences permission "Edit fences formatter settings" was added, adjust your permissions accordingly.'); } /** * Add new wrapper_tag configuration to all entity_view_displays using fences. * Check custom field.html.twig theme overwrites for differences. */ function fences_update_8301(&$sandbox) { // See https://www.drupal.org/docs/drupal-apis/update-api/updating-entities-and-fields-in-drupal-8#s-updating-entity-view-display-configs if ($view_displays = \Drupal::entityTypeManager()->getStorage('entity_view_display')->loadMultiple(NULL)) { // Loop through all entity view displays: foreach ($view_displays as $view_display) { $components = $view_display->getComponents(); foreach ($components as $componentName => $component) { if (!empty($component['third_party_settings']['fences'])) { // Explicitely set fences_field_items_wrapper_tag to 'none' if not existing yet. if (!isset($component['third_party_settings']['fences']['fences_field_items_wrapper_tag'])) { $component['third_party_settings']['fences']['fences_field_items_wrapper_tag'] = TagManagerInterface::NO_MARKUP_VALUE; } // Explicitely set fences_field_items_wrapper_classes to 'none' if not existing yet. if (!isset($component['third_party_settings']['fences']['fences_field_items_wrapper_classes'])) { $component['third_party_settings']['fences']['fences_field_items_wrapper_classes'] = TagManagerInterface::NO_MARKUP_VALUE; } // Save changes: $view_display->setComponent($componentName, $component)->save(); } } } } }
fences.module +28 −1 Original line number Diff line number Diff line Loading @@ -9,6 +9,7 @@ use Drupal\Core\Field\FieldDefinitionInterface; use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Field\FormatterInterface; use Drupal\fences\TagManagerInterface; use Drupal\Core\Template\Attribute; /** * Implements hook_theme_registry_alter(). Loading Loading @@ -64,6 +65,18 @@ function fences_field_formatter_third_party_settings_form(FormatterInterface $pl '#default_value' => $plugin->getThirdPartySetting('fences', 'fences_field_classes'), '#states' => $invisible_on_none('fences_field_tag'), ]; $settings['fences']['fences_field_items_wrapper_tag'] = [ '#title' => t('Field Items Wrapper Tag'), '#type' => 'select', '#options' => $tag_options, '#default_value' => $plugin->getThirdPartySetting('fences', 'fences_field_items_wrapper_tag', TagManagerInterface::NO_MARKUP_VALUE), ]; $settings['fences']['fences_field_items_wrapper_classes'] = [ '#title' => t('Field Items Wrapper Classes'), '#type' => 'textfield', '#default_value' => $plugin->getThirdPartySetting('fences', 'fences_field_items_wrapper_classes'), '#states' => $invisible_on_none('fences_field_items_wrapper_tag'), ]; $settings['fences']['fences_field_item_tag'] = [ '#title' => t('Field Item Tag'), '#type' => 'select', Loading Loading @@ -98,6 +111,7 @@ function fences_preprocess_field(&$vars) { // Default to showing all markup. $vars['display_label_tag'] = TRUE; $vars['display_field_tag'] = TRUE; $vars['display_items_wrapper_tag'] = FALSE; $vars['display_item_tag'] = TRUE; if (isset($vars['element']['#third_party_settings']['fences'])) { Loading @@ -105,12 +119,16 @@ function fences_preprocess_field(&$vars) { $vars['display_label_tag'] = $fences_config['fences_label_tag'] !== TagManagerInterface::NO_MARKUP_VALUE; $vars['display_field_tag'] = $fences_config['fences_field_tag'] !== TagManagerInterface::NO_MARKUP_VALUE; $vars['display_items_wrapper_tag'] = !empty($fences_config['fences_field_items_wrapper_tag']) && $fences_config['fences_field_items_wrapper_tag'] !== TagManagerInterface::NO_MARKUP_VALUE; $vars['display_item_tag'] = $fences_config['fences_field_item_tag'] !== TagManagerInterface::NO_MARKUP_VALUE; $vars['label_tag'] = $fences_config['fences_label_tag']; $vars['field_tag'] = $fences_config['fences_field_tag']; $vars['field_items_wrapper_tag'] = !empty($fences_config['fences_field_items_wrapper_tag']) ? $fences_config['fences_field_items_wrapper_tag'] : NULL; $vars['field_item_tag'] = $fences_config['fences_field_item_tag']; // Prevent adding empty classes: if (!empty($fences_config['fences_field_classes'])) { $fences_field_classes = explode(' ', $fences_config['fences_field_classes']); foreach ($fences_field_classes as $class) { Loading @@ -126,7 +144,12 @@ function fences_preprocess_field(&$vars) { $vars['title_attributes']['class'][] = $class; } } if (!empty($fences_config['fences_field_classes'])) { $vars['attributes']['class'][] = $fences_config['fences_field_classes']; } if (!empty($fences_config['fences_label_classes'])) { $vars['title_attributes']['class'][] = $fences_config['fences_label_classes']; } if (!empty($fences_config['fences_field_item_classes'])) { $fences_field_item_classes = explode(' ', $fences_config['fences_field_item_classes']); foreach ($vars['items'] as $field_item) { Loading @@ -136,5 +159,9 @@ function fences_preprocess_field(&$vars) { } } } $vars['field_items_wrapper_attributes'] = new Attribute(); if (!empty($fences_config['fences_field_items_wrapper_classes'])) { $vars['field_items_wrapper_attributes']->addClass($fences_config['fences_field_items_wrapper_classes']); } } }
field.html.twig +37 −14 Original line number Diff line number Diff line Loading @@ -10,6 +10,7 @@ 'field--name-' ~ field_name|clean_class, 'field--type-' ~ field_type|clean_class, 'field--label-' ~ label_display, not display_items_wrapper_tag ? 'field__items' ] %} {% Loading @@ -18,21 +19,43 @@ label_display == 'visually_hidden' ? 'visually-hidden', ] %} {%- if display_field_tag -%} <{{ field_tag|default('div') }}{{ attributes.addClass(classes, 'field__items') }}> {% endif -%} {%~ if not label_hidden and display_label_tag %} <{{ label_tag|default('div') }}{{ title_attributes.addClass(title_classes) }}>{{ label }}</{{ label_tag|default('div') }}> {%~ endif -%} {% block field %} {%- if display_field_tag ~%} <{{ field_tag|default('div') }}{{ attributes.addClass(classes) }}> {%- endif -%} {%- if not label_hidden -%} {%- block field_label ~%} {% if display_label_tag -%}<{{ label_tag|default('div') }}{{ title_attributes.addClass(title_classes) }}>{%- endif -%} {%- block field_label_value -%} {{ label }} {%- endblock field_label_value -%} {%- if display_label_tag -%} </{{ label_tag|default('div') }}> {%- endif -%} {%- endblock field_label -%} {%- endif -%} {%- block field_items -%} {% if display_items_wrapper_tag ~%} <{{ field_items_wrapper_tag|default('div') }}{{ field_items_wrapper_attributes.addClass('field__items') }}> {%- endif -%} {% for item in items %} {%- if display_item_tag %} {%- block field_item -%} {%- if display_item_tag ~%} <{{ field_item_tag|default('div') }}{{ item.attributes.addClass('field__item') }}> {%- endif -%} {%- block field_value -%} {{ item.content }} {%- endblock field_value -%} {%- if display_item_tag -%} </{{ field_item_tag|default('div') }}> {%~ endif -%} {%- endif -%} {%- endblock field_item -%} {% endfor %} {%- if display_field_tag -%} {%- if display_items_wrapper_tag ~%} </{{ field_items_wrapper_tag|default('div') }}> {%- endif -%} {%- endblock field_items -%} {% if display_field_tag ~%} </{{ field_tag|default('div') }}> {%- endif -%} {% endblock field %}
tests/src/Kernel/FieldOutputTest.php +18 −0 Original line number Diff line number Diff line Loading @@ -72,6 +72,8 @@ class FieldOutputTest extends KernelTestBase { [ 'fences_field_tag' => 'none', 'fences_field_classes' => '', // 'fences_field_items_wrapper_tag' => 'none', // 'fences_field_items_wrapper_classes' => '', 'fences_field_item_tag' => 'none', 'fences_field_item_classes' => '', 'fences_label_tag' => 'none', Loading @@ -84,6 +86,8 @@ class FieldOutputTest extends KernelTestBase { [ 'fences_field_tag' => 'article', 'fences_field_classes' => '', // 'fences_field_items_wrapper_tag' => 'none', // 'fences_field_items_wrapper_classes' => '', 'fences_field_item_tag' => 'none', 'fences_field_item_classes' => '', 'fences_label_tag' => 'none', Loading @@ -96,6 +100,8 @@ class FieldOutputTest extends KernelTestBase { [ 'fences_field_tag' => 'none', 'fences_field_classes' => '', // 'fences_field_items_wrapper_tag' => 'none', // 'fences_field_items_wrapper_classes' => '', 'fences_field_item_tag' => 'none', 'fences_field_item_classes' => '', 'fences_label_tag' => 'none', Loading @@ -108,6 +114,8 @@ class FieldOutputTest extends KernelTestBase { [ 'fences_field_tag' => 'article', 'fences_field_classes' => '', // 'fences_field_items_wrapper_tag' => 'none', // 'fences_field_items_wrapper_classes' => '', 'fences_field_item_tag' => 'none', 'fences_field_item_classes' => '', 'fences_label_tag' => 'none', Loading @@ -120,6 +128,8 @@ class FieldOutputTest extends KernelTestBase { [ 'fences_field_tag' => 'article', 'fences_field_classes' => '', // 'fences_field_items_wrapper_tag' => 'none', // 'fences_field_items_wrapper_classes' => '', 'fences_field_item_tag' => 'none', 'fences_field_item_classes' => '', 'fences_label_tag' => 'h3', Loading @@ -132,6 +142,8 @@ class FieldOutputTest extends KernelTestBase { [ 'fences_field_tag' => 'article', 'fences_field_classes' => '', // 'fences_field_items_wrapper_tag' => 'none', // 'fences_field_items_wrapper_classes' => '', 'fences_field_item_tag' => 'h2', 'fences_field_item_classes' => '', 'fences_label_tag' => '', Loading @@ -144,6 +156,8 @@ class FieldOutputTest extends KernelTestBase { [ 'fences_field_tag' => '', 'fences_field_classes' => '', // 'fences_field_items_wrapper_tag' => 'none', // 'fences_field_items_wrapper_classes' => '', 'fences_field_item_tag' => '', 'fences_field_item_classes' => '', 'fences_label_tag' => '', Loading @@ -156,6 +170,8 @@ class FieldOutputTest extends KernelTestBase { [ 'fences_field_tag' => '', 'fences_field_classes' => '', // 'fences_field_items_wrapper_tag' => 'none', // 'fences_field_items_wrapper_classes' => '', 'fences_field_item_tag' => '', 'fences_field_item_classes' => '', 'fences_label_tag' => '', Loading @@ -168,6 +184,8 @@ class FieldOutputTest extends KernelTestBase { [ 'fences_field_tag' => 'ul', 'fences_field_classes' => 'item-list', // 'fences_field_items_wrapper_tag' => 'none', // 'fences_field_items_wrapper_classes' => '', 'fences_field_item_tag' => 'li', 'fences_field_item_classes' => 'item-list__item', 'fences_label_tag' => 'li', Loading