htools-8.x-1.x-dev/htools.module

htools.module
<?php

/**
 * @file
 * Contains htools.module.
 */

use Drupal\Core\Routing\RouteMatchInterface;
use Drupal\htools\Plugin\Field\FieldFormatter\EntityReferenceLabelFormatter;
use Drupal\htools\Plugin\Field\FieldFormatter\FileDownloaderFieldFormatter;
use Drupal\Core\Url;
use Drupal\Component\Utility\Html;

/**
 * Implements hook_help().
 */
function htools_help($route_name, RouteMatchInterface $route_match) {
  switch ($route_name) {
    // Main module help for the htools module.
    case 'help.page.htools':
      $output = '';
      $output .= '<h3>' . t('About') . '</h3>';
      $output .= '<p>' . t('Hiberus tools') . '</p>';
      return $output;

    default:
  }

}

/**
 * Implements hook_theme().
 */
function htools_theme($existing, $type, $theme, $path) {
  return [
    'views_view__layout_builder__efr' => [
      'variables' => [
        // For displays, we pass in a dummy array as the first parameter, since
        // $view is an object but the core contextual_preprocess() function only
        // attaches contextual links when the primary theme argument is an array.
        'display' => [
          'view_array' => [],
          'view' => NULL,
          'rows' => [],
          'header' => [],
          'footer' => [],
          'empty' => [],
          'exposed' => [],
          'more' => [],
          'feed_icons' => [],
          'pager' => [],
          'title' => '',
          'attachment_before' => [],
          'attachment_after' => [],
        ],
        'style' => ['view' => NULL, 'options' => NULL, 'rows' => NULL, 'title' => NULL],
        'row' => ['view' => NULL, 'options' => NULL, 'row' => NULL, 'field_alias' => NULL],
        'exposed_form' => ['view' => NULL, 'options' => NULL],
        'pager' => [
          'view' => NULL,
          'options' => NULL,
          'tags' => [],
          'quantity' => 9,
          'element' => 0,
          'parameters' => [],
        ],
      ]
    ],
  ];
}

/**
 * Prepares variables for view templates.
 *
 * Default template: views-view--layout-builder--efr.html.twig.
 *
 * @param array $variables
 *   An associative array containing:
 *   - view: The ViewExecutable object.
 */
function template_preprocess_views_view__layout_builder__efr(&$variables) {
  // Load module include file.
  \Drupal::moduleHandler()->loadInclude('views', 'inc', 'views.theme');
  // Call to views.theme.inc template_preprocess_views_view().
  template_preprocess_views_view($variables);
}

/**
 * Implements hook_field_formatter_info_alter().
 */
function htools_field_formatter_info_alter(array &$info) {
  $info['entity_reference_label']['class'] = EntityReferenceLabelFormatter::class;
  if (!empty($info['file_downloader_formatter'])) {
    $info['file_downloader_formatter']['class'] = FileDownloaderFieldFormatter::class;
  }
}

/**
 * Implements hook_theme_registry_alter().
 */
function htools_theme_registry_alter(&$theme_registry) {
  if (!empty($theme_registry['views_view__layout_builder__efr'])) {
    $theme_registry['views_view__layout_builder__efr']['variables']['exposed_region_0'] = [];
    $theme_registry['views_view__layout_builder__efr']['variables']['exposed_region_1'] = [];
    $theme_registry['views_view__layout_builder__efr']['variables']['exposed_region_2'] = [];
    $theme_registry['views_view__layout_builder__efr']['variables']['exposed_region_3'] = [];
    $theme_registry['views_view__layout_builder__efr']['variables']['view'] = [];
    $theme_registry['views_view__layout_builder__efr']['variables']['rows'] = [];
    $theme_registry['views_view__layout_builder__efr']['variables']['pager'] = [];
    $theme_registry['views_view__layout_builder__efr']['variables']['header'] = [];
    $theme_registry['views_view__layout_builder__efr']['variables']['exposed'] = [];
    $theme_registry['views_view__layout_builder__efr']['variables']['attachment_before'] = [];
    $theme_registry['views_view__layout_builder__efr']['variables']['empty'] = [];
    $theme_registry['views_view__layout_builder__efr']['variables']['attachment_after'] = [];
    $theme_registry['views_view__layout_builder__efr']['variables']['footer'] = [];
    $theme_registry['views_view__layout_builder__efr']['variables']['feed_icons'] = [];
    $theme_registry['views_view__layout_builder__efr']['variables']['title_prefix'] = [];
    $theme_registry['views_view__layout_builder__efr']['variables']['title_suffix'] = [];

  }
  // Only override the field template if it comes from core. Allow
  // theme overrides to take precedence.
  if (strpos($theme_registry['field']['path'], 'core') !== 0 && strpos($theme_registry['field']['path'], 'field_label') !== 0) {
    return;
  }
  $module_path = \Drupal::service('extension.path.resolver')->getPath('module', 'htools');
  $theme_registry['field']['path'] = $module_path . '/templates';
}

