You are here

class CorrespondingReference in Corresponding Entity References 8.4

Defines a corresponding reference entity.

Plugin annotation


@ConfigEntityType(
  id = "corresponding_reference",
  label = @Translation("Corresponding reference"),
  handlers = {
    "list_builder" = "Drupal\cer\CorrespondingReferenceListBuilder",
    "storage" = "Drupal\cer\CorrespondingReferenceStorage",
    "form" = {
      "add" = "Drupal\cer\Form\CorrespondingReferenceForm",
      "edit" = "Drupal\cer\Form\CorrespondingReferenceForm",
      "delete" = "Drupal\cer\Form\CorrespondingReferenceDeleteForm",
      "sync" = "Drupal\cer\Form\CorrespondingReferenceSyncForm",
    }
  },
  config_prefix = "corresponding_reference",
  admin_permission = "administer cer",
  entity_keys = {
    "id" = "id",
    "label" = "label"
  },
  config_export = {
    "id",
    "label",
    "enabled",
    "first_field",
    "second_field",
    "bundles"
  },
  links = {
    "collection" = "/admin/config/content/cer",
    "edit-form" = "/admin/config/content/cer/{corresponding_reference}",
    "delete-form" = "/admin/config/content/cer/{corresponding_reference}/delete",
    "sync-form" = "/admin/config/content/cer/{corresponding_reference}/sync"
  }
)

Hierarchy

Expanded class hierarchy of CorrespondingReference

File

src/Entity/CorrespondingReference.php, line 48

Namespace

Drupal\cer\Entity
View source
class CorrespondingReference extends ConfigEntityBase implements CorrespondingReferenceInterface {

  /**
   * The corresponding reference machine name.
   *
   * @var string
   */
  public $id;

  /**
   * The corresponding reference label.
   *
   * @var string
   */
  public $label;

  /**
   * The first corresponding field ID.
   *
   * @var string
   */
  public $first_field;

  /**
   * The second corresponding field ID.
   *
   * @var string
   */
  public $second_field;

  /**
   * The corresponding bundles keyed by entity type.
   *
   * Example:
   *   [
   *     'node' => ['article', 'page'],
   *     'commerce_product' => ['default']
   *   ]
   *
   * @var array
   */
  public $bundles;

  /**
   * Whether or not this corresponding reference is enabled.
   *
   * @var bool
   */
  public $enabled;

  /**
   * {@inheritdoc}
   */
  public function id() {
    return $this->id;
  }

  /**
   * {@inheritdoc}
   */
  public function getId() {
    return $this->id;
  }

  /**
   * {@inheritdoc}
   */
  public function setId($id) {
    $this->id = $id;
    return $this;
  }

  /**
   * {@inheritdoc}
   */
  public function getLabel() {
    return $this->label;
  }

  /**
   * {@inheritdoc}
   */
  public function setLabel($label) {
    $this->label = $label;
    return $this;
  }

  /**
   * {@inheritdoc}
   */
  public function getFirstField() {
    return $this->first_field;
  }

  /**
   * {@inheritdoc}
   */
  public function setFirstField($firstField) {
    $this->first_field = $firstField;
    return $this;
  }

  /**
   * {@inheritdoc}
   */
  public function getSecondField() {
    return $this->second_field;
  }

  /**
   * {@inheritdoc}
   */
  public function setSecondField($secondFIeld) {
    $this->second_field = $secondFIeld;
    return $this;
  }

  /**
   * {@inheritdoc}
   */
  public function getBundles() {
    return $this->bundles;
  }

  /**
   * {@inheritdoc}
   */
  public function setBundles(array $bundles) {
    $this->bundles = $bundles;
    return $this;
  }

  /**
   * {@inheritdoc}
   */
  public function isEnabled() {
    return $this->enabled;
  }

  /**
   * {@inheritdoc}
   */
  public function setEnabled($enabled) {
    $this->enabled = $enabled;
    return $this;
  }

