You are here

class EventSubscriber in Scheduler 2.x

Same name and namespace in other branches
  1. 8 tests/modules/scheduler_api_test/src/EventSubscriber.php \Drupal\scheduler_api_test\EventSubscriber

Tests events fired on entity objects.

These events allow modules to react to the Scheduler process being performed. They are all triggered during Scheduler cron processing with the exception of 'pre_publish_immediately' and 'publish_immediately' which are triggered from scheduler_entity_presave().

The node event tests use the 'sticky' and 'promote' fields as a simple way to check the processing. There are extra conditional checks on isPublished() to make the tests stronger so they fail if the calls are in the wrong place.

The media tests cannot use 'sticky' and 'promote' as these fields do not exist, so the media name is altered instead.

To allow this API test module to be enabled interactively (for development and testing) we must avoid unwanted side-effects on other non-test nodes. This is done simply by checking that the titles start with 'API TEST'.

@group scheduler_api_test

Hierarchy

  • class \Drupal\scheduler_api_test\EventSubscriber implements \Symfony\Component\EventDispatcher\EventSubscriberInterface

Expanded class hierarchy of EventSubscriber

1 string reference to 'EventSubscriber'
scheduler_api_test.services.yml in tests/modules/scheduler_api_test/scheduler_api_test.services.yml
tests/modules/scheduler_api_test/scheduler_api_test.services.yml
1 service uses EventSubscriber
scheduler_api_test.event_subscriber in tests/modules/scheduler_api_test/scheduler_api_test.services.yml
Drupal\scheduler_api_test\EventSubscriber

File

tests/modules/scheduler_api_test/src/EventSubscriber.php, line 32

Namespace

Drupal\scheduler_api_test
View source
class EventSubscriber implements EventSubscriberInterface {

  /**
   * {@inheritdoc}
   */
  public static function getSubscribedEvents() {

    // Initialise the array to avoid 'variable is undefined' phpcs error.
    $events = [];

    // The values in the arrays give the function names below.
    // These six events are the originals, dispatched for Nodes.
    $events[SchedulerNodeEvents::PRE_PUBLISH][] = [
      'apiTestNodePrePublish',
    ];
    $events[SchedulerNodeEvents::PUBLISH][] = [
      'apiTestNodePublish',
    ];
    $events[SchedulerNodeEvents::PRE_UNPUBLISH][] = [
      'apiTestNodePreUnpublish',
    ];
    $events[SchedulerNodeEvents::UNPUBLISH][] = [
      'apiTestNodeUnpublish',
    ];
    $events[SchedulerNodeEvents::PRE_PUBLISH_IMMEDIATELY][] = [
      'apiTestNodePrePublishImmediately',
    ];
    $events[SchedulerNodeEvents::PUBLISH_IMMEDIATELY][] = [
      'apiTestNodePublishImmediately',
    ];

    // These six events are dispatched for Media entity types only.
    $events[SchedulerMediaEvents::PRE_PUBLISH][] = [
      'apiTestMediaPrePublish',
    ];
    $events[SchedulerMediaEvents::PUBLISH][] = [
      'apiTestMediaPublish',
    ];
    $events[SchedulerMediaEvents::PRE_UNPUBLISH][] = [
      'apiTestMediaPreUnpublish',
    ];
    $events[SchedulerMediaEvents::UNPUBLISH][] = [
      'apiTestMediaUnpublish',
    ];
    $events[SchedulerMediaEvents::PRE_PUBLISH_IMMEDIATELY][] = [
      'apiTestMediaPrePublishImmediately',
    ];
    $events[SchedulerMediaEvents::PUBLISH_IMMEDIATELY][] = [
      'apiTestMediaPublishImmediately',
    ];

    // These six events are dispatched for Product entity types only.
    $events[SchedulerCommerceproductEvents::PRE_PUBLISH][] = [
      'apiTestProductPrePublish',
    ];
    $events[SchedulerCommerceproductEvents::PUBLISH][] = [
      'apiTestProductPublish',
    ];
    $events[SchedulerCommerceproductEvents::PRE_UNPUBLISH][] = [
      'apiTestProductPreUnpublish',
    ];
    $events[SchedulerCommerceproductEvents::UNPUBLISH][] = [
      'apiTestProductUnpublish',
    ];
    $events[SchedulerCommerceproductEvents::PRE_PUBLISH_IMMEDIATELY][] = [
      'apiTestProductPrePublishImmediately',
    ];
    $events[SchedulerCommerceproductEvents::PUBLISH_IMMEDIATELY][] = [
      'apiTestProductPublishImmediately',
    ];
    return $events;
  }

