commerce_api-8.x-1.x-dev/src/EventSubscriber/ResourceTypeBuildSubscriber.php

src/EventSubscriber/ResourceTypeBuildSubscriber.php
<?php

declare(strict_types=1);

namespace Drupal\commerce_api\EventSubscriber;

use Drupal\commerce_api\Events\CrossBundlesGetFieldsEvent;
use Drupal\commerce_api\Events\JsonapiEvents;
use Drupal\commerce_api\Events\RenamableResourceTypeBuildEvent;
use Drupal\jsonapi\ResourceType\ResourceTypeBuildEvent;
use Drupal\jsonapi\ResourceType\ResourceTypeBuildEvents;
use ICanBoogie\Inflector;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

/**
 * Modifies the Commerce resource types to be less Drupaly.
 */
final class ResourceTypeBuildSubscriber implements EventSubscriberInterface {

  /**
   * The inflector.
   *
   * @var \ICanBoogie\Inflector
   */
  private Inflector $inflector;

  /**
   * Constructs a new ResourceTypeBuildSubscriber object.
   */
  public function __construct() {
    $this->inflector = Inflector::get();
  }

  /**
   * {@inheritdoc}
   */
  public static function getSubscribedEvents() {
    return [
      ResourceTypeBuildEvents::BUILD => 'onResourceTypeBuild',
      JsonapiEvents::CROSS_BUNDLES_GET_FIELDS => 'onCrossBundlesFields',
    ];
  }

  /**
   * Fix broken `type` field renames in Cross Bundles module.
   *
   * @param \Drupal\commerce_api\Events\CrossBundlesGetFieldsEvent $event
   *   The event.
   */
  public function onCrossBundlesFields(CrossBundlesGetFieldsEvent $event) {
    $entity_type_id = $event->getEntityType()->id();
    if (str_starts_with($entity_type_id, 'commerce_')) {
      $fields = $event->getFields();
      foreach ($fields as $field_name => $field) {
        if ($field->getPublicName() === $entity_type_id . '_type') {
          $fields[$field_name] = $field->withPublicName(str_replace('commerce_', '', $field->getPublicName()));
        }
      }
      $event->setFields($fields);
    }
  }

  /**
   * Customizes commerce resource types.
   *
   * @param \Drupal\jsonapi\ResourceType\ResourceTypeBuildEvent $event
   *   The event.
   */
  public function onResourceTypeBuild(ResourceTypeBuildEvent $event): void {
    // Prevent crashes during container rebuilds before decoration is set.
    if (!$event instanceof RenamableResourceTypeBuildEvent) {
      return;
    }
    if (!str_starts_with($event->getResourceTypeName(), 'commerce_')) {
      return;
    }
    // Remove commerce_ prefix and pluralize.
    [$entity_type_id, $bundle] = explode('--', $event->getResourceTypeName());
    $resource_type_name_base = str_replace('commerce_', '', $entity_type_id);

    if ($entity_type_id !== $bundle) {
      $resource_type_bundle = str_replace('commerce_', '', $bundle);
      $resource_type_name = "$resource_type_name_base--$resource_type_bundle";
      $resource_custom_path = $this->inflector->pluralize($resource_type_name_base) . '/' . $resource_type_bundle;
    }
    else {
      $resource_type_name = $resource_type_name_base;
      $resource_custom_path = $this->inflector->pluralize($resource_type_name_base);
    }
    $event->setResourceTypeName(str_replace('_', '-', $resource_type_name));
    $event->setCustomPath('/' . str_replace('_', '-', $resource_custom_path));

    foreach ($event->getFields() as $field) {
      // Disable the internal Drupal identifiers.
      if (str_starts_with($field->getPublicName(), 'drupal_internal__')) {
        $event->disableField($field);
      }
      elseif ($field->getPublicName() === $entity_type_id . '_type') {
        $event->setPublicFieldName($field, str_replace('commerce_', '', $field->getPublicName()));
      }
      elseif ($entity_type_id === 'commerce_order') {
        if ($field->getInternalName() === 'payment_gateway') {
          $event->disableField($field);
        }
        elseif ($field->getInternalName() === 'billing_profile') {
          $event->disableField($field);
        }
        elseif ($field->getInternalName() === 'mail') {
          $event->setPublicFieldName($field, 'email');
        }
      }
      elseif ($entity_type_id === 'commerce_shipment') {
        if ($field->getInternalName() === 'shipping_profile') {
          $event->disableField($field);
        }
      }
    }
  }

}

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

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