improvements-2.x-dev/modules/improvements_views/improvements_views.module

modules/improvements_views/improvements_views.module
<?php

use Drupal\Core\Render\BubbleableMetadata;
use Drupal\Core\Render\Element;
use Drupal\field\FieldStorageConfigInterface;
use Drupal\improvements_views\Plugin\views\argument_default\ExtendedQueryParameter;
use Drupal\improvements_views\Plugin\views\display_extender\ImprovementsDisplayExtender;
use Drupal\improvements_views\Plugin\views\filter\ExtendedDateFilter;
use Drupal\improvements_views\Plugin\views\filter\ExtendedNumericFilter;
use Drupal\views\ViewExecutable;
use Drupal\views\Views;
use Drupal\views_ui\ViewUI;

/**
 * Implements hook_views_plugins_filter_alter().
 */
function improvements_views_views_plugins_filter_alter(array &$plugins): void {
  $plugins['numeric']['class'] = ExtendedNumericFilter::class;
  $plugins['date']['class'] = ExtendedDateFilter::class;
}

/**
 * Implements hook_views_plugins_argument_default_alter().
 */
function improvements_views_views_plugins_argument_default_alter(array &$plugins): void {
  $plugins['query_parameter']['class'] = ExtendedQueryParameter::class;
}

/**
 * Implements hook_field_views_data_alter().
 */
function improvements_views_field_views_data_alter(array &$data, FieldStorageConfigInterface $field_storage): void {
  // Add Views contextual filter "with children" for term fields
  if ($field_storage->getType() == 'entity_reference' && $field_storage->getSetting('target_type') == 'taxonomy_term') {
    foreach ($data as $table_name => $table_data) {
      foreach ($table_data as $field_name => $field_data) {
        if (isset($field_data['argument']) && $field_data['argument']['id'] == 'entity_target_id' && $field_name != 'delta') {
          $data[$table_name][$field_name . '_with_children'] = $field_data;
          $field = &$data[$table_name][$field_name . '_with_children'];
          $field['title'] .= ' (' . t('With children') . ')';
          $field['argument']['id'] = 'term_with_children';
          unset($field['filter']);
          unset($field['sort']);
        }
      }
    }
  }
}

/**
 * Implements hook_views_data().
 */
function improvements_views_views_data(): array {
  $data['views']['block_plugin_area'] = [
    'title' => t('Block by plugin id'),
    'help' => t('Displays block by plugin id.'),
    'area' => [
      'id' => 'block_plugin_area',
    ],
  ];

  return $data;
}

/**
 * Implements hook_views_data_alter().
 */
function improvements_views_views_data_alter(array &$data): void {
  if (isset($data['node_field_data'])) {
    $data['node_field_data']['uid_is_current_user'] = [
      'title' => t('Author is current user'),
      'title short' => t('Author is current user'),
      'real field' => 'uid',
      'sort' => [
        'id' => 'is_current_user',
      ],
    ];
  }

  if (isset($data['comment_field_data'])) {
    $data['comment_field_data']['uid_is_current_user'] = [
      'title' => t('Author is current user'),
      'title short' => t('Author is current user'),
      'real field' => 'uid',
      'sort' => [
        'id' => 'is_current_user',
      ],
    ];
  }
}

/**
 * Implements hook_token_info().
 */
function improvements_views_token_info(): array {
  $info = [];

  $info['tokens']['view']['total-rows-in-current-page'] = [
    'name' => t('Total rows in current page'),
    'description' => t('Total rows in current page'),
  ];

  return $info;
}

/**
 * Implements hook_tokens().
 */
function improvements_views_tokens(string $type, array $tokens, array $data, array $options, BubbleableMetadata $bubbleable_metadata): array {
  $replacements = [];

  // [view:*]
  if ($type == 'view') {
    foreach ($tokens as $name => $original) {
      if ($name == 'total-rows-in-current-page') {
        $view_executable = $data['view']; /** @var ViewExecutable $view_executable */
        $replacements[$original] = count($view_executable->result);
      }
    }
  }

  return $replacements;
}

/**
 * Preprocess function for views-view.html.twig.
 */
function improvements_views_preprocess_views_view(array &$vars): void {
  $view_executable = $vars['view']; /** @var ViewExecutable $view_executable */
  $view_display_extenders = $view_executable->getDisplay()->getExtenders();

  if (!isset($vars['content_attributes'])) {
    $vars['content_attributes'] = [];
  }

  // Add css-class to content wrapper
  if (isset($view_display_extenders['improvements_display_extender'])) {
    $improvements_display_extender = $view_display_extenders['improvements_display_extender']; /** @var ImprovementsDisplayExtender $improvements_display_extender */
    if (!empty($improvements_display_extender->options['content_css_class'])) {
      $view_content_css_class = $improvements_display_extender->options['content_css_class'];

      // Replace [view:*] tokens
      if (str_contains($view_content_css_class, '[view:')) {
        $view_content_css_class = \Drupal::token()->replace($view_content_css_class, [
          'view' => $view_executable,
        ]);
      }

      $vars['content_attributes']['class'][] = $view_content_css_class;
    }
  }
}

/**
 * Implements hook_views_ui_display_top_alter().
 */
function improvements_views_views_ui_display_top_alter(array &$build, ViewUI $view, string $display_id): void {
  foreach (Element::children($build['tabs']) as $key) {
    $display = $view->getDisplay($key);
    $build['tabs'][$key]['#link']['title'] = '(' . $display['display_plugin'] . ') ' . $build['tabs'][$key]['#link']['title'];
  }
}

/**
 * Implements hook_page_ROUTE_NAME_result_alter(): entity.view.collection.
 */
function improvements_views_page_entity_view_collection_result_alter(array &$result): void {
  // Add autofocus to filter input
  if (isset($result['filters']['text'])) {
    $result['filters']['text']["#attributes"]['autofocus'] = 'autofocus';
  }
}

/**
 * Preprocess function for html.html.twig.
 */
function improvements_views_views_preprocess_html(array &$vars): void {
  $current_route = \Drupal::routeMatch()->getRouteObject();
  $current_route_defaults = $current_route->getDefaults();

  if (isset($current_route_defaults['_controller']) && $current_route_defaults['_controller'] == 'Drupal\views\Routing\ViewPageController::handle') {
    $view = Views::getView($current_route_defaults['view_id']);
    $view->setDisplay($current_route_defaults['display_id']);
    $view_display_extenders = $view->getDisplay()->getExtenders();

    if (isset($view_display_extenders['improvements_display_extender'])) {
      $improvements_display_extender = $view_display_extenders['improvements_display_extender']; /** @var ImprovementsDisplayExtender $improvements_display_extender */

      if (!empty($improvements_display_extender->options['page_body_css_class'])) {
        $vars['attributes']['class'] = array_merge(
          $vars['attributes']['class'] ?? [],
          explode(' ', $improvements_display_extender->options['page_body_css_class'])
        );
      }
    }
  }
}

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

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