  /**
   * Operations to perform before Scheduler publishes a node.
   *
   * @param \Drupal\scheduler\Event\SchedulerEvent $event
   *   The scheduler event.
   */
  public function apiTestNodePrePublish(SchedulerEvent $event) {

    /** @var \Drupal\node\Entity\Node $node */
    $node = $event
      ->getNode();

    // Before publishing a node make it sticky.
    if (!$node
      ->isPublished() && strpos($node->title->value, 'API TEST') === 0) {
      $node
        ->setSticky(TRUE);
      $event
        ->setNode($node);
    }
  }

  /**
   * Operations to perform after Scheduler publishes a node.
   *
   * @param \Drupal\scheduler\Event\SchedulerEvent $event
   *   The scheduler event.
   */
  public function apiTestNodePublish(SchedulerEvent $event) {

    /** @var \Drupal\node\Entity\Node $node */
    $node = $event
      ->getNode();

    // After publishing a node promote it to the front page.
    if ($node
      ->isPublished() && strpos($node->title->value, 'API TEST') === 0) {
      $node
        ->setPromoted(TRUE);
      $event
        ->setNode($node);
    }
  }

  /**
   * Operations to perform before Scheduler unpublishes a node.
   *
   * @param \Drupal\scheduler\Event\SchedulerEvent $event
   *   The scheduler event.
   */
  public function apiTestNodePreUnpublish(SchedulerEvent $event) {

    /** @var \Drupal\node\Entity\Node $node */
    $node = $event
      ->getNode();

    // Before unpublishing a node make it unsticky.
    if ($node
      ->isPublished() && strpos($node->title->value, 'API TEST') === 0) {
      $node
        ->setSticky(FALSE);
      $event
        ->setNode($node);
    }
  }

  /**
   * Operations to perform after Scheduler unpublishes a node.
   *
   * @param \Drupal\scheduler\Event\SchedulerEvent $event
   *   The scheduler event.
   */
  public function apiTestNodeUnpublish(SchedulerEvent $event) {

    /** @var \Drupal\node\Entity\Node $node */
    $node = $event
      ->getNode();

    // After unpublishing a node remove it from the front page.
    if (!$node
      ->isPublished() && strpos($node->title->value, 'API TEST') === 0) {
      $node
        ->setPromoted(FALSE);
      $event
        ->setNode($node);
    }
  }

  /**
   * Operations before Scheduler publishes a node immediately not via cron.
   *
   * @param \Drupal\scheduler\Event\SchedulerEvent $event
   *   The scheduler event.
   */
  public function apiTestNodePrePublishImmediately(SchedulerEvent $event) {

    /** @var \Drupal\node\Entity\Node $node */
    $node = $event
      ->getNode();

    // Before publishing immediately set the node to sticky.
    if (!$node
      ->isPromoted() && strpos($node->title->value, 'API TEST') === 0) {
      $node
        ->setSticky(TRUE);
      $event
        ->setNode($node);
    }
  }

  /**
   * Operations after Scheduler publishes a node immediately not via cron.
   *
   * @param \Drupal\scheduler\Event\SchedulerEvent $event
   *   The scheduler event.
   */
  public function apiTestNodePublishImmediately(SchedulerEvent $event) {

    /** @var \Drupal\node\Entity\Node $node */
    $node = $event
      ->getNode();

    // After publishing immediately set the node to promoted and change the
    // title.
    if (!$node
      ->isPromoted() && strpos($node->title->value, 'API TEST') === 0) {
      $node
        ->setTitle('Published immediately')
        ->setPromoted(TRUE);
      $event
        ->setNode($node);
    }
  }

  /**
   * Operations to perform before Scheduler publishes a media item.
   *
   * @param \Drupal\scheduler\Event\SchedulerEvent $event
   *   The scheduler event.
   */
  public function apiTestMediaPrePublish(SchedulerEvent $event) {
    $entity = $event
      ->getEntity();
    if (!$entity
      ->isPublished() && strpos($entity
      ->label(), 'API TEST MEDIA') === 0) {

      // Media entities do not have the 'sticky' and 'promote' fields. Instead
      // we can alter the name, for checking in the test.
      $entity
        ->setName('API TEST MEDIA - changed by "PRE_PUBLISH" event');
      $event
        ->setEntity($entity);
    }
  }

  /**
   * Operations to perform after Scheduler publishes a media item.
   *
   * @param \Drupal\scheduler\Event\SchedulerEvent $event
   *   The scheduler event.
   */
  public function apiTestMediaPublish(SchedulerEvent $event) {
    $entity = $event
      ->getEntity();

    // The name will be changed here only if it has already been changed in the
    // PRE_PUBLISH event function. This will show that both events worked.
    if ($entity
      ->isPublished() && $entity
      ->label() == 'API TEST MEDIA - changed by "PRE_PUBLISH" event') {
      $entity
        ->setName('API TEST MEDIA - altered a second time by "PUBLISH" event');
      $event
        ->setEntity($entity);
    }
  }

  /**
   * Operations to perform before Scheduler unpublishes a media item.
   *
   * @param \Drupal\scheduler\Event\SchedulerEvent $event
   *   The scheduler event.
   */
  public function apiTestMediaPreUnpublish(SchedulerEvent $event) {
    $entity = $event
      ->getEntity();
    if ($entity
      ->isPublished() && strpos($entity
      ->label(), 'API TEST MEDIA') === 0) {

      // Media entities do not have the 'sticky' and 'promote' fields. Instead
      // we can alter the name, for checking in the test.
      $entity
        ->setName('API TEST MEDIA - changed by "PRE_UNPUBLISH" event');
      $event
        ->setEntity($entity);
    }
  }

  /**
   * Operations to perform after Scheduler unpublishes a media item.
   *
   * @param \Drupal\scheduler\Event\SchedulerEvent $event
   *   The scheduler event.
   */
  public function apiTestMediaUnpublish(SchedulerEvent $event) {
    $entity = $event
      ->getEntity();

    // The name will be changed here only if it has already been changed in the
    // PRE_UNPUBLISH event function. This will show that both events worked.
    if (!$entity
      ->isPublished() && $entity
      ->label() == 'API TEST MEDIA - changed by "PRE_UNPUBLISH" event') {
      $entity
        ->setName('API TEST MEDIA - altered a second time by "UNPUBLISH" event');
      $event
        ->setEntity($entity);
    }
  }

  /**
   * Operations before Scheduler publishes a media immediately not via cron.
   *
   * @param \Drupal\scheduler\Event\SchedulerEvent $event
   *   The scheduler event.
   */
  public function apiTestMediaPrePublishImmediately(SchedulerEvent $event) {
    $entity = $event
      ->getEntity();
    if (!$entity
      ->isPublished() && strpos($entity
      ->label(), 'API TEST MEDIA') === 0) {
      $entity
        ->setName('API TEST MEDIA - changed by "PRE_PUBLISH_IMMEDIATELY" event');
      $event
        ->setEntity($entity);
    }
  }

  /**
   * Operations after Scheduler publishes a media immediately not via cron.
   *
   * @param \Drupal\scheduler\Event\SchedulerEvent $event
   *   The scheduler event.
   */
  public function apiTestMediaPublishImmediately(SchedulerEvent $event) {
    $entity = $event
      ->getEntity();

    // The name will be changed here only if it has already been changed in the
    // PRE_PUBLISH_IMMEDIATELY event function, to show that both events worked.
    if ($entity
      ->label() == 'API TEST MEDIA - changed by "PRE_PUBLISH_IMMEDIATELY" event') {
      $entity
        ->setName('API TEST MEDIA - altered a second time by "PUBLISH_IMMEDIATELY" event');
      $event
        ->setEntity($entity);
    }
  }

  /**
   * Operations to perform before Scheduler publishes a commerce product.
   *
   * @param \Drupal\scheduler\Event\SchedulerEvent $event
   *   The scheduler event.
   */
  public function apiTestProductPrePublish(SchedulerEvent $event) {
    $entity = $event
      ->getEntity();
    if (!$entity
      ->isPublished() && strpos($entity
      ->label(), 'API TEST COMMERCE_PRODUCT') === 0) {

      // Product entities do not have the 'sticky' and 'promote' fields. Instead
      // we can alter the name, for checking in the test.
      $entity
        ->setTitle('API TEST COMMERCE_PRODUCT - changed by "PRE_PUBLISH" event');
      $event
        ->setEntity($entity);
    }
  }

  /**
   * Operations to perform after Scheduler publishes a commerce product.
   *
   * @param \Drupal\scheduler\Event\SchedulerEvent $event
   *   The scheduler event.
   */
  public function apiTestProductPublish(SchedulerEvent $event) {
    $entity = $event
      ->getEntity();

    // The name will be changed here only if it has already been changed in the
    // PRE_PUBLISH event function. This will show that both events worked.
    if ($entity
      ->isPublished() && $entity
      ->label() == 'API TEST COMMERCE_PRODUCT - changed by "PRE_PUBLISH" event') {
      $entity
        ->setTitle('API TEST COMMERCE_PRODUCT - altered a second time by "PUBLISH" event');
      $event
        ->setEntity($entity);
    }
  }

  /**
   * Operations to perform before Scheduler unpublishes a commerce product.
   *
   * @param \Drupal\scheduler\Event\SchedulerEvent $event
   *   The scheduler event.
   */
  public function apiTestProductPreUnpublish(SchedulerEvent $event) {
    $entity = $event
      ->getEntity();
    if ($entity
      ->isPublished() && strpos($entity
      ->label(), 'API TEST COMMERCE_PRODUCT') === 0) {
      $entity
        ->setTitle('API TEST COMMERCE_PRODUCT - changed by "PRE_UNPUBLISH" event');
      $event
        ->setEntity($entity);
    }
  }

  /**
   * Operations to perform after Scheduler unpublishes a commerce product.
   *
   * @param \Drupal\scheduler\Event\SchedulerEvent $event
   *   The scheduler event.
   */
  public function apiTestProductUnpublish(SchedulerEvent $event) {
    $entity = $event
      ->getEntity();

    // The name will be changed here only if it has already been changed in the
    // PRE_UNPUBLISH event function. This will show that both events worked.
    if (!$entity
      ->isPublished() && $entity
      ->label() == 'API TEST COMMERCE_PRODUCT - changed by "PRE_UNPUBLISH" event') {
      $entity
        ->setTitle('API TEST COMMERCE_PRODUCT - altered a second time by "UNPUBLISH" event');
      $event
        ->setEntity($entity);
    }
  }

  /**
   * Operations before Scheduler publishes a product immediately not via cron.
   *
   * @param \Drupal\scheduler\Event\SchedulerEvent $event
   *   The scheduler event.
   */
  public function apiTestProductPrePublishImmediately(SchedulerEvent $event) {
    $entity = $event
      ->getEntity();
    if (!$entity
      ->isPublished() && strpos($entity
      ->label(), 'API TEST COMMERCE_PRODUCT') === 0) {
      $entity
        ->setTitle('API TEST COMMERCE_PRODUCT - changed by "PRE_PUBLISH_IMMEDIATELY" event');
      $event
        ->setEntity($entity);
    }
  }

  /**
   * Operations after Scheduler publishes a product immediately not via cron.
   *
   * @param \Drupal\scheduler\Event\SchedulerEvent $event
   *   The scheduler event.
   */
  public function apiTestProductPublishImmediately(SchedulerEvent $event) {
    $entity = $event
      ->getEntity();

    // The name will be changed here only if it has already been changed in the
    // PRE_PUBLISH_IMMEDIATELY event function, to show that both events worked.
    if ($entity
      ->label() == 'API TEST COMMERCE_PRODUCT - changed by "PRE_PUBLISH_IMMEDIATELY" event') {
      $entity
        ->setTitle('API TEST COMMERCE_PRODUCT - altered a second time by "PUBLISH_IMMEDIATELY" event');
      $event
        ->setEntity($entity);
    }
  }

}

Members

Namesort descending Modifiers Type Description Overrides
EventSubscriber::apiTestMediaPrePublish public function Operations to perform before Scheduler publishes a media item.
EventSubscriber::apiTestMediaPrePublishImmediately public function Operations before Scheduler publishes a media immediately not via cron.
EventSubscriber::apiTestMediaPreUnpublish public function Operations to perform before Scheduler unpublishes a media item.
EventSubscriber::apiTestMediaPublish public function Operations to perform after Scheduler publishes a media item.
EventSubscriber::apiTestMediaPublishImmediately public function Operations after Scheduler publishes a media immediately not via cron.
EventSubscriber::apiTestMediaUnpublish public function Operations to perform after Scheduler unpublishes a media item.
EventSubscriber::apiTestNodePrePublish public function Operations to perform before Scheduler publishes a node.
EventSubscriber::apiTestNodePrePublishImmediately public function Operations before Scheduler publishes a node immediately not via cron.
EventSubscriber::apiTestNodePreUnpublish public function Operations to perform before Scheduler unpublishes a node.
EventSubscriber::apiTestNodePublish public function Operations to perform after Scheduler publishes a node.
EventSubscriber::apiTestNodePublishImmediately public function Operations after Scheduler publishes a node immediately not via cron.
EventSubscriber::apiTestNodeUnpublish public function Operations to perform after Scheduler unpublishes a node.
EventSubscriber::apiTestProductPrePublish public function Operations to perform before Scheduler publishes a commerce product.
EventSubscriber::apiTestProductPrePublishImmediately public function Operations before Scheduler publishes a product immediately not via cron.
EventSubscriber::apiTestProductPreUnpublish public function Operations to perform before Scheduler unpublishes a commerce product.
EventSubscriber::apiTestProductPublish public function Operations to perform after Scheduler publishes a commerce product.
EventSubscriber::apiTestProductPublishImmediately public function Operations after Scheduler publishes a product immediately not via cron.
EventSubscriber::apiTestProductUnpublish public function Operations to perform after Scheduler unpublishes a commerce product.
EventSubscriber::getSubscribedEvents public static function