From f8783963c5e17600c8faa72029d6791b31b3bb4e Mon Sep 17 00:00:00 2001
From: Jeffrey Fortune <jfortune@tombras.com>
Date: Fri, 8 Mar 2019 10:05:48 -0500
Subject: [PATCH] update to values being passed into form state. contol for
 when css setting can be seen

---
 bg_img_field.module                           | 21 ++++++---
 config/schema/bg_img_field.schema.yml         |  3 ++
 .../FieldFormatter/BgImgFieldFormatter.php    | 38 ++++++++++++----
 src/Plugin/Field/FieldType/BgImgItem.php      | 15 +++++--
 .../Field/FieldWidget/BgImageFieldWidget.php  | 45 ++++++++++++-------
 .../media/Source/BackgroundImageMedia.php     | 22 +++++++++
 templates/background-style.html.twig          |  3 ++
 7 files changed, 113 insertions(+), 34 deletions(-)
 create mode 100644 src/Plugin/media/Source/BackgroundImageMedia.php
 create mode 100644 templates/background-style.html.twig

diff --git a/bg_img_field.module b/bg_img_field.module
index e973547..e63ddc9 100644
--- a/bg_img_field.module
+++ b/bg_img_field.module
@@ -38,15 +38,26 @@ function bg_img_field_help($route_name, RouteMatchInterface $route_match) {
  * Implements hook_form_alter().
  */
 function bg_img_field_form_alter(&$form, FormStateInterface $form_state, $form_id) {
-
-  // Remove the cardinality container from the background image field.
   if ($form_id === 'field_config_edit_form') {
     $field_widget_storage = $form_state->getStorage();
-    $pluginId = $field_widget_storage['default_value_widget']->getPluginId();
 
-    if ($pluginId === 'bg_img_field_widget') {
-      unset($form["default_value"]);
+    if (isset($field_widget_storage['default_value_widget'])) {
+      $pluginId = $field_widget_storage['default_value_widget']->getPluginId();
 
+      if ($pluginId === 'bg_img_field_widget') {
+        unset($form["default_value"]);
+      }
     }
   }
 }
+
+/**
+ * Implements hook_theme().
+ */
+function bg_img_field_theme($existing, $type, $theme, $path) {
+  return [
+    'background_style' => [
+      'variables' => ['css' => NULL],
+    ],
+  ];
+}
diff --git a/config/schema/bg_img_field.schema.yml b/config/schema/bg_img_field.schema.yml
index 3e520d5..ac27b89 100644
--- a/config/schema/bg_img_field.schema.yml
+++ b/config/schema/bg_img_field.schema.yml
@@ -10,6 +10,9 @@ field.widget.settings.bg_img_field_widget:
   type: mapping
   label: 'Default field settings'
   mapping:
+    hide_css_settings:
+      type: boolean
+      label: 'Whether to show or hide css settings on edit screens'
     css_settings:
       type: mapping
       label: 'CSS settings'
diff --git a/src/Plugin/Field/FieldFormatter/BgImgFieldFormatter.php b/src/Plugin/Field/FieldFormatter/BgImgFieldFormatter.php
index 2ddf2d2..f55a1cc 100644
--- a/src/Plugin/Field/FieldFormatter/BgImgFieldFormatter.php
+++ b/src/Plugin/Field/FieldFormatter/BgImgFieldFormatter.php
@@ -192,6 +192,12 @@ class BgImgFieldFormatter extends ResponsiveImageFormatter implements ContainerF
     $elements = [];
     $css = "";
 
+    $image_link_setting = $this->getSetting('image_link');
+
+    $cache_contexts = [];
+    if ($image_link_setting == 'file') {
+      $cache_contexts[] = 'url.site';
+    }
     // Collect cache tags to be added for each item in the field.
     $responsive_image_style = $this->responsiveImageStyleStorage->load($this->getSetting('responsive_image_style'));
     $image_styles_to_load = [];
@@ -220,14 +226,30 @@ class BgImgFieldFormatter extends ResponsiveImageFormatter implements ContainerF
 
       // Attach to head on element to create style tag in the html head.
       if (!empty($css)) {
-        // Use the selector in the id to avoid collisions with multiple
-        // background formatters on the same page.
-        $id = 'picture-background-formatter-' . $selector;
-        $elements['#attached']['html_head'][] = [[
-          '#tag' => 'style',
-          '#value' => new CSSSnippet($css),
-        ], $id,
-        ];
+        $current_path =  \Drupal::request()->getRequestUri();
+        if(preg_match('/node\/(\d+)\/layout/', $current_path, $matches)) {
+          $n = null;
+          $elements = [
+            '#theme' => 'background_style',
+            '#css' => $css,
+            '#cache' => [
+              'tags' => $cache_tags,
+              'contexts' => $cache_contexts,
+            ],
+          ];
+        } else {
+          // Use the selector in the id to avoid collisions with multiple
+          // background formatters on the same page.
+          $id = 'picture-background-formatter-' . $selector;
+          $elements['#attached']['html_head'][] = [[
+            '#tag' => 'style',
+            '#value' => new CSSSnippet($css),
+            '#cache' => [
+              'tags' => $cache_tags,
+              'contexts' => $cache_contexts,
+            ],
+          ], $id];
+        }
       }
     }
 
diff --git a/src/Plugin/Field/FieldType/BgImgItem.php b/src/Plugin/Field/FieldType/BgImgItem.php
index e885371..b2732e9 100644
--- a/src/Plugin/Field/FieldType/BgImgItem.php
+++ b/src/Plugin/Field/FieldType/BgImgItem.php
@@ -6,6 +6,7 @@ use Drupal\Core\Field\FieldStorageDefinitionInterface;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\TypedData\DataDefinition;
 use Drupal\image\Plugin\Field\FieldType\ImageItem;
+use Robo\State\Data;
 
 /**
  * Plugin implementation of the 'bg_img_field' field type.
@@ -14,8 +15,11 @@ use Drupal\image\Plugin\Field\FieldType\ImageItem;
  *   id = "bg_img_field",
  *   label = @Translation("Background Image Field"),
  *   description = @Translation("Field for creating responsive background
- *   images."), default_widget = "bg_img_field_widget", default_formatter =
- *   "bg_img_field_formatter"
+ *   images."),
+ *   default_widget = "bg_img_field_widget",
+ *   default_formatter = "bg_img_field_formatter",
+ *   list_class = "\Drupal\file\Plugin\Field\FieldType\FileFieldItemList",
+ *   constraints = {"ReferenceAccess" = {}, "FileValidation" = {}}
  * )
  */
 class BgImgItem extends ImageItem {
@@ -120,6 +124,10 @@ class BgImgItem extends ImageItem {
       ->setLabel(t('CSS Background Position Property'))
       ->setDescription(t("CSS attribute that set the background position value of the background image."));
 
+    $properties['hide_css_Settings'] = DataDefinition::create('boolean')
+      ->setLabel(t("Hide CSS Settings"))
+      ->setDescription(t("Hides CSS settings on edit screens of the background image field type"));
+
     return $properties;
   }
 
@@ -199,8 +207,7 @@ class BgImgItem extends ImageItem {
     $elements['css_settings']['css_background_position'] = [
       '#type' => 'radios',
       '#title' => $this->t('Background Position'),
-      '#description' => $this->t('Set a background position, leave unchecked to
-      # have your own in your theme css.'),
+      '#description' => $this->t('Set a background position'),
       '#default_value' => $css_option_settings['css_background_position'],
       '#options' => [
         "inherit" => $this->t("inherit"),
diff --git a/src/Plugin/Field/FieldWidget/BgImageFieldWidget.php b/src/Plugin/Field/FieldWidget/BgImageFieldWidget.php
index 585fa3e..7d2cdfa 100644
--- a/src/Plugin/Field/FieldWidget/BgImageFieldWidget.php
+++ b/src/Plugin/Field/FieldWidget/BgImageFieldWidget.php
@@ -29,6 +29,7 @@ class BgImageFieldWidget extends ImageWidget {
     $settings['css_settings']['css_repeat'] = 'inherit';
     $settings['css_settings']['css_background_size'] = 'inherit';
     $settings['css_settings']['css_background_position'] = 'inherit';
+    $settings['hide_css_settings'] = 0;
 
     return $settings;
   }
@@ -39,6 +40,13 @@ class BgImageFieldWidget extends ImageWidget {
   public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) {
     $elements = parent::formElement($items, $delta, $element, $form, $form_state);
 
+    $item = $items[$delta]->getFieldDefinition()->getSettings();
+
+    // set the form state with values of css_settings and hide_css_settings
+    // to be used by the process method.
+    $form_state->set('css_values',$item['css_settings'] );
+    $form_state->set('hide_css_settings', $this->getSetting('hide_css_settings'));
+
     $elements['#upload_validators']['file_validate_extensions'][0] =
       $this->getFieldSetting('file_extensions');
 
@@ -68,34 +76,22 @@ class BgImageFieldWidget extends ImageWidget {
   public static function process($element, FormStateInterface $form_state, $form) {
     $elements = parent::process($element, $form_state, $form);
 
-    $entity = $form_state->getformObject()->getEntity();
-
-    // Check to see if the entity field definition exist.
-    // If not apply default values.
-    if (isset($element['#field_name']) && $entity->getFieldDefinition($element['#field_name']) !== NULL) {
-      $field_settings = $entity->getFieldDefinition($element['#field_name'])
-        ->getSettings();
-    }
-    else {
-      $field_settings = self::defaultSettings();
-    }
-
-    $css_option_settings = $field_settings['css_settings'];
-
     if ($element['#files']) {
-
+      $css_option_settings = $form_state->get('css_values');
       $elements['css_settings'] = [
         '#type' => 'details',
         '#title' => t('CSS Settings'),
         '#description' => t('Set default CSS properties for the background image.'),
         '#open' => FALSE,
+        '#attributes' => $form_state->get('hide_css_settings') ? ['class' =>
+          ['visually-hidden']] : ['class' => ['visually-shown']],
       ];
 
-      $token_types = [$entity->getEntityType()->id()];
+      $token_types = [];
 
       // Background selector value.
       $selector = !empty($element['#value']['css_selector']) ?
-      $element['#value']['css_selector'] : $css_option_settings['css_selector'];
+        $element['#value']['css_selector'] : $css_option_settings['css_selector'];
 
       // The css selector input field needed to.
       $elements['css_settings']['css_selector'] = [
@@ -176,7 +172,22 @@ class BgImageFieldWidget extends ImageWidget {
         '#tree' => TRUE,
       ];
     }
+
     return $elements;
   }
 
+  public function settingsForm(array $form, FormStateInterface $form_state) {
+    $element = parent::settingsForm($form, $form_state);
+
+    $element['hide_css_settings'] = [
+      '#type' => 'checkbox',
+      '#title' => t("Hide CSS Settings"),
+      '#description' => t("Do not show CSS settings when creating content 
+      on nodes, blocks, custom entities, media,  and paragraph items"),
+      '#default_value' => $this->getSetting('hide_css_settings'),
+    ];
+
+    return $element;
+  }
+
 }
diff --git a/src/Plugin/media/Source/BackgroundImageMedia.php b/src/Plugin/media/Source/BackgroundImageMedia.php
new file mode 100644
index 0000000..cf6a952
--- /dev/null
+++ b/src/Plugin/media/Source/BackgroundImageMedia.php
@@ -0,0 +1,22 @@
+<?php
+namespace Drupal\bg_img_field\Plugin\media\Source;
+
+use Drupal\media\Plugin\media\Source\Image;
+
+/**
+ * Image entity media source.
+ *
+ * @see \Drupal\Core\Image\ImageInterface
+ *
+ * @MediaSource(
+ *   id = "bg_img_media_field",
+ *   label = @Translation("Background Image"),
+ *   description = @Translation("Use local images for reusable media."),
+ *   allowed_field_types = {"bg_img_field"},
+ *   default_thumbnail_filename = "no-thumbnail.png",
+ *   thumbnail_alt_metadata_attribute = "thumbnail_alt_value"
+ * )
+ */
+class BackgroundImageMedia extends Image {
+
+}
\ No newline at end of file
diff --git a/templates/background-style.html.twig b/templates/background-style.html.twig
new file mode 100644
index 0000000..2c28584
--- /dev/null
+++ b/templates/background-style.html.twig
@@ -0,0 +1,3 @@
+<style>
+  {{ css }}
+</style>
\ No newline at end of file
-- 
GitLab