You are here

class EntityReferenceFieldFormatter in Entity Embed 8

Entity Embed Display reusing entity reference field formatters.

Plugin annotation


@EntityEmbedDisplay(
  id = "entity_reference",
  label = @Translation("Entity Reference"),
  deriver = "Drupal\entity_embed\Plugin\Derivative\FieldFormatterDeriver",
  field_type = "entity_reference",
  supports_image_alt_and_title = TRUE
)

Hierarchy

Expanded class hierarchy of EntityReferenceFieldFormatter

See also

\Drupal\entity_embed\EntityEmbedDisplay\EntityEmbedDisplayInterface

File

src/Plugin/entity_embed/EntityEmbedDisplay/EntityReferenceFieldFormatter.php, line 29

Namespace

Drupal\entity_embed\Plugin\entity_embed\EntityEmbedDisplay
View source
class EntityReferenceFieldFormatter extends FieldFormatterEntityEmbedDisplayBase implements TrustedCallbackInterface {

  /**
   * The configuration factory.
   *
   * @var \Drupal\Core\Config\ConfigFactoryInterface
   */
  protected $configFactory;

  /**
   * Constructs a new EntityReferenceFieldFormatter.
   *
   * @param array $configuration
   *   A configuration array containing information about the plugin instance.
   * @param string $plugin_id
   *   The plugin_id for the plugin instance.
   * @param mixed $plugin_definition
   *   The plugin implementation definition.
   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
   *   The entity type manager service.
   * @param \Drupal\Core\Field\FormatterPluginManager $formatter_plugin_manager
   *   The field formatter plugin manager.
   * @param \Drupal\Core\TypedData\TypedDataManager $typed_data_manager
   *   The typed data manager.
   * @param \Drupal\Core\Language\LanguageManagerInterface $language_manager
   *   The language manager.
   * @param \Drupal\Core\Config\ConfigFactoryInterface|null $config_factory
   *   The configuration factory, or null to get from global container for
   *   backwards compatibility.
   */
  public function __construct(array $configuration, $plugin_id, $plugin_definition, EntityTypeManagerInterface $entity_type_manager, FormatterPluginManager $formatter_plugin_manager, TypedDataManager $typed_data_manager, LanguageManagerInterface $language_manager, ConfigFactoryInterface $config_factory = NULL) {
    parent::__construct($configuration, $plugin_id, $plugin_definition, $entity_type_manager, $formatter_plugin_manager, $typed_data_manager, $language_manager);
    $this->configFactory = $config_factory instanceof ConfigFactoryInterface ? $config_factory : \Drupal::configFactory();
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
    return new static($configuration, $plugin_id, $plugin_definition, $container
      ->get('entity_type.manager'), $container
      ->get('plugin.manager.field.formatter'), $container
      ->get('typed_data_manager'), $container
      ->get('language_manager'), $container
      ->get('config.factory'));
  }

  /**
   * {@inheritdoc}
   */
  public static function trustedCallbacks() {
    return [
      'disableContextualLinks',
      'disableQuickEdit',
    ];
  }

  /**
   * {@inheritdoc}
   */
  public function getFieldDefinition() {
    if (!isset($this->fieldDefinition)) {
      $this->fieldDefinition = parent::getFieldDefinition();
      $this->fieldDefinition
        ->setSetting('target_type', $this
        ->getEntityTypeFromContext());
    }
    return $this->fieldDefinition;
  }

  /**
   * {@inheritdoc}
   */
  public function getFieldValue() {
    return [
      'target_id' => $this
        ->getContextValue('entity')
        ->id(),
    ];
  }

  /**
   * {@inheritdoc}
   */
  protected function isApplicableFieldFormatter() {
    $access = parent::isApplicableFieldFormatter();

    // Don't bother checking if not allowed.
    if ($access
      ->isAllowed()) {
      if ($this
        ->getPluginId() === 'entity_reference:entity_reference_entity_view') {

        // This option disables entity_reference_entity_view plugin for content
        // entity types. If it is truthy then the plugin is enabled for all
        // entity types.
        $mode = $this->configFactory
          ->get('entity_embed.settings')
          ->get('rendered_entity_mode');
        if ($mode) {

          // Return *allowed* object.
          return $access;
        }

        // Only allow this if this is not a content entity type.
        $entity_type_id = $this
          ->getEntityTypeFromContext();
        if ($entity_type_id) {
          $definition = $this->entityTypeManager
            ->getDefinition($entity_type_id);
          return $access
            ->andIf(AccessResult::allowedIf(!$definition
            ->entityClassImplements(ContentEntityInterface::class)));
        }
      }
    }
    return $access;
  }

