From 9bceaeb114a3a85874c29379f1063c0a8ff00c5a Mon Sep 17 00:00:00 2001
From: Antonio De Marco <antonio@nuvole.org>
Date: Sat, 6 Oct 2018 18:58:17 +0200
Subject: [PATCH] Issue #18: Integrate variant with Display Suite field
 templates.

---
 .../src/FieldTemplateProcessor.php            | 32 +++++++++++++++++--
 .../src/Plugin/DsFieldTemplate/Pattern.php    |  3 +-
 src/Form/PatternDisplayFormTrait.php          |  5 +--
 3 files changed, 34 insertions(+), 6 deletions(-)

diff --git a/modules/ui_patterns_ds/src/FieldTemplateProcessor.php b/modules/ui_patterns_ds/src/FieldTemplateProcessor.php
index 85d655136..3f946791a 100644
--- a/modules/ui_patterns_ds/src/FieldTemplateProcessor.php
+++ b/modules/ui_patterns_ds/src/FieldTemplateProcessor.php
@@ -34,6 +34,7 @@ class FieldTemplateProcessor implements FieldTemplateProcessorInterface {
       $content['pattern_' . $delta] = [
         '#type' => 'pattern',
         '#id' => $this->getPatternId(),
+        '#variant' => $this->getVariant(),
         '#fields' => $fields,
         '#context' => $this->getContext(),
         '#multiple_sources' => TRUE,
@@ -81,17 +82,42 @@ class FieldTemplateProcessor implements FieldTemplateProcessorInterface {
    *   Pattern ID.
    */
   protected function getPatternId() {
-    return $this->variables['ds-config']['settings']['pattern'];
+    return $this->getSetting('pattern');
   }
 
   /**
    * Get mapping settings.
    *
-   * @return mixed
+   * @return array
    *   Mapping settings.
    */
   protected function getMapping() {
-    return $this->variables['ds-config']['settings']['pattern_mapping'];
+    return $this->getSetting('pattern_mapping', []);
+  }
+
+  /**
+   * Get mapping settings.
+   *
+   * @return string
+   *   Mapping settings.
+   */
+  protected function getVariant() {
+    return $this->getSetting('pattern_variant');
+  }
+
+  /**
+   * Get setting value or default to given value if none set.
+   *
+   * @param string $name
+   *   Setting name.
+   * @param string $default
+   *   Setting default value.
+   *
+   * @return mixed
+   *   Setting value.
+   */
+  protected function getSetting($name, $default = '') {
+    return isset($this->variables['ds-config']['settings'][$name]) ? $this->variables['ds-config']['settings'][$name] : $default;
   }
 
   /**
diff --git a/modules/ui_patterns_ds/src/Plugin/DsFieldTemplate/Pattern.php b/modules/ui_patterns_ds/src/Plugin/DsFieldTemplate/Pattern.php
index 741159b5c..c0d3c31ba 100644
--- a/modules/ui_patterns_ds/src/Plugin/DsFieldTemplate/Pattern.php
+++ b/modules/ui_patterns_ds/src/Plugin/DsFieldTemplate/Pattern.php
@@ -131,7 +131,8 @@ class Pattern extends DsFieldTemplateBase implements ContainerFactoryPluginInter
   public function defaultConfiguration() {
     return [
       'pattern' => '',
-      'pattern_mapping' => '',
+      'pattern_variant' => '',
+      'pattern_mapping' => [],
     ];
   }
 
diff --git a/src/Form/PatternDisplayFormTrait.php b/src/Form/PatternDisplayFormTrait.php
index d43377488..6e3522080 100644
--- a/src/Form/PatternDisplayFormTrait.php
+++ b/src/Form/PatternDisplayFormTrait.php
@@ -43,10 +43,11 @@ trait PatternDisplayFormTrait {
     /** @var \Drupal\ui_patterns\Definition\PatternDefinition $definition */
     foreach ($this->patternsManager->getDefinitions() as $pattern_id => $definition) {
       if ($definition->hasVariants()) {
-        $form['pattern_variants'] = [
+        $form['pattern_variant'] = [
           '#type' => 'select',
-          '#title' => $this->t('Variants'),
+          '#title' => $this->t('Variant'),
           '#options' => $definition->getVariantsAsOptions(),
+          '#default_value' => isset($configuration['pattern_variant']) ? $configuration['pattern_variant'] : NULL,
           '#weight' => 0,
           '#states' => [
             'visible' => [
-- 
GitLab