user_dashboard_bootstrap-1.0.2/src/Hook/UserDashboardHooks.php

src/Hook/UserDashboardHooks.php
<?php

namespace Drupal\user_dashboard_bootstrap\Hook;

use Drupal\Component\Utility\Html;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Database\Connection;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Extension\ModuleHandlerInterface;
use Drupal\Core\Hook\Attribute\Hook;
use Drupal\Core\Messenger\MessengerInterface;
use Drupal\Core\Routing\RouteMatchInterface;
use Drupal\Core\StringTranslation\StringTranslationTrait;
use Drupal\filter\FilterPluginManager;
use Drupal\user\Entity\User;

/**
 * Hook implementations for user dashboard bootstrap.
 */
class UserDashboardHooks {
  use StringTranslationTrait;

  /**
   * Constructs a new DataFieldHook object.
   *
   * @param \Drupal\Core\Extension\ModuleHandlerInterface $moduleHandler
   *   The module handler service.
   * @param \Drupal\Core\Config\ConfigFactoryInterface $configFactory
   *   The config factory service.
   * @param \Drupal\Core\Messenger\MessengerInterface $messenger
   *   The message service.
   * @param \Drupal\Core\Database\Connection $connection
   *   The database service.
   * @param \Drupal\filter\FilterPluginManager|null $filterPluginManager
   *   Filter plugin manager.
   */
  public function __construct(
    protected ModuleHandlerInterface $moduleHandler,
    protected ConfigFactoryInterface $configFactory,
    protected MessengerInterface $messenger,
    protected Connection $connection,
    protected ?FilterPluginManager $filterPluginManager = NULL,
  ) {
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container) {
    return new static(
      $container->get('module_handler'),
      $container->get('config.factory'),
      $container->get('messenger'),
      $container->get('database'),
      $container->get('plugin.manager.filter'),
    );
  }

  /**
   * Implements hook_help().
   */
  #[Hook('help')]
  public function help($route_name, RouteMatchInterface $route_match) {
    switch ($route_name) {
      case 'help.page.user_dashboard_bootstrap':
        $text = file_get_contents(__DIR__ . '/../../README.md');
        if (!$this->moduleHandler->moduleExists('markdown')) {
          return '<pre>' . Html::escape($text) . '</pre>';
        }
        else {
          // Use the Markdown filter to render the README.
          $settings = $this->configFactory->get('markdown.settings')->getRawData();
          $config = ['settings' => $settings];
          $filter = $this->filterPluginManager->createInstance('markdown', $config);
          return $filter->process($text, 'en');
        }
    }
    return FALSE;
  }

  /**
   * Implements hook_ENTITY_TYPE_insert() for user entities.
   */
  #[Hook('user_insert')]
  public function userInsert(EntityInterface $entity): void {
    $rowRegions = \Drupal::service('user_dashboard_bootstrap.blocks')->getRegions();
    $regions = [];
    foreach ($rowRegions as $row) {
      $regions = array_merge($regions, array_keys($row));
    }
    $roles = $entity->getRoles(TRUE);
    $config = $this->configFactory->get('user_dashboard_bootstrap.role');
    $uid = $entity->id();
    $insertBlocks = [];
    foreach ($regions as $region) {
      foreach ($roles as $role) {
        $configUserBlocks = $region . '-' . $role;
        if (!empty($blocks = $config->get($configUserBlocks))) {
          foreach ($blocks as $blockId) {
            $insertBlocks[$blockId] = [$blockId, 1, 0, $region, $uid];
          }
        }
      }
    }
    if (!empty($insertBlocks)) {
      foreach ($insertBlocks as $insertBlock) {
        $this->connection
          ->insert('user_dashboard_block')
          ->fields(['delta', 'status', 'weight', 'region', 'uid'])
          ->values($insertBlock)
          ->execute();
      }

    }
  }

  /**
   * Implements hook_cron().
   */
  #[Hook('cron')]
  public function cron(): void {
    $config = $this->configFactory->get('user_dashboard_bootstrap.settings');
    $queueName = 'cron_user_dashboard_email';
    $cid = 'dashboard_cron:time';
    /** @var \Drupal\Core\Queue\QueueFactory $queue_factory */
    $queue_factory = \Drupal::service('queue');
    $cacheFactory = \Drupal::cache();
    if ($cache = $cacheFactory->get($cid)) {
      $lastRunTime = $cache->data;
    }
    else {
      $lastRunTime = strtotime('today midnight');
      $cacheFactory->set($cid, $lastRunTime);
    }
    $cronHour = $config->get('cron_hour') ?: '00:00';
    $scheduledRunTime = strtotime(date('Y-m-d') . ' ' . $cronHour);
    $now = strtotime('now');
    // @todo check time with cron_hour.
    if ($now >= $scheduledRunTime && $lastRunTime < $scheduledRunTime) {
      $cacheFactory->set($cid, $now);
    }
    else {
      // Do nothing if e-mail sent during the day.
      $queue = $queue_factory->get($queueName);
      if ($queue) {
        while ($item = $queue->claimItem()) {
          if ((method_exists($queue, 'processItem'))) {
            $queue->processItem($item->data);
          }
          if ((method_exists($queue, 'deleteItem'))) {
            $queue->deleteItem($item);
          }
        }
      }
      return;
    }
    if ($config->get('cron_email')) {
      $cronEmail = $config->get('user_dashboard_cron_email_block');
      $query = $this->connection->select('user_dashboard_block', 'b');
      $query->leftJoin('users_field_data', 'u', 'b.uid= u.uid');
      $query->fields('b')
        ->condition('u.status', 1)
        ->orderBy('b.region', 'DESC')
        ->orderBy('b.weight', 'DESC');
      if (!empty($cronEmail)) {
        $query->condition('b.delta', $cronEmail, 'IN');
      }
      $result = $query->execute();
      $userDashboards = [];
      global $base_url;
      $logo = $base_url . base_path() . \Drupal::theme()->getActiveTheme()->getLogo();
      $systemSite = $this->configFactory->get('system.site');
      foreach ($result as $record) {
        if (empty($userDashboards[$record->uid])) {
          $user = User::load($record->uid);
          $userDashboards[$record->uid] = [
            '#theme' => 'user_dashboard_cron_email',
            '#uid' => $user->id(),
            '#username' => $user->getDisplayName(),
            '#email' => $user->getEmail(),
            '#subject' => $config->get('user_dashboard_cron_email_subject'),
            '#logo' => $logo,
            '#site_name' => $systemSite->get('name'),
            '#site_email' => $systemSite->get('mail'),
            '#site_slogan' => $systemSite->get('slogan'),
            '#regions' => [],
          ];
        }
        $userDashboards[$record->uid]['blocks'][] = (array) $record;
      }

      if (!empty($userDashboards)) {
        $queue = $queue_factory->get($queueName);
        foreach ($userDashboards as $dashboard) {
          $queue->createItem($dashboard);
        }
      }
    }
  }

}

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

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