From 96c3ad179b7f0325b151eee5529d0a825f8e59dd Mon Sep 17 00:00:00 2001
From: Nidhi Patadia <nidhipatadia27@gmail.com>
Date: Mon, 24 Mar 2025 22:15:07 +0530
Subject: [PATCH 1/2] Can't document menus resolved.

---
 content_model_documentation.services.yml |  1 +
 src/DocumentableEntityProvider.php       | 44 ++++++++++++++++++++++--
 2 files changed, 42 insertions(+), 3 deletions(-)

diff --git a/content_model_documentation.services.yml b/content_model_documentation.services.yml
index 6605184..7dd5e88 100644
--- a/content_model_documentation.services.yml
+++ b/content_model_documentation.services.yml
@@ -15,6 +15,7 @@ services:
       - '@config.factory'
       - '@content_model_documentation.documentable.modules'
       - '@entity_field.manager'
+      - '@entity_type.manager'
   content_model_documentation.documentable.modules:
     class: Drupal\content_model_documentation\DocumentableModules
     arguments:
diff --git a/src/DocumentableEntityProvider.php b/src/DocumentableEntityProvider.php
index 9ac4ca2..cf8904c 100644
--- a/src/DocumentableEntityProvider.php
+++ b/src/DocumentableEntityProvider.php
@@ -7,6 +7,7 @@ use Drupal\Core\Config\ConfigFactoryInterface;
 use Drupal\Core\Database\Database;
 use Drupal\Core\DependencyInjection\ServiceProviderBase;
 use Drupal\Core\Entity\EntityFieldManagerInterface;
+use Drupal\Core\Entity\EntityTypeManagerInterface;
 
 /**
  * Service providing information on the Documentable entities.
@@ -36,6 +37,13 @@ class DocumentableEntityProvider extends ServiceProviderBase {
    */
   protected $entityFieldManager;
 
+  /**
+   * The entity type manager.
+   *
+   * @var \Drupal\Core\Entity\EntityTypeManagerInterface
+   */
+  protected $entityTypeManager;
+
   /**
    * An array of fieldmap.
    *
@@ -52,10 +60,13 @@ class DocumentableEntityProvider extends ServiceProviderBase {
    *   The documentable modules service.
    * @param \Drupal\Core\Entity\EntityFieldManagerInterface $entityFieldManager
    *   The time service.
+   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entityTypeManager
+   *   The entity type manager.
    */