  /**
   * {@inheritdoc}
   */
  public function getCorrespondingFields() {
    $first = $this
      ->getFirstField();
    $second = $this
      ->getSecondField();
    $correspondingFields = [];
    if (!empty($first)) {
      $correspondingFields[$first] = $first;
    }
    if (!empty($second)) {
      $correspondingFields[$second] = $second;
    }
    return $correspondingFields;
  }

  /**
   * {@inheritdoc}
   */
  public function hasCorrespondingFields(FieldableEntityInterface $entity) {
    $hasCorrespondingFields = FALSE;
    foreach ($this
      ->getCorrespondingFields() as $field) {
      if ($entity
        ->hasField($field)) {
        $hasCorrespondingFields = TRUE;
        break;
      }
    }
    return $hasCorrespondingFields;
  }

  /**
   * {@inheritdoc}
   */
  public function synchronizeCorrespondingFields(FieldableEntityInterface $entity, $deleted = FALSE) {
    if (!$this
      ->isValid($entity)) {
      return;
    }
    foreach ($this
      ->getCorrespondingFields() as $fieldName) {
      if (!$entity
        ->hasField($fieldName)) {
        continue;
      }
      $differences = $this
        ->calculateDifferences($entity, $fieldName, $deleted);
      $correspondingField = $this
        ->getCorrespondingField($fieldName);

      // Let other modules alter differences.
      \Drupal::moduleHandler()
        ->alter('cer_differences', $entity, $differences, $correspondingField);
      foreach ($differences as $operation => $entities) {

        /** @var FieldableEntityInterface $correspondingEntity */
        foreach ($entities as $correspondingEntity) {
          if ($correspondingEntity) {
            $this
              ->synchronizeCorrespondingField($entity, $correspondingEntity, $correspondingField, $operation);
          }
        }
      }
    }
  }

  /**
   * {@inheritdoc}
   */
  public function isValid(FieldableEntityInterface $entity) {
    $bundles = $this
      ->getBundles();
    $entityTypes = array_keys($bundles);
    $entityType = $entity
      ->getEntityTypeId();
    if (!in_array($entityType, $entityTypes)) {
      return FALSE;
    }
    if (!in_array($entity
      ->bundle(), $bundles[$entityType]) && !in_array('*', $bundles[$entityType])) {
      return FALSE;
    }
    if (!$this
      ->hasCorrespondingFields($entity)) {
      return FALSE;
    }
    return TRUE;
  }

  /**
   * {@inheritdoc}
   */
  public function getCorrespondingField($fieldName) {
    $fields = $this
      ->getCorrespondingFields();
    if (count($fields) == 1) {
      return $fieldName;
    }
    unset($fields[$fieldName]);
    return array_shift($fields);
  }

  /**
   * {@inheritdoc}
   */
  public function synchronizeCorrespondingField(FieldableEntityInterface $entity, FieldableEntityInterface $correspondingEntity, $correspondingFieldName, $operation = NULL) {
    if (is_null($operation)) {
      $operation = CorrespondingReferenceOperations::ADD;
    }
    if (!$correspondingEntity
      ->hasField($correspondingFieldName)) {
      return;
    }
    $field = $correspondingEntity
      ->get($correspondingFieldName);
    $values = $field
      ->getValue();
    $index = NULL;
    foreach ($values as $idx => $value) {
      if ($value['target_id'] == $entity
        ->id()) {
        if ($operation == CorrespondingReferenceOperations::ADD) {
          return;
        }
        $index = $idx;
      }
    }
    $set = FALSE;
    switch ($operation) {
      case CorrespondingReferenceOperations::REMOVE:
        if (!is_null($index)) {
          unset($values[$index]);
          $set = TRUE;
        }
        break;
      case CorrespondingReferenceOperations::ADD:
        $values[] = [
          'target_id' => $entity
            ->id(),
        ];
        $set = TRUE;
        break;
    }
    if ($set) {
      $field
        ->setValue($values);
      $correspondingEntity
        ->save();
    }
  }

  /**
   * Return added and removed entities from the provided field.
   *
   * @param \Drupal\Core\Entity\FieldableEntityInterface $entity
   *   The current entity.
   * @param string $fieldName
   *   The field name to check.
   * @param bool $deleted
   *   Whether the entity is deleted.
   *
   * @return array
   *   The differences keyed by 'added' and 'removed'.
   */
  protected function calculateDifferences(FieldableEntityInterface $entity, $fieldName, $deleted = FALSE) {

    /** @var FieldableEntityInterface $original */
    $original = isset($entity->original) ? $entity->original : NULL;
    $differences = [
      CorrespondingReferenceOperations::ADD => [],
      CorrespondingReferenceOperations::REMOVE => [],
    ];
    if (!$entity
      ->hasField($fieldName)) {
      return $differences;
    }
    $entityField = $entity
      ->get($fieldName);

    // If entity is deleted, remove references to it.
    if ($deleted) {

      /** @var FieldItemInterface $fieldItem */
      foreach ($entityField as $fieldItem) {
        $differences[CorrespondingReferenceOperations::REMOVE][] = $fieldItem->entity;
      }
      return $differences;
    }
    if (empty($original)) {
      foreach ($entityField as $fieldItem) {
        $differences[CorrespondingReferenceOperations::ADD][] = $fieldItem->entity;
      }
      return $differences;
    }
    $originalField = $original
      ->get($fieldName);
    foreach ($entityField as $fieldItem) {
      if (!$this
        ->entityHasValue($original, $fieldName, $fieldItem->target_id)) {
        $differences[CorrespondingReferenceOperations::ADD][] = $fieldItem->entity;
      }
    }
    foreach ($originalField as $fieldItem) {
      if (!$this
        ->entityHasValue($entity, $fieldName, $fieldItem->target_id)) {
        $differences[CorrespondingReferenceOperations::REMOVE][] = $fieldItem->entity;
      }
    }
    return $differences;
  }

  /**
   * Checks if the given entity has the provided corresponding value.
   *
   * @param \Drupal\Core\Entity\FieldableEntityInterface $entity
   *   The entity to check.
   * @param string $fieldName
   *   The field name on the entity to check.
   * @param mixed $id
   *   The corresponding ID to check.
   *
   * @return bool
   *   TRUE if value already exists, FALSE otherwise.
   */
  protected function entityHasValue(FieldableEntityInterface $entity, $fieldName, $id) {
    if (!$entity
      ->hasField($fieldName)) {
      return FALSE;
    }
    foreach ($entity
      ->get($fieldName) as $fieldItem) {
      if ($fieldItem->target_id == $id) {
        return TRUE;
      }
    }
    return FALSE;
  }

}

Members

