sitewide_alerts-1.0.0/src/SiteAlertListBuilder.php

src/SiteAlertListBuilder.php
<?php

namespace Drupal\sitewide_alerts;

use Drupal\Core\Database\Database;
use Drupal\Core\Datetime\DateFormatterInterface;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Entity\EntityListBuilder;
use Drupal\Core\Entity\EntityStorageInterface;
use Drupal\Core\Entity\EntityTypeInterface;
use Drupal\Core\Form\FormBuilder;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\RequestStack;

/**
 * Provides a list controller for the site alert entity type.
 */
class SiteAlertListBuilder extends EntityListBuilder {

  /**
   * The date formatter service.
   */
  protected DateFormatterInterface $dateFormatter;

  /**
   * The request stack.
   */
  protected RequestStack $requestStack;

  /**
   * The form builder.
   */
  protected FormBuilder $formBuilder;

  /**
   * Constructs a new SiteAlertListBuilder object.
   *
   * @param \Drupal\Core\Entity\EntityTypeInterface $entity_type
   *   The entity type definition.
   * @param \Drupal\Core\Entity\EntityStorageInterface $storage
   *   The entity storage class.
   * @param \Drupal\Core\Datetime\DateFormatterInterface $date_formatter
   *   The date formatter service.
   * @param \Symfony\Component\HttpFoundation\RequestStack $request_stack
   *   The request stack.
   * @param \Drupal\Core\Form\FormBuilder $form_builder
   *   The form builder.
   */
  public function __construct(
    EntityTypeInterface $entity_type,
    EntityStorageInterface $storage,
    DateFormatterInterface $date_formatter,
    RequestStack $request_stack,
    FormBuilder $form_builder
  ) {
    parent::__construct($entity_type, $storage);
    $this->dateFormatter = $date_formatter;
    $this->requestStack = $request_stack;
    $this->formBuilder = $form_builder;
  }

  /**
   * {@inheritdoc}
   */
  public static function createInstance(ContainerInterface $container, EntityTypeInterface $entity_type) {
    return new static(
      $entity_type,
      $container->get('entity_type.manager')->getStorage($entity_type->id()),
      $container->get('date.formatter'),
      $container->get('request_stack'),
      $container->get('form_builder')
    );
  }

  /**
   * {@inheritdoc}
   */
  protected function getEntityIds() {
    $connection = Database::getConnection();
    $query = $this->getStorage()->getQuery()
      ->accessCheck(TRUE)
      ->sort($this->entityType->getKey('id'));

    // Get current request.
    $request = $this->requestStack->getCurrentRequest();

    // Filter by name.
    $name = $request->get('name') ?? '';
    if (!empty($name)) {
      $query->condition('label', '%' . $connection->escapeLike($name) . '%', 'LIKE');
    }

    // Filter by language.
    $language = $request->get('language') ?? '';
    if (!empty($language)) {
      $query->condition('langcode', $language, '=');
    }

    // Filter by status.
    $status = $request->get('status') ?? '';
    if ($status != '') {
      $query->condition('status', $status, '=');
    }

    // Only add the pager if a limit is specified.
    if ($this->limit) {
      $query->pager($this->limit);
    }

    return $query->execute();
  }

  /**
   * {@inheritdoc}
   */
  public function render() {
    $build['form'] = $this->formBuilder->getForm('Drupal\sitewide_alerts\Form\SiteAlertsFilterForm');
    $build['table'] = [
      '#type' => 'table',
      '#header' => $this->buildHeader(),
      '#title' => $this->getTitle(),
      '#rows' => [],
      '#empty' => $this->t('There are no @label yet.', ['@label' => $this->entityType->getPluralLabel()]),
      '#cache' => [
        'contexts' => $this->entityType->getListCacheContexts(),
        'tags' => $this->entityType->getListCacheTags(),
      ],
    ];

    // Get current request.
    $request = $this->requestStack->getCurrentRequest();
    // Get filtered language, if set.
    $filtered_language = $request->get('language') ?? '';

    /** @var \Drupal\sitewide_alerts\Entity\SiteAlert $entity */
    foreach ($this->load() as $entity) {
      if ($row = $this->buildRow($entity)) {
        if (empty($filtered_language) || $entity->language()->getId() == $filtered_language) {
          $build['table']['#rows'][$entity->id() . '-' . $entity->language()
            ->getId()] = $row;
        }
      }
      if ($languages = $entity->getTranslationLanguages(FALSE)) {
        foreach ($languages as $language) {
          if ($entity->hasTranslation($language->getId())) {
            $entity = $entity->getTranslation($language->getId());
            if ($row = $this->buildRow($entity)) {
              if (empty($filtered_language) || $entity->language()->getId() == $filtered_language) {
                $build['table']['#rows'][$entity->id() . '-' . $entity->language()
                  ->getId()] = $row;
              }
            }
          }
        }
      }
    }

    // Only add the pager if a limit is specified.
    if ($this->limit) {
      $build['pager'] = [
        '#type' => 'pager',
      ];
    }

    return $build;
  }

  /**
   * {@inheritdoc}
   */
  public function buildHeader() {
    $header['id'] = $this->t('ID');
    $header['label'] = $this->t('Label');
    $header['alert_type'] = $this->t('Alert type');
    $header['language'] = $this->t('Language');
    $header['status'] = $this->t('Status');
    $header['changed'] = $this->t('Last updated');

    return $header + parent::buildHeader();
  }

  /**
   * {@inheritdoc}
   */
  public function buildRow(EntityInterface $entity) {
    /** @var \Drupal\sitewide_alerts\SiteAlertInterface $entity */
    $row['id'] = $entity->id();
    $row['label'] = $entity->label();
    $row['alert_type'] = $entity->getAlertType() ? $entity->getAlertType()->label() : '';
    $row['language'] = $entity->language()->getName();
    $row['status'] = $entity->get('status')->value ? $this->t('Published') : $this->t('Unpublished');
    $row['changed'] = $entity->getChangedTime() ? $this->dateFormatter->format($entity->getChangedTime()) : '';

    return $row + parent::buildRow($entity);
  }

}

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

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