You are here

public function LogEventSubscriber::syncBirthChildren in farmOS 2.x

Sync child asset fields to reflect those saved in a birth log.

Parameters

\Drupal\log\Event\LogEvent $event: The log event.

File

modules/log/birth/src/EventSubscriber/LogEventSubscriber.php, line 53

Class

LogEventSubscriber
Sync child asset fields to reflect those saved in a birth log.

Namespace

Drupal\farm_birth\EventSubscriber

Code

public function syncBirthChildren(LogEvent $event) : void {

  // Get the log entity from the event.
  $log = $event->log;

  // If this is not a birth log, bail.
  if ($log
    ->bundle() != 'birth') {
    return;
  }

  // Load mother asset.

  /** @var \Drupal\asset\Entity\AssetInterface $mother */
  $mothers = $log
    ->get('mother')
    ->referencedEntities();
  $mother = reset($mothers);

  // Load children assets.

  /** @var \Drupal\asset\Entity\AssetInterface[] $children */
  $children = $log
    ->get('asset')
    ->referencedEntities();

  // If the log doesn't reference any children, bail.
  if (empty($children)) {
    return;
  }

  // Iterate through the children.
  foreach ($children as $child) {
    $save = FALSE;
    $revision_log = [];

    // If the child is an animal, and their date of birth does not match the
    // timestamp of the birth log, sync it.
    if ($child
      ->bundle() == 'animal' && $child
      ->get('birthdate')->value != $log
      ->get('timestamp')->value) {
      $args = [
        ':child_url' => $child
          ->toUrl()
          ->toString(),
        '%child_name' => $child
          ->label(),
      ];
      $message = $this
        ->t('<a href=":child_url">%child_name</a> date of birth was updated to match their birth log.', $args);
      $this->messenger
        ->addMessage($message);
      $revision_log[] = $message;
      $child->birthdate = $log
        ->get('timestamp')->value;
      $save = TRUE;
    }

    // If a mother is specified, make sure that it is linked as one of the
    // child's parents.
    if (!empty($mother)) {

      // Iterate through the child's parents to see if the mother is linked.
      $mother_linked = FALSE;
      $parents = $child
        ->get('parent')
        ->referencedEntities();
      foreach ($parents as $parent) {
        if ($parent
          ->id() == $mother
          ->id()) {
          $mother_linked = TRUE;
          break;
        }
      }

      // Link to the mother, if not already.
      if (!$mother_linked) {
        $args = [
          ':mother_url' => $mother
            ->toUrl()
            ->toString(),
          '%mother_name' => $mother
            ->label(),
          ':child_url' => $child
            ->toUrl()
            ->toString(),
          '%child_name' => $child
            ->label(),
        ];
        $message = $this
          ->t('<a href=":mother_url">%mother_name</a> added as a parent of <a href=":child_url">%child_name</a>.', $args);
        $this->messenger
          ->addMessage($message);
        $revision_log[] = $message;
        $child->parent[] = [
          'target_id' => $mother
            ->id(),
        ];
        $save = TRUE;
      }
    }

    // Save the child, if necessary.
    if ($save) {
      $revision_log[] = $this
        ->t('Birth log saved: <a href=":birth_url">%birth_label</a>', [
        ':birth_url' => $log
          ->toUrl()
          ->toString(),
        '%birth_label' => $log
          ->label(),
      ]);
      $child
        ->setRevisionLogMessage(implode(" ", $revision_log));
      $child
        ->save();
    }
  }
}