-  public function __construct(ConfigFactoryInterface $configFactory, DocumentableModules $documentableModules, EntityFieldManagerInterface $entityFieldManager) {
+  public function __construct(ConfigFactoryInterface $configFactory, DocumentableModules $documentableModules, EntityFieldManagerInterface $entityFieldManager, EntityTypeManagerInterface $entityTypeManager) {
     $this->config = $configFactory->get('content_model_documentation.settings');
     $this->entityFieldManager = $entityFieldManager;
+    $this->entityTypeManager = $entityTypeManager;
     $this->fieldMap = $this->entityFieldManager->getFieldMap();
     $this->documentableModules = $documentableModules;
   }
@@ -101,8 +112,13 @@ class DocumentableEntityProvider extends ServiceProviderBase {
     $documentable_entities = [];
     $documentable_types = $this->getDocumentableEntityTypes();
     foreach ($documentable_types as $documentable_type) {
-      $documentable_entities = $this->addEntityBundles($documentable_type, $documentable_entities);
-      $documentable_entities = $this->addEntityFields($documentable_type, $documentable_entities);
+      if ($documentable_type === 'menu_link_content') {
+        $documentable_entities = $this->addMenuEntity($documentable_type, $documentable_entities);
+      }
+      else {
+        $documentable_entities = $this->addEntityBundles($documentable_type, $documentable_entities);
+        $documentable_entities = $this->addEntityFields($documentable_type, $documentable_entities);
+      }
     }
     // Let's sort them so they make more sense in the list.
     natcasesort($documentable_entities);
@@ -223,4 +239,26 @@ class DocumentableEntityProvider extends ServiceProviderBase {
     return $documentable_entities;
   }
 
+  /**
+   * Get menu entities and add them to $documentable_entities.
+   *
+   * @param string $entity_type
+   *   The name of the entity type.
+   * @param array $documentable_entities
+   *   The incoming array of documentable entities.
+   *
+   * @return array
+   *   Array of menu documentable entities.
+   */
+  protected function addMenuEntity($entity_type, array $documentable_entities): array {
+    // Load all menu items.
+    $menu_storage = $this->entityTypeManager->getStorage('menu');
+    $menus = $menu_storage->loadMultiple();
+
+    foreach ($menus as $menu) {
+      $documentable_entities["{$entity_type}.{$menu->id()}"] = "{$entity_type}.{$menu->id()}";
+    }
+    return $documentable_entities;
+  }
+
 }
-- 
GitLab


From d3e14e9de4a428256004251715537c9ed1c90c48 Mon Sep 17 00:00:00 2001
From: Steve Wirt <Steve Wirt>
Date: Mon, 24 Mar 2025 23:31:40 -0400
Subject: [PATCH 2/2] #3511513 Move logic to constructor.

---
 src/DocumentableEntityProvider.php | 52 +++++++++++++++++-------------
 1 file changed, 30 insertions(+), 22 deletions(-)

diff --git a/src/DocumentableEntityProvider.php b/src/DocumentableEntityProvider.php
index cf8904c..c457987 100644
--- a/src/DocumentableEntityProvider.php
+++ b/src/DocumentableEntityProvider.php
@@ -68,6 +68,7 @@ class DocumentableEntityProvider extends ServiceProviderBase {
     $this->entityFieldManager = $entityFieldManager;
     $this->entityTypeManager = $entityTypeManager;
     $this->fieldMap = $this->entityFieldManager->getFieldMap();
+    $this->fieldMap = $this->addMenusToFieldMap($this->fieldMap);
     $this->documentableModules = $documentableModules;
   }
 
@@ -112,13 +113,8 @@ class DocumentableEntityProvider extends ServiceProviderBase {
     $documentable_entities = [];
     $documentable_types = $this->getDocumentableEntityTypes();
     foreach ($documentable_types as $documentable_type) {
-      if ($documentable_type === 'menu_link_content') {
-        $documentable_entities = $this->addMenuEntity($documentable_type, $documentable_entities);
-      }
-      else {
-        $documentable_entities = $this->addEntityBundles($documentable_type, $documentable_entities);
-        $documentable_entities = $this->addEntityFields($documentable_type, $documentable_entities);
-      }
+      $documentable_entities = $this->addEntityBundles($documentable_type, $documentable_entities);
+      $documentable_entities = $this->addEntityFields($documentable_type, $documentable_entities);
     }
     // Let's sort them so they make more sense in the list.
     natcasesort($documentable_entities);
@@ -234,31 +230,43 @@ class DocumentableEntityProvider extends ServiceProviderBase {
           }
         }
       }
-
     }
     return $documentable_entities;
   }
 
   /**
-   * Get menu entities and add them to $documentable_entities.
+   * Optionally add menus to fieldMap if they are not there.
    *
-   * @param string $entity_type
-   *   The name of the entity type.
-   * @param array $documentable_entities
-   *   The incoming array of documentable entities.
+   * @param array $field_map
+   *   The fieldMap containing field-able entities.
    *
    * @return array
-   *   Array of menu documentable entities.
+   *   Field map possibly with menus added.
    */
-  protected function addMenuEntity($entity_type, array $documentable_entities): array {
-    // Load all menu items.
-    $menu_storage = $this->entityTypeManager->getStorage('menu');
-    $menus = $menu_storage->loadMultiple();
-
-    foreach ($menus as $menu) {
-      $documentable_entities["{$entity_type}.{$menu->id()}"] = "{$entity_type}.{$menu->id()}";
+  protected function addMenusToFieldMap(array $field_map): array {
+    // Determine if menus need to be added.
+    // If menus are field-able (example menu_item_extras is in use), then the
+    // menu entities will already be in the field map.
+    if (empty($field_map['menu_link_content']['uuid']['bundles']) || !empty($field_map['menu_link_content']['uuid']['bundles']['menu_link_content'])) {
+      // Menus are not in the field map so we need to add them.
+      $menu_storage = $this->entityTypeManager->getStorage('menu');
+      $menus = $menu_storage->loadMultiple();
+      $bundles = [];
+      $field_map['menu_link_content']['uuid']['bundles'] = [];
+      foreach ($menus as $menu) {
+        $bundles[$menu->id()] = $menu->id();
+      }
+      $field_map['menu_link_content']['uuid']['bundles'] = $bundles;
+      // Also populate any fields
+      foreach ($field_map['menu_link_content'] as $element_name => $element) {
+        if ($this->isField($element_name)) {
+          // It is a field so add in the bundles.
+          $field_map['menu_link_content'][$element_name]['bundles'] = $bundles;
+        }
+      }
     }
-    return $documentable_entities;
+
+    return $field_map;
   }
 
 }
-- 
GitLab