From f0b59afd2dba95018f1cc203a23239333171e0bc Mon Sep 17 00:00:00 2001
From: Jacob Rockowitz <21160-jrockowitz@users.noreply.drupalcode.org>
Date: Sun, 24 Mar 2024 11:51:51 +0000
Subject: [PATCH] Issue #3406816: Functionality for creating global JSON-LD
 definitions, e.g. for an organization

---
 .../schemadotorg_address.module               | 21 +++++++++---------
 ...DotOrgContentModelDocumentationManager.php |  9 +-------
 .../schemadotorg_jsonld_custom.module         | 10 +++++++++
 .../src/SchemaDotOrgJsonLdCustomManager.php   | 22 +++++++------------
 src/SchemaDotOrgSchemaTypeManager.php         | 11 +++++++++-
 ...SchemaDotOrgSchemaTypeManagerInterface.php | 10 +++++----
 6 files changed, 45 insertions(+), 38 deletions(-)

diff --git a/modules/schemadotorg_address/schemadotorg_address.module b/modules/schemadotorg_address/schemadotorg_address.module
index 7c328591d..6a1b8d79d 100644
--- a/modules/schemadotorg_address/schemadotorg_address.module
+++ b/modules/schemadotorg_address/schemadotorg_address.module
@@ -29,21 +29,20 @@ function schemadotorg_address_schemadotorg_property_field_alter(
     return;
   }
 
-  $config = \Drupal::config('schemadotorg_address.settings');
   /** @var \Drupal\schemadotorg\SchemaDotOrgSchemaTypeManagerInterface $schema_type_manager */
   $schema_type_manager = \Drupal::service('schemadotorg.schema_type_manager');
 
-  $field_overrides = [];
-
-  $breadcrumbs = $schema_type_manager->getTypeBreadcrumbs($schema_type);
-  foreach ($breadcrumbs as $breadcrumb) {
-    $breadcrumb_types = array_reverse($breadcrumb);
-    foreach ($breadcrumb_types as $breadcrumb_type) {
-      $field_overrides += $config->get("field_overrides.$breadcrumb_type--$schema_property") ?? [];
-    }
-  }
+  $config = \Drupal::config('schemadotorg_address.settings');
 
-  $field_overrides += $config->get("field_overrides.$schema_property") ?? [];
+  $field_overrides = [];
+  $field_overrides += $schema_type_manager->getSetting(
+    $config->get('field_overrides'),
+    ['schema_type' => $schema_type, 'schema_property' => $schema_property]
+  ) ?? [];
+  $field_overrides += $schema_type_manager->getSetting(
+    $config->get('field_overrides'),
+    ['schema_property' => $schema_property]
+  ) ?? [];
 
   $field_values['settings']['field_overrides'] = [];
   foreach ($field_overrides as $property => $override) {
diff --git a/modules/schemadotorg_content_model_documentation/src/SchemaDotOrgContentModelDocumentationManager.php b/modules/schemadotorg_content_model_documentation/src/SchemaDotOrgContentModelDocumentationManager.php
index 2b9c5d211..1e79978c4 100644
--- a/modules/schemadotorg_content_model_documentation/src/SchemaDotOrgContentModelDocumentationManager.php
+++ b/modules/schemadotorg_content_model_documentation/src/SchemaDotOrgContentModelDocumentationManager.php
@@ -157,16 +157,9 @@ class SchemaDotOrgContentModelDocumentationManager implements SchemaDotOrgConten
     $config = $this->configFactory
       ->get('schemadotorg_content_model_documentation.settings');
 
-    $entity_type_id = $mapping->getTargetEntityTypeId();
-    $bundle = $mapping->getTargetBundle();
-    $schema_type = $mapping->getSchemaType();
     $types = $config->get('types');
     $types = array_combine($types, $types);
-    return (bool) $this->schemaTypeManager->getSetting($types, [
-      'entity_type_id' => $entity_type_id,
-      'bundle' => $bundle,
-      'schema_type' => $schema_type,
-    ]);
+    return (bool) $this->schemaTypeManager->getSetting($types, $mapping);
   }
 
   /**
diff --git a/modules/schemadotorg_jsonld_custom/schemadotorg_jsonld_custom.module b/modules/schemadotorg_jsonld_custom/schemadotorg_jsonld_custom.module
index b039251b6..3d8add195 100644
--- a/modules/schemadotorg_jsonld_custom/schemadotorg_jsonld_custom.module
+++ b/modules/schemadotorg_jsonld_custom/schemadotorg_jsonld_custom.module
@@ -130,6 +130,11 @@ function schemadotorg_jsonld_custom_form_schemadotorg_jsonld_settings_form_alter
     '#description' => t('Enter the default JSON-LD for Schema.org types.'),
     '#element_validate' => ['_schemadotorg_jsonld_custom_json_settings_validate'],
     '#example' => '
+node--page: |
+  {
+    "copyrightHolder": "[site:name]",
+    "copyrightYear": [current-date:html_year]
+  }
 node--CreativeWork: |
   {
     "copyrightHolder": "[site:name]",
@@ -144,6 +149,11 @@ node--CreativeWork: |
     '#description' => t('Enter the default JSON-LD for new Schema.org mappings.'),
     '#element_validate' => ['_schemadotorg_jsonld_custom_json_settings_validate'],
     '#example' => '
+node--page: |
+  {
+    "copyrightHolder": "[site:name]",
+    "copyrightYear": [current-date:html_year]
+  }
 node--CreativeWork: |
   {
     "copyrightHolder": "[site:name]",
diff --git a/modules/schemadotorg_jsonld_custom/src/SchemaDotOrgJsonLdCustomManager.php b/modules/schemadotorg_jsonld_custom/src/SchemaDotOrgJsonLdCustomManager.php
index 4a2955d42..a766cd216 100644
--- a/modules/schemadotorg_jsonld_custom/src/SchemaDotOrgJsonLdCustomManager.php
+++ b/modules/schemadotorg_jsonld_custom/src/SchemaDotOrgJsonLdCustomManager.php
@@ -171,20 +171,14 @@ class SchemaDotOrgJsonLdCustomManager implements SchemaDotOrgJsonLdCustomInterfa
    *   The default custom JSON-LD for Schema.org type.
    */
   protected function getDefaultJson(string $entity_type_id, string $schema_type, string $config_name): ?string {
-    $config = $this->configFactory->get('schemadotorg_jsonld_custom.settings');
-
-    $breadcrumbs = $this->schemaTypeManager->getTypeBreadcrumbs($schema_type);
-    foreach ($breadcrumbs as $breadcrumb) {
-      $breadcrumb_types = array_reverse($breadcrumb);
-      foreach ($breadcrumb_types as $breadcrumb_type) {
-        $default_json = $config->get("$config_name.$entity_type_id--$breadcrumb_type")
-          ?? $config->get("$config_name.$breadcrumb_type");
-        if ($default_json) {
-          return $default_json;
-        }
-      }
-    }
-    return NULL;
+    $settings = $this->configFactory
+      ->get('schemadotorg_jsonld_custom.settings')
+      ->get($config_name);
+    $parts = [
+      'entity_type_id' => $entity_type_id,
+      'schema_type' => $schema_type,
+    ];
+    return $this->schemaTypeManager->getSetting($settings, $parts);
   }
 
 }
