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;
}
