schemadotorg_experimental-1.0.x-dev/modules/schemadotorg_identifier/src/SchemaDotOrgIdentifierManager.php

modules/schemadotorg_identifier/src/SchemaDotOrgIdentifierManager.php
<?php

declare(strict_types=1);

namespace Drupal\schemadotorg_identifier;

use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Entity\EntityFieldManagerInterface;
use Drupal\schemadotorg\SchemaDotOrgEntityTypeBuilderInterface;
use Drupal\schemadotorg\SchemaDotOrgMappingInterface;
use Drupal\schemadotorg\SchemaDotOrgSchemaTypeManagerInterface;

/**
 * Schema.org identifier manager.
 */
class SchemaDotOrgIdentifierManager implements SchemaDotOrgIdentifierManagerInterface {

  /**
   * Constructs a SchemaDotOrgIdentifierManager object.
   *
   * @param \Drupal\Core\Config\ConfigFactoryInterface $configFactory
   *   The configuration object factory.
   * @param \Drupal\Core\Entity\EntityFieldManagerInterface $entityFieldManager
   *   The entity field manager.
   * @param \Drupal\schemadotorg\SchemaDotOrgSchemaTypeManagerInterface $schemaTypeManager
   *   The Schema.org schema type manager.
   * @param \Drupal\schemadotorg\SchemaDotOrgEntityTypeBuilderInterface $entityTypeBuilder
   *   The Schema.org entity type builder.
   */
  public function __construct(
    protected ConfigFactoryInterface $configFactory,
    protected EntityFieldManagerInterface $entityFieldManager,
    protected SchemaDotOrgSchemaTypeManagerInterface $schemaTypeManager,
    protected SchemaDotOrgEntityTypeBuilderInterface $entityTypeBuilder,
  ) {}

  /**
   * {@inheritdoc}
   */
  public function mappingInsert(SchemaDotOrgMappingInterface $mapping): void {
    $schema_type = $mapping->getSchemaType();
    $entity_type_id = $mapping->getTargetEntityTypeId();
    $bundle = $mapping->getTargetBundle();

    // Build the field definition.
    $identifier_field_definitions = $this->getMappingFieldDefinitions($mapping);
    $properties = [];
    foreach ($identifier_field_definitions as $identifier_field_definition) {
      // Skip existing base fields.
      if (!empty($identifier_field_definition['base_field'])) {
        continue;
      }

      $field_name = $identifier_field_definition['field_name'];
      $identifier_field_definition += [
        'field_name' => $field_name,
        'type' => 'string',
        'schema_type' => $schema_type,
        'schema_property' => 'identifier:' . $identifier_field_definition['property_id'],
      ];
      $this->entityTypeBuilder->addFieldToEntity($entity_type_id, $bundle, $identifier_field_definition);

      $properties[$field_name] = 'identifier';
    }
  }

  /**
   * {@inheritdoc}
   */
  public function getMappingFieldDefinitions(SchemaDotOrgMappingInterface $mapping): array {
    $config = $this->configFactory->get('schemadotorg_identifier.settings');

    $entity_type_id = $mapping->getTargetEntityTypeId();

    // Get Schema.org type identifier field names.
    $field_names = [];
    $identifier_schema_types = $config->get('schema_types');
    $schema_types_field_names = $this->schemaTypeManager->getSetting($identifier_schema_types, $mapping, ['multiple' => TRUE]) ?? [];
    foreach ($schema_types_field_names as $schema_type_field_names) {
      $field_names += array_combine($schema_type_field_names, $schema_type_field_names);
    }

    // Get Schema.org type identifier field definitions.
    $field_definitions = $config->get('field_definitions');
    $field_definitions = array_intersect_key($field_definitions, $field_names);
    if (empty($field_definitions)) {
      return [];
    }

    // Add defaults to the field definitions.
    $base_field_definitions = $this->entityFieldManager->getBaseFieldDefinitions($entity_type_id);
    foreach ($field_definitions as $field_name => &$field_definition) {
      $field_definition += [
        'field_name' => $field_name,
        'property_id' => $field_name,
        'base_field' => isset($base_field_definitions[$field_name]),
      ];
    }

    return $field_definitions;
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc