From 5e3cb0fbc081bf308a1a88a677fd741bb5f62b7b Mon Sep 17 00:00:00 2001
From: Mingsong Hu <mingsonghu@Mingsongs-MBP.gateway>
Date: Fri, 27 Sep 2019 16:47:35 +1000
Subject: [PATCH] Integrate tree configuration feature with menu links

---
 src/Controller/HmMenuController.php     |  3 ++-
 src/Controller/HmTaxonomyController.php |  6 +++--
 src/Form/HmMenuForm.php                 | 20 +++++++++++++----
 src/PluginTypeManager.php               | 29 +++++++++++++++++--------
 4 files changed, 42 insertions(+), 16 deletions(-)

diff --git a/src/Controller/HmMenuController.php b/src/Controller/HmMenuController.php
index d76abfc..77a7b56 100644
--- a/src/Controller/HmMenuController.php
+++ b/src/Controller/HmMenuController.php
@@ -231,7 +231,8 @@ class HmMenuController extends ControllerBase {
    * @return NULL|object
    */
   protected function getDisplayPlugin() {
-    return $this->hmPluginTypeManager->getDisplayPluginInstance('hm_setup_menu');
+    $display_profile = $this->hmPluginTypeManager->getDisplayProfile('hm_setup_menu');
+    return $this->hmPluginTypeManager->getDisplayPluginInstance($display_profile);
   }
   
   /**
diff --git a/src/Controller/HmTaxonomyController.php b/src/Controller/HmTaxonomyController.php
index eb70be9..7d28ece 100644
--- a/src/Controller/HmTaxonomyController.php
+++ b/src/Controller/HmTaxonomyController.php
@@ -112,9 +112,11 @@ class HmTaxonomyController extends ControllerBase {
         }
       }
     }
-
+    
+    // Display profile.
+    $display_profile = $this->hmPluginTypeManager->getDisplayProfile('hm_setup_taxonomy');
     // Display plugin instance.
-    $display_plugin = $this->hmPluginTypeManager->getDisplayPluginInstance('hm_setup_taxonomy');
+    $display_plugin = $this->hmPluginTypeManager->getDisplayPluginInstance($display_profile);
     
     if (empty($display_plugin)) {
       return new JsonResponse(['result' => 'Display profile has not been set up.']);
diff --git a/src/Form/HmMenuForm.php b/src/Form/HmMenuForm.php
index 1295c7e..cb55707 100644
--- a/src/Form/HmMenuForm.php
+++ b/src/Form/HmMenuForm.php
@@ -71,9 +71,14 @@ class HmMenuForm extends MenuForm {
    * @return NULL|array
    */
   protected function buildOverviewTree(array $form, FormStateInterface $form_state) {
-    global $base_path;
+    
+    $display_profile = $this->hmPluginTypeManager->getDisplayProfile('hm_setup_menu');
+    
+    if (empty($display_profile)) {
+      return [];
+    }
 
-    $display_plugin_instance = $this->hmPluginTypeManager->getDisplayPluginInstance('hm_setup_menu');
+    $display_plugin_instance = $this->hmPluginTypeManager->getDisplayPluginInstance($display_profile);
     
     if (!empty($display_plugin_instance)) {
       if (method_exists($display_plugin_instance, 'getForm')) {
@@ -91,8 +96,15 @@ class HmMenuForm extends MenuForm {
         }
         // Urls
         $source_url = Url::fromRoute('hierarchy_manager.menu.tree.json', ['mid' => $mid], ['query' => ['token' => $token, 'destination' => $destination]])->toString();
-        $update_url = Url::fromRoute('hierarchy_manager.menu.tree.update', ['mid' => $mid], ['query' => ['token' => $token]])->toString();
-        return $display_plugin_instance->getForm($source_url, $update_url, $form, $form_state);
+        $update_url = Url::fromRoute('hierarchy_manager.menu.tree.update', ['mid' => $mid], ['query' => ['token' => $token]])->toString();       
+        $config = $display_profile->get("config");
+        if (!empty($config)) {
+          $options = json_decode($config);
+        }
+        else {
+          $options = NULL;
+        }
+        return $display_plugin_instance->getForm($source_url, $update_url, $form, $form_state, $options);
       }
     }
     
diff --git a/src/PluginTypeManager.php b/src/PluginTypeManager.php
index 315d523..5a5ef31 100644
--- a/src/PluginTypeManager.php
+++ b/src/PluginTypeManager.php
@@ -2,9 +2,11 @@
 
 namespace Drupal\hierarchy_manager;
 
+use Drupal\Core\Config\Entity\ConfigEntityBase;
 use Drupal\Core\Entity\EntityTypeManagerInterface;
 use Drupal\hierarchy_manager\Plugin\HmDisplayPluginManager;
 use Drupal\hierarchy_manager\Plugin\HmSetupPluginManager;
+use DrupalCodeGenerator\Command\Drupal_8\Module\ConfigurationEntity;
 
 class PluginTypeManager {
   
@@ -65,27 +67,36 @@ class PluginTypeManager {
   /**
    * Get a display plugin instance according to a setup plugin.
    * 
-   * @param string $setup_plugin_id
-   *   setup plugin ID.
+   * @param \Drupal\Core\Config\Entity\ConfigEntityBase; $display_profile
+   *   Display profile entity.
    * @return NULL|object
    *   The display plugin instance.
    */
-  public function getDisplayPluginInstance(string $setup_plugin_id) {
-    // The setup plugin instance.
-    $setup_plugin = $this->setupManager->createInstance($setup_plugin_id);
-    // Display profile.
-    $display_profile = $this->entityTypeManager->getStorage('hm_display_profile')->load($setup_plugin->getDispalyProfileId());
-    
+  public function getDisplayPluginInstance(ConfigEntityBase $display_profile) {
     if (empty($display_profile)) {
       return NULL;
     }
-    
     // Display plugin ID.
     $display_plugin_id = $display_profile->get("plugin");
     
     return $this->displayManager->createInstance($display_plugin_id);
   }
   
+  /**
+   * Get a display profile entity according to a setup plugin.
+   *
+   * @param string $setup_plugin_id
+   *   setup plugin ID.
+   * @return NULL|\DrupalCodeGenerator\Command\Drupal_8\Module\ConfigurationEntity
+   *   The display profile entity.
+   */
+  public function getDisplayProfile(string $setup_plugin_id) {
+    // The setup plugin instance.
+    $setup_plugin = $this->setupManager->createInstance($setup_plugin_id);
+    // Return the display profile.
+    return  $this->entityTypeManager->getStorage('hm_display_profile')->load($setup_plugin->getDispalyProfileId());
+  }
+  
   /**
    * Update the items for a hierarchy
    * 
-- 
GitLab