  /**
   * {@inheritdoc}
   */
  public function build() {
    $build = parent::build();

    // Early return if this derived plugin is not using an EntityViewBuilder.
    // @see \Drupal\Core\Entity\EntityViewBuilder::getBuildDefaults()
    if (!isset($build['#view_mode'])) {
      return $build;
    }

    /** @var \Drupal\Core\Entity\EntityInterface $entity */
    $entity = $this
      ->getEntityFromContext();

    // There are a few concerns when rendering an embedded media entity:
    // - entity access checking happens not during rendering but during routing,
    //   and therefore we have to do it explicitly here for the embedded entity.
    $build['#access'] = $entity
      ->access('view', NULL, TRUE);

    // - caching an embedded entity separately is unnecessary; the host entity
    //   is already render cached; plus specific values may be overridden (such
    //   as an `alt` attribute) which would mean this particular rendered
    //   representation is unique to the host entity and hence nonsensical to
    //   cache separately anyway.
    unset($build['#cache']['keys']);

    // - Contextual Links do not make sense for embedded entities; we only allow
    //   the host entity to be contextually managed.
    $build['#pre_render'][] = static::class . '::disableContextualLinks';

    // - Quick Edit does not make sense for embedded entities; we only allow the
    //   host entity to be edited in-place.
    $build['#pre_render'][] = static::class . '::disableQuickEdit';

    // - default styling may break captioned media embeds; attach asset library
    //   to ensure captions behave as intended.
    $build['#attached']['library'][] = 'entity_embed/caption';
    return $build;
  }

  /**
   * Disables Contextual Links for the embedded media by removing its property.
   *
   * @param array $build
   *   The render array for the embedded media.
   *
   * @return array
   *   The updated render array.
   *
   * @see \Drupal\Core\Entity\EntityViewBuilder::addContextualLinks()
   */
  public static function disableContextualLinks(array $build) {
    unset($build['#contextual_links']);
    return $build;
  }

  /**
   * Disables Quick Edit for the embedded media by removing its attributes.
   *
   * @param array $build
   *   The render array for the embedded media.
   *
   * @return array
   *   The updated render array.
   *
   * @see quickedit_entity_view_alter()
   */
  public static function disableQuickEdit(array $build) {
    unset($build['#attributes']['data-quickedit-entity-id']);
    return $build;
  }

}

Members

Namesort descending Modifiers Type Description Overrides
DependencySerializationTrait::$_entityStorages protected property An array of entity type IDs keyed by the property name of their storages.
DependencySerializationTrait::$_serviceIds protected property An array of service IDs keyed by property name used for serialization.
DependencySerializationTrait::__sleep public function 1
DependencySerializationTrait::__wakeup public function 2
DependencyTrait::$dependencies protected property The object's dependencies.
DependencyTrait::addDependencies protected function Adds multiple dependencies.
DependencyTrait::addDependency protected function Adds a dependency.
EntityEmbedDisplayBase::$attributes public property The attributes on the embedded entity.
EntityEmbedDisplayBase::$context public property The context for the plugin.
EntityEmbedDisplayBase::$entityTypeManager protected property The entity type manager service.
EntityEmbedDisplayBase::$languageManager protected property The language manager.
EntityEmbedDisplayBase::getAttributeValue public function Gets the value for an attribute.
EntityEmbedDisplayBase::getAttributeValues public function Gets the values for all attributes.
EntityEmbedDisplayBase::getConfiguration public function Gets this plugin's configuration. Overrides ConfigurableInterface::getConfiguration
EntityEmbedDisplayBase::getConfigurationValue public function Gets a configuration value.
EntityEmbedDisplayBase::getContextValue public function Gets the value for a defined context.
EntityEmbedDisplayBase::getContextValues public function Gets the values for all defined contexts.
EntityEmbedDisplayBase::getEntityFromContext public function Gets the entity from the current context.
EntityEmbedDisplayBase::getEntityTypeFromContext public function Gets the entity type from the current context.
EntityEmbedDisplayBase::getLangcode public function Gets the current language code.
EntityEmbedDisplayBase::hasAttribute public function Checks if an attribute is set.
EntityEmbedDisplayBase::hasContextValue public function Returns whether or not value is set for a defined context.
EntityEmbedDisplayBase::isValidEntityType protected function Validates that this display plugin applies to the current entity type.
EntityEmbedDisplayBase::setAttributes public function Sets the values for all attributes.
EntityEmbedDisplayBase::setConfiguration public function Sets the configuration for this plugin instance. Overrides ConfigurableInterface::setConfiguration
EntityEmbedDisplayBase::setContextValue public function Sets the value for a defined context.
EntityEmbedDisplayBase::submitConfigurationForm public function Form submission handler. Overrides PluginFormInterface::submitConfigurationForm 1
EntityEmbedDisplayBase::validateConfigurationForm public function Form validation handler. Overrides PluginFormInterface::validateConfigurationForm
EntityReferenceFieldFormatter::$configFactory protected property The configuration factory.
EntityReferenceFieldFormatter::build public function Builds the renderable array for this Entity Embed display plugin. Overrides FieldFormatterEntityEmbedDisplayBase::build
EntityReferenceFieldFormatter::create public static function Creates an instance of the plugin. Overrides FieldFormatterEntityEmbedDisplayBase::create 1
EntityReferenceFieldFormatter::disableContextualLinks public static function Disables Contextual Links for the embedded media by removing its property.
EntityReferenceFieldFormatter::disableQuickEdit public static function Disables Quick Edit for the embedded media by removing its attributes.
EntityReferenceFieldFormatter::getFieldDefinition public function Get the FieldDefinition object required to render this field's formatter. Overrides FieldFormatterEntityEmbedDisplayBase::getFieldDefinition
EntityReferenceFieldFormatter::getFieldValue public function Get the field value required to pass into the field formatter. Overrides FieldFormatterEntityEmbedDisplayBase::getFieldValue 1
EntityReferenceFieldFormatter::isApplicableFieldFormatter protected function Checks if the field formatter is applicable. Overrides FieldFormatterEntityEmbedDisplayBase::isApplicableFieldFormatter
EntityReferenceFieldFormatter::trustedCallbacks public static function Lists the trusted callbacks provided by the implementing class. Overrides TrustedCallbackInterface::trustedCallbacks
EntityReferenceFieldFormatter::__construct public function Constructs a new EntityReferenceFieldFormatter. Overrides FieldFormatterEntityEmbedDisplayBase::__construct 1
FieldFormatterEntityEmbedDisplayBase::$fieldDefinition protected property The field definition.
FieldFormatterEntityEmbedDisplayBase::$fieldFormatter protected property The field formatter.
FieldFormatterEntityEmbedDisplayBase::$formatterPluginManager protected property The field formatter plugin manager.
FieldFormatterEntityEmbedDisplayBase::$typedDataManager protected property The typed data manager.
FieldFormatterEntityEmbedDisplayBase::access public function Indicates whether this Entity Embed display can be used. Overrides EntityEmbedDisplayBase::access 1
FieldFormatterEntityEmbedDisplayBase::buildConfigurationForm public function Form constructor. Overrides EntityEmbedDisplayBase::buildConfigurationForm 2
FieldFormatterEntityEmbedDisplayBase::calculateDependencies public function Calculates dependencies for the configured plugin. Overrides EntityEmbedDisplayBase::calculateDependencies 1
FieldFormatterEntityEmbedDisplayBase::createFieldDefinition protected function Creates a new faux-field definition.
FieldFormatterEntityEmbedDisplayBase::defaultConfiguration public function Gets default configuration for this plugin. Overrides EntityEmbedDisplayBase::defaultConfiguration 1
FieldFormatterEntityEmbedDisplayBase::getFieldFormatter public function Constructs a field formatter. 1
FieldFormatterEntityEmbedDisplayBase::getFieldFormatterId public function Returns the field formatter id. 1
MessengerTrait::$messenger protected property The messenger. 29
MessengerTrait::messenger public function Gets the messenger. 29
MessengerTrait::setMessenger public function Sets the messenger.
PluginBase::$configuration protected property Configuration information passed into the plugin. 1
PluginBase::$pluginDefinition protected property The plugin implementation definition. 1
PluginBase::$pluginId protected property The plugin_id.
PluginBase::DERIVATIVE_SEPARATOR constant A string which is used to separate base plugin IDs from the derivative ID.
PluginBase::getBaseId public function Gets the base_plugin_id of the plugin instance. Overrides DerivativeInspectionInterface::getBaseId
PluginBase::getDerivativeId public function Gets the derivative_id of the plugin instance. Overrides DerivativeInspectionInterface::getDerivativeId
PluginBase::getPluginDefinition public function Gets the definition of the plugin implementation. Overrides PluginInspectionInterface::getPluginDefinition 3
PluginBase::getPluginId public function Gets the plugin_id of the plugin instance. Overrides PluginInspectionInterface::getPluginId
PluginBase::isConfigurable public function Determines if the plugin is configurable.
PluginDependencyTrait::calculatePluginDependencies protected function Calculates and adds dependencies of a specific plugin instance. 1
PluginDependencyTrait::getPluginDependencies protected function Calculates and returns dependencies of a specific plugin instance.
PluginDependencyTrait::moduleHandler protected function Wraps the module handler. 1
PluginDependencyTrait::themeHandler protected function Wraps the theme handler. 1
StringTranslationTrait::$stringTranslation protected property The string translation service. 1
StringTranslationTrait::formatPlural protected function Formats a string containing a count of items.
StringTranslationTrait::getNumberOfPlurals protected function Returns the number of plurals supported by a given language.
StringTranslationTrait::getStringTranslation protected function Gets the string translation service.
StringTranslationTrait::setStringTranslation public function Sets the string translation service to use. 2
StringTranslationTrait::t protected function Translates a string to the current language or to a given language.
TrustedCallbackInterface::THROW_EXCEPTION constant Untrusted callbacks throw exceptions.
TrustedCallbackInterface::TRIGGER_SILENCED_DEPRECATION constant Untrusted callbacks trigger silenced E_USER_DEPRECATION errors.
TrustedCallbackInterface::TRIGGER_WARNING constant Untrusted callbacks trigger E_USER_WARNING errors.