class EventSubscriber in Scheduler 2.x
Same name and namespace in other branches
- 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_testView 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
Name | Modifiers | Type | Description | Overrides |
---|---|---|---|---|
EventSubscriber:: |
public | function | Operations to perform before Scheduler publishes a media item. | |
EventSubscriber:: |
public | function | Operations before Scheduler publishes a media immediately not via cron. | |
EventSubscriber:: |
public | function | Operations to perform before Scheduler unpublishes a media item. | |
EventSubscriber:: |
public | function | Operations to perform after Scheduler publishes a media item. | |
EventSubscriber:: |
public | function | Operations after Scheduler publishes a media immediately not via cron. | |
EventSubscriber:: |
public | function | Operations to perform after Scheduler unpublishes a media item. | |
EventSubscriber:: |
public | function | Operations to perform before Scheduler publishes a node. | |
EventSubscriber:: |
public | function | Operations before Scheduler publishes a node immediately not via cron. | |
EventSubscriber:: |
public | function | Operations to perform before Scheduler unpublishes a node. | |
EventSubscriber:: |
public | function | Operations to perform after Scheduler publishes a node. | |
EventSubscriber:: |
public | function | Operations after Scheduler publishes a node immediately not via cron. | |
EventSubscriber:: |
public | function | Operations to perform after Scheduler unpublishes a node. | |
EventSubscriber:: |
public | function | Operations to perform before Scheduler publishes a commerce product. | |
EventSubscriber:: |
public | function | Operations before Scheduler publishes a product immediately not via cron. | |
EventSubscriber:: |
public | function | Operations to perform before Scheduler unpublishes a commerce product. | |
EventSubscriber:: |
public | function | Operations to perform after Scheduler publishes a commerce product. | |
EventSubscriber:: |
public | function | Operations after Scheduler publishes a product immediately not via cron. | |
EventSubscriber:: |
public | function | Operations to perform after Scheduler unpublishes a commerce product. | |
EventSubscriber:: |
public static | function |