diff --git a/src/SchemaDotOrgSchemaTypeManager.php b/src/SchemaDotOrgSchemaTypeManager.php
index cdc1b3cf9..33dcf2378 100644
--- a/src/SchemaDotOrgSchemaTypeManager.php
+++ b/src/SchemaDotOrgSchemaTypeManager.php
@@ -713,7 +713,16 @@ class SchemaDotOrgSchemaTypeManager implements SchemaDotOrgSchemaTypeManagerInte
   /**
    * {@inheritdoc}
    */
-  public function getSetting(array $settings, array $parts): mixed {
+  public function getSetting(array $settings, SchemaDotOrgMappingInterface|array $parts): mixed {
+    // Get the parts from a Schema.org mapping.
+    if ($parts instanceof SchemaDotOrgMappingInterface) {
+      $parts = [
+        'entity_type_id' => $parts->getTargetEntityTypeId(),
+        'bundle' => $parts->getTargetBundle(),
+        'schema_type' => $parts->getSchemaType(),
+      ];
+    }
+
     // @todo Determine if patterns should be customizable.
     $patterns = [
       ['entity_type_id', 'bundle', 'field_name'],
diff --git a/src/SchemaDotOrgSchemaTypeManagerInterface.php b/src/SchemaDotOrgSchemaTypeManagerInterface.php
index 80d3f4003..847a4f9ee 100644
--- a/src/SchemaDotOrgSchemaTypeManagerInterface.php
+++ b/src/SchemaDotOrgSchemaTypeManagerInterface.php
@@ -487,16 +487,18 @@ interface SchemaDotOrgSchemaTypeManagerInterface {
    *
    * @param array $settings
    *   An associative array of settings.
-   * @param array $parts
-   *   An associative array of setting name part which includes.
+   * @param \Drupal\schemadotorg\SchemaDotOrgMappingInterface|array $parts
+   *   A Schema.org mapping or an associative array of setting name parts
+   *   which includes.
    *   - schema_type: The Schema.org type.
-   *   - schema_property: The Schema.org property.
    *   - entity_type_id: The entity type id.
+   *   - bundle: The entity bundle.
+   *   - schema_property: The Schema.org property.
    *   - field_name: The field name.
    *
    * @return mixed
    *   A setting from an associative array of settings.
    */
-  public function getSetting(array $settings, array $parts): mixed;
+  public function getSetting(array $settings, SchemaDotOrgMappingInterface|array $parts): mixed;
 
 }
-- 
GitLab