PreExportEvent.php

Namespace

Drupal\Core\DefaultContent

File

core/lib/Drupal/Core/DefaultContent/PreExportEvent.php

View source
<?php

declare (strict_types=1);
namespace Drupal\Core\DefaultContent;

use Drupal\Core\Entity\ContentEntityInterface;
use Drupal\Core\Entity\ContentEntityTypeInterface;
use Symfony\Contracts\EventDispatcher\Event;

/**
 * Event dispatched before an entity is exported as default content.
 *
 * Subscribers to this event can attach callback functions which can be used
 * to export specific fields or field types. When exporting fields that either
 * have that name, or match that data type, callback will be called for each
 * field item with two arguments: the field item, and an object which holds
 * metadata (e.g., dependencies) about the entity being exported. The callback
 * should return an array of exported values for that field item, or NULL if the
 * item should not be exported.
 *
 * Subscribers may also mark specific fields as either not exportable, or
 * as explicitly exportable -- for example, computed fields are not normally
 * exported, but a subscriber could flag a computed field as exportable if
 * circumstances require it.
 */
final class PreExportEvent extends Event {
  
  /**
   * An array of export callbacks, keyed by field type.
   *
   * @var array<string, callable>
   */
  private array $callbacks = [];
  
  /**
   * Whether specific fields (keyed by name) should be exported or not.
   *
   * @var array<string, bool>
   */
  private array $allowList = [];
  public function __construct(public readonly ContentEntityInterface $entity) {
  }
  
  /**
   * Toggles whether a specific entity key should be exported.
   *
   * @param string $key
   *   An entity key, e.g. `uuid` or `langcode`. Can be a regular entity key, or
   *   a revision metadata key.
   * @param bool $export
   *   Whether to export the entity key, even if it is computed.
   */
  public function setEntityKeyExportable(string $key, bool $export = TRUE) : void {
    $entity_type = $this->entity
      ->getEntityType();
    assert($entity_type instanceof ContentEntityTypeInterface);
    if ($entity_type->hasKey($key)) {
      $this->setExportable($entity_type->getKey($key), $export);
    }
    elseif ($entity_type->hasRevisionMetadataKey($key)) {
      $this->setExportable($entity_type->getRevisionMetadataKey($key), $export);
    }
  }
  
  /**
   * Toggles whether a specific field should be exported.
   *
   * @param string $name
   *   The name of the field.
   * @param bool $export
   *   Whether to export the field, even if it is computed.
   */
  public function setExportable(string $name, bool $export = TRUE) : void {
    $this->allowList[$name] = $export;
  }
  
  /**
   * Returns a map of which fields should be exported.
   *
   * @return bool[]
   *   An array whose keys are field names, and the values are booleans
   *   indicating whether the field should be exported, even if it is computed.
   */
  public function getAllowList() : array {
    return $this->allowList;
  }
  
  /**
   * Sets the export callback for a specific field name or data type.
   *
   * @param string $name_or_data_type
   *   A field name or field item data type, like `field_item:image`. If the
   *   callback should run for every field a given type, this should be prefixed
   *   with `field_item:`, which is the Typed Data prefix for field items. If
   *   there is no prefix, this is treated as a field name.
   * @param callable $callback
   *   The callback which should export items of the specified field type. See
   *   the class documentation for details.
   */
  public function setCallback(string $name_or_data_type, callable $callback) : void {
    $this->callbacks[$name_or_data_type] = $callback;
  }
  
  /**
   * Returns the field export callbacks collected by this event.
   *
   * @return callable[]
   *   The export callbacks, keyed by field type.
   */
  public function getCallbacks() : array {
    return $this->callbacks;
  }

}

Classes

Title Deprecated Summary
PreExportEvent Event dispatched before an entity is exported as default content.

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.