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