Skip to content

Instantly share code, notes, and snippets.

@cyberlex404
Created January 28, 2019 08:58
Show Gist options
  • Save cyberlex404/44ac48a1470e2a044801f222133bf150 to your computer and use it in GitHub Desktop.
Save cyberlex404/44ac48a1470e2a044801f222133bf150 to your computer and use it in GitHub Desktop.
<?php
namespace Drupal\wa_blogs\EventSubscriber;
use Drupal\Core\Config\ConfigFactory;
use Drupal\Core\Messenger\MessengerInterface;
use Drupal\Core\Queue\QueueFactory;
use Drupal\Core\Utility\Token;
use Drupal\hook_event_dispatcher\Event\Form\FormAlterEvent;
use Drupal\hook_event_dispatcher\Event\Form\FormIdAlterEvent;
use Drupal\node\NodeInterface;
use Drupal\wa_blogs\Event\BlogModerationEvent;
use Drupal\hook_event_dispatcher\Event\Entity\EntityUpdateEvent;
use Drupal\hook_event_dispatcher\HookEventDispatcherInterface;
use Drupal\wa_blogs\Event\BlogModerationRejectedEvent;
use Drupal\wa_blogs\FormAlterHelper;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
/**
* WA Blog event subscriber.
*/
class WABlogSubscriber implements EventSubscriberInterface {
/**
* The messenger.
*
* @var \Drupal\Core\Messenger\MessengerInterface
*/
protected $messenger;
/**
* @var \Drupal\Core\Utility\Token
*/
protected $token;
/**
* @var \Drupal\Core\Config\ConfigFactory
*/
protected $configFactory;
/**
* @var \Drupal\Core\Queue\QueueFactory
*/
protected $queueFactory;
/**
* Constructs event subscriber.
*
* @param \Drupal\Core\Messenger\MessengerInterface $messenger
* The messenger.
* @param \Drupal\Core\Utility\Token $token
* @param \Drupal\Core\Config\ConfigFactory $configFactory
* @param \Drupal\Core\Queue\QueueFactory $queueFactory
*/
public function __construct(MessengerInterface $messenger, Token $token, ConfigFactory $configFactory, QueueFactory $queueFactory) {
$this->messenger = $messenger;
$this->token = $token;
$this->configFactory = $configFactory;
$this->queueFactory = $queueFactory;
}
/**
* Handling an event when a blog is published
*
* @param \Drupal\wa_blogs\Event\BlogModerationEvent $event
*/
public function onBlogPublished(BlogModerationEvent $event) {
/** @var \Drupal\node\NodeInterface $entity */
$entity = $event->getEntity();
$this->messenger->addWarning($event->getEntity()->label());
}
/**
* Handling an event when a blog is rejected
*
* @param \Drupal\wa_blogs\Event\BlogModerationRejectedEvent $event
*/
public function onBlogRejected(BlogModerationRejectedEvent $event) {
/** @var \Drupal\node\NodeInterface $entity */
$entity = $event->getEntity();
$owner = $entity->getOwner();
$config = $this->configFactory->get('wa_blogs.settings');
$notifySettings = $config->get('notifications.rejected');
$data = new \stdClass();
$data->message = $this->token->replace($notifySettings['template']['value'], [
'node' => $entity,],['clear' => TRUE]);
$data->subject = $this->token->replace($notifySettings['subject'],
['node' => $entity,],['clear' => TRUE]);
$data->langcode = $owner->getPreferredLangcode();
$data->to = $owner->getEmail();
$data->key = 'wa-blog-rejected';
$queue = $this->queueFactory->get('wa_notify_mail');
$queueId = $queue->createItem($data);
\Drupal::messenger()->addWarning('Blog has ben Rejected @queue', ['@queue' => $queueId]);
}
public function onBlogAwaitingApproval(BlogModerationEvent $event) {
$this->messenger->addWarning($event->getEntity()->label());
}
public function onEntityUpdate(EntityUpdateEvent $event) {
/** @var \Drupal\Core\Entity\EntityInterface $entity */
$entity = $event->getEntity();
if ($entity->getEntityTypeId() == 'node' && $entity->bundle() == 'blog') {
/** @var \Drupal\node\NodeInterface $entity */
/** @var \Drupal\node\NodeInterface $original */
$original = $event->getOriginalEntity();
if ($entity->hasField('moderation_state') && $original->hasField('moderation_state')) {
$moderation_state = $entity->get('moderation_state')->value;
$original_moderation_state = $original->get('moderation_state')->value;
/** @var \Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher $dispatcher */
$dispatcher = \Drupal::service('event_dispatcher');
$event = new BlogModerationEvent($entity);
if ($original_moderation_state == 'awaiting_approval') {
switch ($moderation_state) {
case 'published' :
$dispatcher->dispatch(BlogModerationEvent::PUBLISHED, $event);
break;
}
}elseif ($original_moderation_state == 'draft') {
switch ($moderation_state) {
case 'awaiting_approval' :
$isWithout = $entity->getOwner()->hasPermission('create blog without moderation');
if ($isWithout) {
$dispatcher->dispatch(BlogModerationEvent::AWAITING_APPROVAL, $event);
}else{
$dispatcher->dispatch(BlogModerationEvent::AWAITING_APPROVAL_FIRST, $event);
}
break;
}
}
}
}
}
/**
* Alter form content_moderation_entity_moderation_form
*
* @param \Drupal\hook_event_dispatcher\Event\Form\FormIdAlterEvent $event
*/
public function onContentModerationFormAlter(FormIdAlterEvent $event) {
$form = &$event->getForm();
$config = $this->configFactory->get('wa_blogs.settings');
$rejectOptions = $config->get("rejected_reason");
$currentUser = \Drupal::currentUser();
// 'use ' . $workflow->id() . ' transition ' . $transition->id()
$form['rejected'] = [
'#type' => 'container',
'#access' => $currentUser->hasPermission('use blogs transition rejected'),
'#states' => [
'visible' => [
':input[name="new_state"]' => [
'value' => 'rejected',
],
],
],
];
$form['rejected']['reason'] = [
'#type' => 'select',
'#title' => t('Rejection reason'),
'#options' => $rejectOptions,
'#states' => [
'required' => [
':input[name="new_state"]' => [
'value' => 'rejected',
],
],
],
];
$form['rejected']['comment'] = [
'#type' => 'textarea',
'#title' => t('Comment'),
];
$form['#submit'][] = '_wa_blogs_moderation_form_submit';
}
/**
* Alter form.
*
* @param \Drupal\hook_event_dispatcher\Event\Form\FormAlterEvent $event
* The event.
*/
public function onAlterForm(FormAlterEvent $event) {
$form = &$event->getForm();
/*
$form['extra_markup'] = [
'#markup' => 'This is really cool markup',
];
*/
}
/**
* content_moderation_entity_moderation_form
* {@inheritdoc}
*/
public static function getSubscribedEvents() {
return [
//KernelEvents::REQUEST => ['onKernelRequest'],
BlogModerationRejectedEvent::REJECTED => ['onBlogRejected'],
HookEventDispatcherInterface::ENTITY_UPDATE => 'onEntityUpdate',
HookEventDispatcherInterface::FORM_ALTER => 'onAlterForm',
'hook_event_dispatcher.form_content_moderation_entity_moderation_form.alter' => 'onContentModerationFormAlter',
];
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment