rng-3.x-dev/src/RngEntityModel.php

src/RngEntityModel.php
<?php

namespace Drupal\rng;

use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\rng\Entity\Registrant;
use Drupal\rng\Entity\RegistrationInterface;
use Drupal\rng\Entity\RuleComponentInterface;
use Drupal\rng\Entity\RuleInterface;
use Drupal\rng\Plugin\Action\CourierTemplateCollection;
use Drupal\courier\Service\IdentityChannelManagerInterface;

/**
 * Enforces RNG model relationships.
 */
class RngEntityModel implements RngEntityModelInterface {

  /**
   * Storage for registration entities.
   *
   * @var \Drupal\Core\Entity\EntityStorageInterface
   */
  protected $registrationStorage;

  /**
   * Storage for registrant entities.
   *
   * @var \Drupal\Core\Entity\EntityStorageInterface
   */
  protected $registrantStorage;

  /**
   * Storage for registration group entities.
   *
   * @var \Drupal\Core\Entity\EntityStorageInterface
   */
  protected $registrationGroupStorage;

  /**
   * Storage for RNG rule entities.
   *
   * @var \Drupal\Core\Entity\EntityStorageInterface
   */
  protected $ruleStorage;

  /**
   * The RNG event manager.
   *
   * @var \Drupal\rng\EventManagerInterface
   */
  protected $eventManager;

  /**
   * The identity channel manager.
   *
   * @var \Drupal\courier\Service\IdentityChannelManagerInterface
   */
  protected $identityChannelManager;

  /**
   * Record operations for relevant RNG entities.
   *
   * These operations are acted on during request termination.
   *
   * @var \Drupal\rng\RngOperationRecord[]
   */
  protected $operationRecords = [];

  /**
   * Constructs a new RngEntityModel object.
   *
   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
   *   The entity type manager.
   * @param \Drupal\rng\EventManagerInterface $event_manager
   *   The RNG event manager.
   * @param \Drupal\courier\Service\IdentityChannelManagerInterface $identity_channel_manager
   *   The identity channel manager.
   */
  public function __construct(EntityTypeManagerInterface $entity_type_manager, EventManagerInterface $event_manager, IdentityChannelManagerInterface $identity_channel_manager) {
    $this->registrationStorage = $entity_type_manager->getStorage('registration');
    $this->registrantStorage = $entity_type_manager->getStorage('registrant');
    $this->registrationGroupStorage = $entity_type_manager->getStorage('registration_group');
    $this->ruleStorage = $entity_type_manager->getStorage('rng_rule');
    $this->eventManager = $event_manager;
    $this->identityChannelManager = $identity_channel_manager;
  }

  /**
   * React to Drupal `hook_entity_insert` or `hook_entity_update` hooks.
   *
   * @param \Drupal\Core\Entity\EntityInterface $entity
   *   The entity object for the entity that is already saved.
   * @param bool $update
   *   Whether this entity is new.
   *
   * @see _rng_entity_postsave();
   */
  public function entityPostSave(EntityInterface $entity, $update = TRUE) {
    if ($entity instanceof RuleInterface) {
      $this->postSaveRngRule($entity);
    }
    if ($entity instanceof RegistrationInterface) {
      $operation_record = new RngOperationRecord();
      $operation = $update ? 'update' : 'insert';
      $operation_record
        ->setOperation($operation)
        ->setEntityTypeId($entity->getEntityTypeId())
        ->setEntityId($entity->id());
      $this->operationRecords[] = $operation_record;
    }
    if ($this->eventManager->isEvent($entity) && $update == FALSE) {
      $event = $this->eventManager->getMeta($entity);
      $event->createDefaultEventMessages();
    }
  }

  /**
   * React to Drupal `hook_entity_predelete` hook.
   *
   * @param \Drupal\Core\Entity\EntityInterface $entity
   *   The entity object for the entity that is about to be deleted.
   *
   * @see hook_entity_predelete();
   */
  public function entityPreDelete(EntityInterface $entity) {
    if (in_array($entity->getEntityType(), $this->identityChannelManager->getIdentityTypes())) {
      $this->deletePerson($entity);
    }

    if ($this->eventManager->isEvent($entity)) {
      $this->deleteRngEvent($entity);
    }

    if ($entity instanceof RuleComponentInterface) {
      $this->deleteRngRuleComponent($entity);
    }
  }

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

  /**
   * Delete related entities when a person entity.
   *
   * @param \Drupal\Core\Entity\EntityInterface $entity
   *   An identity/person entity.
   */
  protected function deletePerson(EntityInterface $entity) {
    // Remove registrant references to this identity.
    $registrant_ids = Registrant::getRegistrantsIdsForIdentity($entity);
    foreach ($this->registrantStorage->loadMultiple($registrant_ids) as $registrant) {
      /** @var \Drupal\rng\Entity\RegistrantInterface $registrant */
      $registrant->clearIdentity();
      $registrant->save();
    }
  }

  /**
   * Delete related entities when an event is deleted.
   *
   * @param \Drupal\Core\Entity\EntityInterface $entity
   *   An RNG event entity.
   */
  protected function deleteRngEvent(EntityInterface $entity) {
    // Don't need to catch exception from getMeta(), it is already checked by
    // the calling method.
    $event_meta = $this->eventManager->getMeta($entity);

    // Delete registrations.
    $registrations = $event_meta->getRegistrations();
    $this->registrationStorage
      ->delete($registrations);

    // Delete groups.
    $groups = $event_meta->getGroups();
    $this->registrationGroupStorage
      ->delete($groups);

    // Delete rules.
    $rules = $event_meta->getRules(NULL, FALSE, NULL);
    $this->ruleStorage
      ->delete($rules);
  }

  /**
   * Update rule scheduler after a rule entity is saved.
   *
   * @param \Drupal\rng\Entity\RuleInterface $entity
   *   An RNG rule entity.
   */
  protected function postSaveRngRule(RuleInterface $entity) {
    if (isset($entity->original)) {
      // Don't continue if rule status didn't change.
      if ($entity->isActive() == $entity->original->isActive()) {
        return;
      }
    }

    foreach ($entity->getConditions() as $condition) {
      if ('rng_rule_scheduler' == $condition->getPluginId()) {
        // Create, update, or delete the associated rule scheduler entity if the
        // rule status has changed.

        /** @var \Drupal\rng\Plugin\Condition\RuleScheduler $plugin */
        $plugin = $condition->createInstance();
        $plugin->updateRuleSchedulerEntity();
        $plugin_configuration = $plugin->getConfiguration();
        $condition->setConfiguration($plugin_configuration);
        $condition->save();
      }
    }
  }

  /**
   * Delete related entities when a rule component entity is deleted.
   *
   * @param \Drupal\rng\Entity\RuleComponentInterface $entity
   *   An RNG rule component entity.
   */
  protected function deleteRngRuleComponent(RuleComponentInterface $entity) {
    // Delete a TemplateCollection if the entity is a component with
    // configuration for 'rng_courier_message'.
    if ('rng_courier_message' == $entity->getPluginId()) {
      $action = $entity->createInstance();
      if ($action instanceof CourierTemplateCollection) {
        $template_collection = $action->getTemplateCollection();
        if ($template_collection) {
          $template_collection->delete();
        }
      }
    }
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc