You are here

EventSubscriber.php in Scheduler 2.x

Same filename and directory in other branches
  1. 8 tests/modules/scheduler_api_test/src/EventSubscriber.php

File

tests/modules/scheduler_api_test/src/EventSubscriber.php
View source
<?php

namespace Drupal\scheduler_api_test;

use Drupal\scheduler\Event\SchedulerCommerceProductEvents;
use Drupal\scheduler\Event\SchedulerMediaEvents;
use Drupal\scheduler\Event\SchedulerNodeEvents;
use Drupal\scheduler\SchedulerEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

/**
 * 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
 */
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);
    }
  }

}

Classes

Namesort descending Description
EventSubscriber Tests events fired on entity objects.