You are here

public function RadioactivityProcessor::queueProcessIncidents in Radioactivity 4.0.x

Same name and namespace in other branches
  1. 8.3 src/RadioactivityProcessor.php \Drupal\radioactivity\RadioactivityProcessor::queueProcessIncidents()

Queue processing of Radioactivity emission incidents.

Parameters

string $entityType: Incident entity type.

\Drupal\radioactivity\IncidentInterface[][] $entityIncidents: Radioactivity incidents grouped per entity ID (1st) and incident ID (2nd).

Overrides RadioactivityProcessorInterface::queueProcessIncidents

File

src/RadioactivityProcessor.php, line 442

Class

RadioactivityProcessor
Processes Radioactivity incidents and and energy decay.

Namespace

Drupal\radioactivity

Code

public function queueProcessIncidents($entityType, array $entityIncidents) {

  /** @var \Drupal\Core\Entity\ContentEntityInterface[] $entities */
  $entities = $this->entityTypeManager
    ->getStorage($entityType)
    ->loadMultiple(array_keys($entityIncidents));
  foreach ($entities as $entity) {
    $hostEntityUpdated = FALSE;

    /** @var \Drupal\radioactivity\RadioactivityInterface[] $referencedEntities */
    $referencedEntities = [];

    /** @var \Drupal\radioactivity\IncidentInterface $incident */
    foreach ($entityIncidents[$entity
      ->id()] as $incident) {

      // Update the energy, but not the timestamp. The latter is used to
      // calculate decay and should not be updated when saving the incident
      // energy.
      if ($incident
        ->getTargetId()) {
        if (!isset($referencedEntities[$incident
          ->getTargetId()])) {
          $referencedEntities[$incident
            ->getTargetId()] = $this->entityTypeManager
            ->getStorage('radioactivity')
            ->load($incident
            ->getTargetId());
        }
        $newEnergy = $referencedEntities[$incident
          ->getTargetId()]
          ->getEnergy() + $incident
          ->getEnergy();
        $referencedEntities[$incident
          ->getTargetId()]
          ->setEnergy($newEnergy);
      }
      else {
        $entity
          ->get($incident
          ->getFieldName())->energy += $incident
          ->getEnergy();
        $hostEntityUpdated = TRUE;
      }
    }
    if ($hostEntityUpdated) {
      if ($entity
        ->getEntityType()
        ->isRevisionable()) {
        $entity
          ->setNewRevision(FALSE);
      }

      // Set flag so we can identify this entity save as one that just updates
      // the radioactivity value.
      $entity->radioactivityUpdate = TRUE;
      $entity
        ->save();
    }
    if ($referencedEntities) {
      foreach ($referencedEntities as $referencedEntity) {
        $referencedEntity
          ->save();
      }
    }
  }
}