/**
 * Implements hook_field_formatter_third_party_settings_form().
 *
 * Adds fields for modifying the class and label value for field that have
 * a label
 *
 * @param \Drupal\Core\Field\FormatterInterface $plugin
 * @param \Drupal\Core\Field\FieldDefinitionInterface $field_definition
 * @param \Drupal\Core\Form\FormStateInterface $form_state
 * @param $view_mode
 * @param $form
 *
 * @return array
 */
function htools_field_formatter_third_party_settings_form(\Drupal\Core\Field\FormatterInterface $plugin, \Drupal\Core\Field\FieldDefinitionInterface $field_definition, $view_mode, $form, \Drupal\Core\Form\FormStateInterface $form_state) {
  // Load the formatter settings
  $setting_keys = [
    'enable',
    'items',
    'show_label',
    'hide_label',
    'limit_enable',
    'limit_rule',
  ];

  $providers = $plugin->getThirdPartyProviders();
  if (!in_array('htools', $providers, TRUE)) {
    return;
  }
  $htools_show_more = $plugin->getThirdPartySetting('htools', 'htools_show_more');
  if (!empty($htools_show_more)) {
    $elements['htools_show_more'] = [
      '#type' => 'details',
      '#title' => t('Show more'),
      // Default to open if we have any values to show
      '#open' => $htools_show_more['enable'],
    ];

    $elements['htools_show_more']['enable'] = [
      '#type' => 'checkbox',
      '#title' => t('Enable'),
      '#description' => t('Show items collapsed.'),
      '#default_value' => $htools_show_more['enable'],
    ];

    $elements['htools_show_more']['items'] = [
      '#type' => 'number',
      '#title' => t('Items to show'),
      '#description' => t('Initial items to show.'),
      '#default_value' => $htools_show_more['items'],
    ];

    $elements['htools_show_more']['show_label'] = [
      '#type' => 'textfield',
      '#title' => t('Show label'),
      '#default_value' => $htools_show_more['show_label'],
    ];

    $elements['htools_show_more']['hide_label'] = [
      '#type' => 'textfield',
      '#title' => t('Hide label'),
      '#default_value' => $htools_show_more['hide_label'],
    ];
  }


  $htools_limit = $plugin->getThirdPartySetting('htools', 'htools_limit');
  if (!empty($htools_limit)) {
    $elements['htools_limit'] = [
      '#type' => 'details',
      '#title' => t('Limit multivalue items'),
      // Default to open if we have any values to show
      '#open' => $htools_limit['enable'],
    ];

    $elements['htools_limit']['enable'] = [
      '#type' => 'checkbox',
      '#title' => t('Enable'),
      '#description' => t('Limit the number of items to show.'),
      '#default_value' => $htools_limit['enable'],
    ];

    $elements['htools_limit']['rule'] = [
      '#type' => 'textfield',
      '#title' => t('Limit rule'),
      '#description' => t('Limit the number of items to show.'),
      '#default_value' => $htools_limit['rule'],
    ];
  }


  return $elements;
}


/**
 * Implements hook_preprocess_HOOK() for field templates.
 */
function htools_preprocess_field(&$variables) {
  $variables['has_hidden_items'] = 0;
  if (isset($variables['element']['#third_party_settings']['htools'])) {
    $settings = $variables['element']['#third_party_settings']['htools'];
    if (!empty($settings['htools_show_more']['enable'])) {
      __htools_show_more_preprocess_field($variables);
      return;
    }
    if (!empty($settings['htools_limit']['enable'])) {
      __htools_limit_preprocess_field($variables);
      return;
    }
  }
}

function __htools_limit_preprocess_field(&$variables) {
  $settings = $variables['element']['#third_party_settings']['htools']['htools_limit'];
  $rule = explode(',', $settings['rule']);
  $items = [];
  foreach ($rule as $delta) {
    $items[] = $variables['items'][$delta];
  }
  $variables['items'] = $items;
}

function __htools_show_more_preprocess_field(&$variables) {
  $settings = $variables['element']['#third_party_settings']['htools']['htools_show_more'];
  if (empty($settings['enable'])) {
    return;
  }
  $variables['view_more'] = !empty($settings['show_label']) ? $settings['show_label'] : 'Show more';
  $variables['view_less'] = !empty($settings['hide_label']) ? $settings['hide_label'] : 'Show less';
  $show_items = (int) $settings['items'];
  $items = [];
  $hidden_items = [];
  $cont = 1;
  foreach ($variables['items'] as $item) {
    if ($cont <= $show_items) {
      $items[] = $item;
    }
    else {
      $hidden_items[] = $item;
    }
    $cont++;
  }
  $variables['items'] = $items;
  $variables['hidden_items'] = $hidden_items;
  if (count($hidden_items) > 0) {
    $variables['has_hidden_items'] = 1;
  }
  $variables['#attached']['library'][] = 'htools/field';
}

function htools_module_implements_alter(&$implementations, $hook) {
  if ($hook === 'theme_registry_alter') {
    $group = $implementations['htools'];
    unset($implementations['htools']);
    $implementations['htools'] = $group;
  }

  if ($hook == 'views_pre_render') {
    $group = $implementations['htools'];
    unset($implementations['htools']);
    $implementations['htools'] = $group;
  }
}

/**
 * Implements hook_library_info_alter().
 */
function htools_library_info_alter(&$libraries, $extension) {
  if ($extension === 'core' && !empty($libraries['drupal'])) {
    $libraries['drupal']['dependencies'][] = 'htools/behavior.handler';
  }
  if ($extension === 'big_pipe' && !empty($libraries['big_pipe'])) {
    $libraries['big_pipe']['dependencies'][] = 'htools/big_pipe.observer';
  }
}

/**
 * Implements hook_js_alter().
 */
function htools_js_alter(&$javascript, \Drupal\Core\Asset\AttachedAssetsInterface $assets) {
  $path = \Drupal::moduleHandler()->getModule('htools')->getPath();
  $key = $path . '/js/behavior.handler.js';
  if (!empty($javascript[$key])) {
    $javascript[$key]['weight'] = 0;
    $javascript[$key]['group'] = 0;
  }
  $bp_key = 'core/modules/big_pipe/js/big_pipe.js';
  if (!empty($javascript[$bp_key])) {
    $javascript[$key]['weight'] = -0.00001;
    $javascript[$bp_key]['weight'] = 0;
    $javascript[$bp_key]['group'] = 0;
  }
}

/**
 * Implements hook_theme_suggestions_HOOK().
 */
function htools_theme_suggestions_block_alter(array &$suggestions, array $variables) {
  if (isset($variables['elements']['#in_preview']) && $variables['elements']['#in_preview'] === TRUE) {
    $parts = explode(':', $variables['elements']['#plugin_id']);
    $suggestion = 'block';
    while ($part = array_shift($parts)) {
      $suggestions[] = $suggestion .= '__' . strtr($part, '-', '_') . '__preview';
    }
  }
}

/**
 * Implements hook_theme_suggestions_HOOK().
 */
function htools_theme_suggestions_views_view__layout_builder__efr_alter(array &$suggestions, array $variables) {
  /** @var \Drupal\views\ViewExecutable $view */
  $view = $variables['view'];
  if ($view->getDisplay() instanceof \Drupal\htools\Plugin\views\display\LayoutBuilder) {
    $suggestions[] = 'views_view__layout_builder__efr';
    $suggestions[] = 'views_view__layout_builder__efr__' . $view->id();
    $suggestions[] = 'views_view__layout_builder__efr__' . $view->id() . '__' . $view->current_display;
  }
}

/**
 * Implements hook_views_pre_render().
 */
function htools_views_pre_render($view) {
  if ($view->ajaxEnabled()) {
    $displays = $view->storage->get('display');
    $exposed_form_region = FALSE;

    foreach ($displays as $display) {
      $display_options = $display['display_options'];

      if (isset($display_options['exposed_form']) && $display_options['exposed_form']['type'] == 'exposed_form_region') {
        $exposed_form_region = TRUE;
        $exposed_widgets = $view->exposed_widgets;
        $ajax_views = [];

        foreach ($exposed_widgets as $index => $exposed_widget) {
          $ajax_views['views_dom_id:' . $view->dom_id . '_' . $index] = [
            'region_name' => $exposed_widget['#id'],
            'view_name' => $view->storage->id(),
            'view_display_id' => $view->current_display,
            'view_args' => Html::escape(implode('/', $view->args)),
            'view_path' => Html::escape(\Drupal::service('path.current')->getPath()),
            'view_base_path' => $view->getPath(),
            'view_dom_id' => $view->dom_id,
            // To fit multiple views on a page, the programmer may have
            // overridden the display's pager_element.
            'pager_element' => isset($view->pager) ? $view->pager->getPagerId() : 0,
          ];
        }

        $view->element['#attached']['drupalSettings']['views_region'] = [
          'ajax_path' => Url::fromRoute('views.ajax')->toString(),
          'ajaxViews' => $ajax_views,
        ];
      }
    }

    if ($exposed_form_region == TRUE) {
      $view->element['#attached']['library'][] = 'htools/views.ajax';
    }
  }

  return $view;
}

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

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