Namesort descending Modifiers Type Description Overrides
CacheableDependencyTrait::$cacheContexts protected property Cache contexts.
CacheableDependencyTrait::$cacheMaxAge protected property Cache max-age.
CacheableDependencyTrait::$cacheTags protected property Cache tags.
CacheableDependencyTrait::setCacheability protected function Sets cacheability; useful for value object constructors.
ConfigEntityBase::$isUninstalling private property Whether the config is being deleted by the uninstall process.
ConfigEntityBase::$langcode protected property The language code of the entity's default language.
ConfigEntityBase::$originalId protected property The original ID of the configuration entity.
ConfigEntityBase::$status protected property The enabled/disabled status of the configuration entity. 4
ConfigEntityBase::$third_party_settings protected property Third party entity settings.
ConfigEntityBase::$trustedData protected property Trust supplied data and not use configuration schema on save.
ConfigEntityBase::$uuid protected property The UUID for this entity.
ConfigEntityBase::$_core protected property Information maintained by Drupal core about configuration.
ConfigEntityBase::addDependency protected function Overrides \Drupal\Core\Entity\DependencyTrait:addDependency().
ConfigEntityBase::calculateDependencies public function Calculates dependencies and stores them in the dependency property. Overrides ConfigEntityInterface::calculateDependencies 13
ConfigEntityBase::createDuplicate public function Creates a duplicate of the entity. Overrides EntityBase::createDuplicate 1
ConfigEntityBase::disable public function Disables the configuration entity. Overrides ConfigEntityInterface::disable 1
ConfigEntityBase::enable public function Enables the configuration entity. Overrides ConfigEntityInterface::enable
ConfigEntityBase::get public function Returns the value of a property. Overrides ConfigEntityInterface::get
ConfigEntityBase::getCacheTagsToInvalidate public function Returns the cache tags that should be used to invalidate caches. Overrides EntityBase::getCacheTagsToInvalidate 1
ConfigEntityBase::getConfigDependencyName public function Gets the configuration dependency name. Overrides EntityBase::getConfigDependencyName
ConfigEntityBase::getConfigManager protected static function Gets the configuration manager.
ConfigEntityBase::getConfigTarget public function Gets the configuration target identifier for the entity. Overrides EntityBase::getConfigTarget
ConfigEntityBase::getDependencies public function Gets the configuration dependencies. Overrides ConfigEntityInterface::getDependencies
ConfigEntityBase::getOriginalId public function Gets the original ID. Overrides EntityBase::getOriginalId
ConfigEntityBase::getThirdPartyProviders public function Gets the list of third parties that store information. Overrides ThirdPartySettingsInterface::getThirdPartyProviders
ConfigEntityBase::getThirdPartySetting public function Gets the value of a third-party setting. Overrides ThirdPartySettingsInterface::getThirdPartySetting
ConfigEntityBase::getThirdPartySettings public function Gets all third-party settings of a given module. Overrides ThirdPartySettingsInterface::getThirdPartySettings
ConfigEntityBase::getTypedConfig protected function Gets the typed config manager.
ConfigEntityBase::hasTrustedData public function Gets whether on not the data is trusted. Overrides ConfigEntityInterface::hasTrustedData
ConfigEntityBase::invalidateTagsOnDelete protected static function Override to never invalidate the individual entities' cache tags; the config system already invalidates them. Overrides EntityBase::invalidateTagsOnDelete
ConfigEntityBase::invalidateTagsOnSave protected function Override to never invalidate the entity's cache tag; the config system already invalidates it. Overrides EntityBase::invalidateTagsOnSave
ConfigEntityBase::isInstallable public function Checks whether this entity is installable. Overrides ConfigEntityInterface::isInstallable 2
ConfigEntityBase::isNew public function Overrides Entity::isNew(). Overrides EntityBase::isNew
ConfigEntityBase::isUninstalling public function Returns whether this entity is being changed during the uninstall process. Overrides ConfigEntityInterface::isUninstalling
ConfigEntityBase::link public function Deprecated way of generating a link to the entity. See toLink(). Overrides EntityBase::link
ConfigEntityBase::onDependencyRemoval public function Informs the entity that entities it depends on will be deleted. Overrides ConfigEntityInterface::onDependencyRemoval 7
ConfigEntityBase::preDelete public static function Acts on entities before they are deleted and before hooks are invoked. Overrides EntityBase::preDelete 8
ConfigEntityBase::preSave public function Acts on an entity before the presave hook is invoked. Overrides EntityBase::preSave 13
ConfigEntityBase::save public function Saves an entity permanently. Overrides EntityBase::save 1
ConfigEntityBase::set public function Sets the value of a property. Overrides ConfigEntityInterface::set
ConfigEntityBase::setOriginalId public function Sets the original ID. Overrides EntityBase::setOriginalId
ConfigEntityBase::setStatus public function Sets the status of the configuration entity. Overrides ConfigEntityInterface::setStatus
ConfigEntityBase::setThirdPartySetting public function Sets the value of a third-party setting. Overrides ThirdPartySettingsInterface::setThirdPartySetting
ConfigEntityBase::setUninstalling public function
ConfigEntityBase::sort public static function Helper callback for uasort() to sort configuration entities by weight and label. 6
ConfigEntityBase::status public function Returns whether the configuration entity is enabled. Overrides ConfigEntityInterface::status 4
ConfigEntityBase::toArray public function Gets an array of all property values. Overrides EntityBase::toArray 2
ConfigEntityBase::toUrl public function Gets the URL object for the entity. Overrides EntityBase::toUrl
ConfigEntityBase::trustData public function Sets that the data should be trusted. Overrides ConfigEntityInterface::trustData
ConfigEntityBase::unsetThirdPartySetting public function Unsets a third-party setting. Overrides ThirdPartySettingsInterface::unsetThirdPartySetting
ConfigEntityBase::url public function Gets the public URL for this entity. Overrides EntityBase::url
ConfigEntityBase::urlInfo public function Gets the URL object for the entity. Overrides EntityBase::urlInfo
ConfigEntityBase::__construct public function Constructs an Entity object. Overrides EntityBase::__construct 10
ConfigEntityBase::__sleep public function Overrides EntityBase::__sleep 4
CorrespondingReference::$bundles public property The corresponding bundles keyed by entity type.
CorrespondingReference::$enabled public property Whether or not this corresponding reference is enabled.
CorrespondingReference::$first_field public property The first corresponding field ID.
CorrespondingReference::$id public property The corresponding reference machine name.
CorrespondingReference::$label public property The corresponding reference label.
CorrespondingReference::$second_field public property The second corresponding field ID.
CorrespondingReference::calculateDifferences protected function Return added and removed entities from the provided field.
CorrespondingReference::entityHasValue protected function Checks if the given entity has the provided corresponding value.
CorrespondingReference::getBundles public function Gets an array of referenced bundle names keyed by entity ID. Overrides CorrespondingReferenceInterface::getBundles
CorrespondingReference::getCorrespondingField public function Gets the name of the corresponding field of the provided field. Overrides CorrespondingReferenceInterface::getCorrespondingField
CorrespondingReference::getCorrespondingFields public function Gets an array of the corresponding field names. Overrides CorrespondingReferenceInterface::getCorrespondingFields
CorrespondingReference::getFirstField public function Gets the first corresponding reference field id. Overrides CorrespondingReferenceInterface::getFirstField
CorrespondingReference::getId public function Gets the corresponding reference machine name. Overrides CorrespondingReferenceInterface::getId
CorrespondingReference::getLabel public function Gets the corresponding reference label. Overrides CorrespondingReferenceInterface::getLabel
CorrespondingReference::getSecondField public function Gets the second corresponding reference field id. Overrides CorrespondingReferenceInterface::getSecondField
CorrespondingReference::hasCorrespondingFields public function Checks whether the given entity has the configured corresponding reference fields. Overrides CorrespondingReferenceInterface::hasCorrespondingFields
CorrespondingReference::id public function Gets the identifier. Overrides EntityBase::id
CorrespondingReference::isEnabled public function Get whether the corresponding reference is enabled. Overrides CorrespondingReferenceInterface::isEnabled
CorrespondingReference::isValid public function Checks if this corresponding reference is valid for the provided entity. Overrides CorrespondingReferenceInterface::isValid
CorrespondingReference::setBundles public function Sets the array of referenced bundle names keyed by entity ID. Overrides CorrespondingReferenceInterface::setBundles
CorrespondingReference::setEnabled public function Sets whether the corresponding reference is enabled. Overrides CorrespondingReferenceInterface::setEnabled
CorrespondingReference::setFirstField public function Sets the first corresponding reference field ID. Overrides CorrespondingReferenceInterface::setFirstField
CorrespondingReference::setId public function Sets the corresponding reference machine name. Overrides CorrespondingReferenceInterface::setId
CorrespondingReference::setLabel public function Sets the corresponding reference label. Overrides CorrespondingReferenceInterface::setLabel
CorrespondingReference::setSecondField public function Sets the second corresponding reference field ID. Overrides CorrespondingReferenceInterface::setSecondField
CorrespondingReference::synchronizeCorrespondingField public function Synchronizes a single corresponding field on a corresponding entity. Overrides CorrespondingReferenceInterface::synchronizeCorrespondingField
CorrespondingReference::synchronizeCorrespondingFields public function Synchronizes corresponding fields on the given entity. Overrides CorrespondingReferenceInterface::synchronizeCorrespondingFields
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 Aliased as: traitSleep 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. Aliased as: addDependencyTrait
EntityBase::$enforceIsNew protected property Boolean indicating whether the entity should be forced to be new.
EntityBase::$entityTypeId protected property The entity type.
EntityBase::$typedData protected property A typed data object wrapping this entity.
EntityBase::access public function Checks data value access. Overrides AccessibleInterface::access 1
EntityBase::bundle public function Gets the bundle of the entity. Overrides EntityInterface::bundle 1
EntityBase::create public static function Constructs a new entity object, without permanently saving it. Overrides EntityInterface::create
EntityBase::delete public function Deletes an entity permanently. Overrides EntityInterface::delete 2
EntityBase::enforceIsNew public function Enforces an entity to be new. Overrides EntityInterface::enforceIsNew
EntityBase::entityManager Deprecated protected function Gets the entity manager.
EntityBase::entityTypeBundleInfo protected function Gets the entity type bundle info service.
EntityBase::entityTypeManager protected function Gets the entity type manager.
EntityBase::getCacheContexts public function The cache contexts associated with this object. Overrides CacheableDependencyTrait::getCacheContexts
EntityBase::getCacheMaxAge public function The maximum age for which this object may be cached. Overrides CacheableDependencyTrait::getCacheMaxAge
EntityBase::getCacheTags public function The cache tags associated with this object. Overrides CacheableDependencyTrait::getCacheTags
EntityBase::getConfigDependencyKey public function Gets the key that is used to store configuration dependencies. Overrides EntityInterface::getConfigDependencyKey
EntityBase::getEntityType public function Gets the entity type definition. Overrides EntityInterface::getEntityType
EntityBase::getEntityTypeId public function Gets the ID of the type of the entity. Overrides EntityInterface::getEntityTypeId
EntityBase::getListCacheTagsToInvalidate protected function The list cache tags to invalidate for this entity.
EntityBase::getTypedData public function Gets a typed data object for this entity object. Overrides EntityInterface::getTypedData
EntityBase::hasLinkTemplate public function Indicates if a link template exists for a given key. Overrides EntityInterface::hasLinkTemplate
EntityBase::label public function Gets the label of the entity. Overrides EntityInterface::label 6
EntityBase::language public function Gets the language of the entity. Overrides EntityInterface::language 1
EntityBase::languageManager protected function Gets the language manager.
EntityBase::linkTemplates protected function Gets an array link templates. 1
EntityBase::load public static function Loads an entity. Overrides EntityInterface::load
EntityBase::loadMultiple public static function Loads one or more entities. Overrides EntityInterface::loadMultiple
EntityBase::postCreate public function Acts on a created entity before hooks are invoked. Overrides EntityInterface::postCreate 4
EntityBase::postDelete public static function Acts on deleted entities before the delete hook is invoked. Overrides EntityInterface::postDelete 16
EntityBase::postLoad public static function Acts on loaded entities. Overrides EntityInterface::postLoad 2
EntityBase::postSave public function Acts on a saved entity before the insert or update hook is invoked. Overrides EntityInterface::postSave 14
EntityBase::preCreate public static function Changes the values of an entity before it is created. Overrides EntityInterface::preCreate 5
EntityBase::referencedEntities public function Gets a list of entities referenced by this entity. Overrides EntityInterface::referencedEntities 1
EntityBase::toLink public function Generates the HTML for a link to this entity. Overrides EntityInterface::toLink
EntityBase::uriRelationships public function Gets a list of URI relationships supported by this entity. Overrides EntityInterface::uriRelationships
EntityBase::urlRouteParameters protected function Gets an array of placeholders for this entity. 2
EntityBase::uuid public function Gets the entity UUID (Universally Unique Identifier). Overrides EntityInterface::uuid 1
EntityBase::uuidGenerator protected function Gets the UUID generator.
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
RefinableCacheableDependencyTrait::addCacheableDependency public function 1
RefinableCacheableDependencyTrait::addCacheContexts public function
RefinableCacheableDependencyTrait::addCacheTags public function
RefinableCacheableDependencyTrait::mergeCacheMaxAge public function
SynchronizableEntityTrait::$isSyncing protected property Whether this entity is being created, updated or deleted through a synchronization process.
SynchronizableEntityTrait::isSyncing public function
SynchronizableEntityTrait::setSyncing public function