drupalorg-1.0.x-dev/src/EventSubscriber/LeadFormGatedPages.php

src/EventSubscriber/LeadFormGatedPages.php
<?php

namespace Drupal\drupalorg\EventSubscriber;

use Drupal\Core\Messenger\MessengerInterface;
use Drupal\Core\Path\CurrentPathStack;
use Drupal\Core\Routing\TrustedRedirectResponse;
use Drupal\Core\Session\AccountInterface;
use Drupal\Core\Site\Settings;
use Drupal\Core\Url;
use Drupal\user\UserDataInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;

/**
 * Event handler that gates some pages on filling out a lead form.
 */
class LeadFormGatedPages implements EventSubscriberInterface {

  /**
   * AllowedEntities constructor.
   *
   * @param \Drupal\Core\Session\AccountInterface $currentUser
   *   The current user.
   * @param \Drupal\user\UserDataInterface $userData
   *   The user data.
   * @param \Drupal\Core\Path\CurrentPathStack $currentPath
   *   The current route.
   * @param \Drupal\Core\Messenger\MessengerInterface $messenger
   *   The messenger.
   */
  public function __construct(
    private AccountInterface $currentUser,
    private UserDataInterface $userData,
    private CurrentPathStack $currentPath,
    private MessengerInterface $messenger,
  ) {
  }

  /**
   * {@inheritdoc}
   */
  public static function getSubscribedEvents(): array {
    return [
      KernelEvents::REQUEST => [['checkLeadForm']],
    ];
  }

  /**
   * Checks if the page requires a lead form first.
   *
   * @param \Symfony\Component\HttpKernel\Event\RequestEvent $event
   *   The Event to process.
   */
  public function checkLeadForm(RequestEvent $event) {
    $pages_required = Settings::get('drupalorg_pages_lead_form_required');
    $current_path = $this->currentPath->getPath();
    if (isset($pages_required[$current_path])) {
      // Check the session.
      $session = $event->getRequest()->getSession();
      $data = $session->get('drupalorg_lead_forms', []);
      if (!empty($data[$pages_required[$current_path]['form']])) {
        // No redirect needed.
        return;
      }

      // Check the user data.
      if ($this->currentUser->isAuthenticated()) {
        /** @var \Drupal\user\UserDataInterface $user_data */
        $data = $this->userData->get('drupalorg', $this->currentUser->id(), 'lead_forms');
        if (!empty($data[$pages_required[$current_path]['form']])) {
          // No redirect needed.
          return;
        }
      }

      // Check for override.
      if ($event->getRequest()->query->get('override') === $pages_required[$current_path]['override']) {
        return;
      }

      // They have not filled out the lead form, redirect. Setting the message
      // ensures we start a session and the response is not cached.
      $this->messenger->addStatus(t('Please fill out the form on this page to proceed.'), FALSE);
      $event->setResponse(new TrustedRedirectResponse(URL::fromUserInput($pages_required[$current_path]['redirect'])->toString()));
    }
  }

}

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

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