simple_tmgmt-1.0.x-dev/src/EventSubscriber/InactiveJobsSubscriber.php

src/EventSubscriber/InactiveJobsSubscriber.php
<?php

namespace Drupal\simple_tmgmt\EventSubscriber;

use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Link;
use Drupal\Core\Messenger\MessengerInterface;
use Drupal\Core\Render\Markup;
use Drupal\Core\Render\RendererInterface;
use Drupal\Core\StringTranslation\StringTranslationTrait;
use Drupal\Core\Url;
use Drupal\tmgmt\JobItemInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\EventDispatcher\Event;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;

/**
 * Class InactiveJobsSubscriber.
 */
class InactiveJobsSubscriber implements EventSubscriberInterface {

  use StringTranslationTrait;

  /**
   * Drupal\Core\Entity\EntityTypeManagerInterface definition.
   *
   * @var \Drupal\Core\Entity\EntityTypeManagerInterface
   */
  protected $entityTypeManager;

  /**
   * Drupal\Core\Render\RendererInterface definition.
   *
   * @var \Drupal\Core\Render\RendererInterface
   */
  protected $renderer;

  /**
   * Drupal\Core\Messenger\MessengerInterface definition.
   *
   * @var \Drupal\Core\Messenger\MessengerInterface
   */
  protected $messenger;

  /**
   * Drupal\Core\Config\ConfigFactoryInterface definition.
   *
   * @var \Drupal\Core\Config\ConfigFactoryInterface
   */
  protected $configFactory;

  /**
   * Constructs a new InactiveJobsSubscriber object.
   */
  public function __construct(
    EntityTypeManagerInterface $entity_type_manager,
    RendererInterface $renderer,
    MessengerInterface $messenger,
    ConfigFactoryInterface $config_factory
  ) {
    $this->entityTypeManager = $entity_type_manager;
    $this->renderer = $renderer;
    $this->messenger = $messenger;
    $this->configFactory = $config_factory;
  }

  /**
   * {@inheritdoc}
   */
  public static function getSubscribedEvents() {
    $events[KernelEvents::REQUEST] = ['kernelRequest', 31];
    return $events;
  }

  /**
   * This method is called when the kernel.request is dispatched.
   *
   * While accessing a node translation page, check if some Job Items
   * are inactive, they could have been canceled in the middle of the process
   * so propose to the user to delete them.
   *
   * This method is favoured to cron as it is more predictable.
   * Auto-delete is not favoured as several translations could be requested
   * for the same node at the same time (several tabs, or different user)
   * and the translation page could be (re)loaded meanwhile.
   *
   * @param \Symfony\Component\EventDispatcher\Event $event
   *   The dispatched event.
   */
  public function kernelRequest(Event $event) {
    if ($event instanceof GetResponseEvent) {
      $request = $event->getRequest();
      $routeName = $request->get('_route');

      // Could be extended to other entity types.
      if ($routeName === 'entity.node.content_translation_overview') {
        /** @var \Drupal\node\NodeInterface $node */
        $node = $request->attributes->get('node');
        try {
          $tmgmtJobItemStorage = $this->entityTypeManager->getStorage('tmgmt_job_item');
          $inactiveJobItems = $tmgmtJobItemStorage->loadByProperties([
            'state' => JobItemInterface::STATE_INACTIVE,
            'item_type' => 'node',
            'item_id' => $node->id(),
          ]);
          if (!empty($inactiveJobItems)) {
            $destinationUrl = Url::fromRoute($routeName, [
              'node' => $node->id(),
            ]);
            $deleteUrl = Url::fromRoute('simple_tmgmt.job_delete', [
              'entity_type_id' => 'node',
              'entity_id' => $node->id(),
            ], [
              'query' => [
                'destination' => $destinationUrl->toString(),
              ],
            ]);
            $config = $this->configFactory->get('simple_tmgmt.settings');
            $deleteLinkLabel = $config->get('delete_inactive_jobs_link_label');
            $deleteLink = Link::fromTextAndUrl($deleteLinkLabel, $deleteUrl)->toRenderable();
            $deleteLinkMarkup = $this->renderer->renderRoot($deleteLink);
            $deleteMessage = Markup::create($config->get('delete_inactive_jobs_message') . ' ' . $deleteLinkMarkup);
            $this->messenger->addWarning($deleteMessage);
          }
        }
        catch (\Exception $exception) {
          $this->messenger->addError($exception->getMessage());
        }
      }
    }
  }

}

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

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