graphql_core_schema-1.0.x-dev/src/Plugin/GraphQL/SchemaExtension/ImageExtension.php

src/Plugin/GraphQL/SchemaExtension/ImageExtension.php
<?php

namespace Drupal\graphql_core_schema\Plugin\GraphQL\SchemaExtension;

use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Extension\ModuleHandlerInterface;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Drupal\graphql\GraphQL\ResolverBuilder;
use Drupal\graphql\GraphQL\ResolverRegistryInterface;
use Drupal\graphql\Plugin\GraphQL\SchemaExtension\SdlSchemaExtensionPluginBase;
use Drupal\graphql_core_schema\CoreSchemaExtensionInterface;
use Drupal\graphql_core_schema\EntitySchemaHelper;
use Drupal\graphql_core_schema\TypeAwareSchemaExtensionInterface;
use Drupal\image\Plugin\Field\FieldType\ImageItem;
use GraphQL\Type\Definition\EnumType;
use GraphQL\Type\Schema;
use GraphQL\Utils\SchemaPrinter;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Adds additional fields for images.
 *
 * @SchemaExtension(
 *   id = "image",
 *   name = "Image",
 *   description = "Additional fields for images, like image derivatives.",
 *   schema = "core_composable"
 * )
 */
class ImageExtension extends SdlSchemaExtensionPluginBase implements ContainerFactoryPluginInterface, CoreSchemaExtensionInterface, TypeAwareSchemaExtensionInterface {

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
    return new static(
      $configuration,
      $plugin_id,
      $plugin_definition,
      $container->get('module_handler'),
      $container->get('entity_type.manager')
    );
  }

  /**
   * The constructor.
   *
   * @param array $configuration
   *   The plugin configuration array.
   * @param string $pluginId
   *   The plugin id.
   * @param array $pluginDefinition
   *   The plugin definition array.
   * @param \Drupal\Core\Extension\ModuleHandlerInterface $moduleHandler
   *   The module handler service.
   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entityTypeManager
   *   Instance of an entity type manager.
   */
  public function __construct(
    array $configuration,
    $pluginId,
    array $pluginDefinition,
    ModuleHandlerInterface $moduleHandler,
    protected EntityTypeManagerInterface $entityTypeManager,
  ) {
    parent::__construct($configuration, $pluginId, $pluginDefinition, $moduleHandler);
  }

  /**
   * {@inheritdoc}
   */
  public function getEntityTypeDependencies() {
    return ['file'];
  }

  /**
   * {@inheritdoc}
   */
  public function getExtensionDependencies() {
    return [];
  }

  /**
   * {@inheritdoc}
   */
  public function getBaseDefinition() {
    $storage = $this->entityTypeManager->getStorage('image_style');

    $values = [];
    foreach ($storage->loadMultiple() as $imageStyle) {
      $id = $imageStyle->id();
      $value = EntitySchemaHelper::encodeEnumValue($id);
      $values[$value] = [
        'description' => '{' . $id . '} ' . $imageStyle->label(),
      ];
    }

    if (empty($values)) {
      throw new \Exception('Failed to generate ImageStyleId enum because no image styles exist.');
    }

    $schema = new Schema([
      'types' => [
        new EnumType([
          'name' => 'ImageStyleId',
          'values' => $values,
        ]),
      ],
    ]);

    $content = [
      SchemaPrinter::doPrint($schema),
      $this->loadDefinitionFile('base'),
    ];

    return implode("\n", $content);
  }

  /**
   * {@inheritdoc}
   */
  public function getExtensionDefinition() {
    return '';
  }

  /**
   * {@inheritdoc}
   */
  public function getTypeExtensionDefinition(array $types) {
    // Check if the type has been generated at all.
    if (!in_array('FieldItemTypeImage', $types)) {
      return '';
    }

    return $this->loadDefinitionFile('FieldItemTypeImage');
  }

  /**
   * {@inheritdoc}
   */
  public function registerResolvers(ResolverRegistryInterface $registry): void {
    $builder = new ResolverBuilder();

    $registry->addFieldResolver(
      'FieldItemTypeImage',
      'derivative',
      $builder
        ->produce('image_derivative')
        ->map('entity', $builder->callback(function (ImageItem $item) {
          return $item->entity;
        }))
        ->map('style',
          $builder->compose(
            $builder->fromArgument('style'),
            $builder->callback(function ($v) {
              return EntitySchemaHelper::decodeEnumValue($v);
            })
          )
        )
    );

    $registry->addFieldResolver(
      'ImageResource',
      'urlPath',
      $builder->callback(function ($result) {
        return $result['url'] ?? NULL;
      })
    );
  }

}

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

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