Commit 09e770f9 authored by Julian Pustkuchen's avatar Julian Pustkuchen Committed by Joshua Sedler
Browse files

Issue #1343578 by Anybody, Grevil, thomas.frobieter: [3.x] Add optional...

Issue #1343578 by Anybody, Grevil, thomas.frobieter: [3.x] Add optional wrapper around field items and fix class structure
parent d22b688b
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -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'
+30 −0
Original line number Diff line number Diff line
<?php

use Drupal\fences\TagManagerInterface;

/**
 * @file
 * Installation hooks for Fences module.
@@ -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();
        }
      }
    }
  }
}
+28 −1
Original line number Diff line number Diff line
@@ -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().
@@ -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',
@@ -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'])) {
@@ -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) {
@@ -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) {
@@ -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']);
    }
  }
}
+37 −14
Original line number Diff line number Diff line
@@ -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'
  ]
%}
{%
@@ -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 %}
+18 −0
Original line number Diff line number Diff line
@@ -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',
@@ -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',
@@ -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',
@@ -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',
@@ -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',
@@ -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' => '',
@@ -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' => '',
@@ -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' => '',
@@ -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',