drowl_paragraphs_bs-1.x-dev/modules/drowl_paragraphs_bs_type_layout_slideshow/drowl_paragraphs_bs_type_layout_slideshow.module

modules/drowl_paragraphs_bs_type_layout_slideshow/drowl_paragraphs_bs_type_layout_slideshow.module
<?php

/**
 * @file
 * Drowl_paragraphs_bs_type_layout_slideshow module.
 */

use Drupal\Component\Serialization\Json;
use Drupal\Core\Template\Attribute;

/**
 * Implements hook_preprocess_HOOK().
 */
function drowl_paragraphs_bs_type_layout_slideshow_preprocess_paragraph(&$variables) {
  $bundle = $variables['paragraph']->bundle();
  if ($bundle === 'layout_slideshow' && $variables['view_mode'] == 'preview') {
    // We need a way to tell the layout that it is in layout paragraphs builder
    // edit mode, but we can't introduce new #variables on the render array.
    // As #in_preview isn't used in our case, we use this existing variable:
    // @todo If we can one day add a new #variable for this, better do that.
    $variables['content']['regions']['#in_preview'] = TRUE;
  }
}

/**
 * Implements hook_preprocess_HOOK().
 */
function drowl_paragraphs_bs_type_layout_slideshow_preprocess_layout(&$variables) {
  // Add flag to determine if the layout is currently in a "preview"/form-mode
  // (especially while in edit using layout_paragraphs module).
  // Layout Paragraphs module support:
  if (\Drupal::service('module_handler')->moduleExists('layout_paragraphs')) {
    // Ensure each layout_paragraphs builder region is rendered, even if empty:
    // @see https://www.drupal.org/project/drowl_layouts_bs/issues/3294075
    if (!empty($variables['layout'])) {
      $defaultRegion = $variables['layout']->getDefaultRegion();
      $hasDefaultRegion = !empty($defaultRegion);
      // @improve: If this works reliably enough, we might remove these comments in the future:
      // These are the other ideas we had to check if we're in layout builder mode:
      // - This was the original way, but doesn't work with translation forms:
      // @see https://www.drupal.org/project/drowl_paragraphs_bs/issues/3549241
      // $hasLayoutParagraphsBuilderAttached = !empty($variables['content'][$defaultRegion]['#attached']['drupalSettings']['lpBuilder']);
      // - Another alternative that would even be better than the current hack, but we're not yet sure if it will work in all cases:
      // $isLayoutParagraphsBuilder = $hasDefaultRegion && $variables['content'][$defaultRegion]['#paragraph_view_mode'] === 'preview';
      // So for now we use the following and hope it's reliable:
      $isLayoutParagraphsBuilder = $hasDefaultRegion && !empty($variables['content'][$defaultRegion]['#attributes']['data-lpb-ui-id']);
      if ($isLayoutParagraphsBuilder) {
        // This is a layout paragraphs builder (edit mode).
        // Set a layout twig variable to implicate we need to force rendering
        // empty regions:
        $variables['drowl_paragraphs_is_layout_paragraphs_builder'] = TRUE;
      }
    }
  }

  $slideshowLayouts = [
    'drowl_paragraphs_bs_slideshow__custom',
    'drowl_paragraphs_bs_slideshow__1col',
    'drowl_paragraphs_bs_slideshow__2col',
    'drowl_paragraphs_bs_slideshow__3col',
    'drowl_paragraphs_bs_slideshow__4col',
    'drowl_paragraphs_bs_slideshow__5col',
    'drowl_paragraphs_bs_slideshow__6col',
  ];
  if (in_array($variables['theme_hook_original'], $slideshowLayouts)) {
    // Pass slick settings as data-slick json array to the layouts 'slide'
    // regions region attributes.
    $variables['slideshow_wrapper_attributes'] = new Attribute();
    $slideshow_settings = $variables['settings'];
    $drowl_paragraphs_bs_settings_global_defaults = \Drupal::config('drowl_paragraphs_bs.settings')->get('defaults');
    $drowl_paragraphs_bs_settings_global_defaults_layout_slideshow = $drowl_paragraphs_bs_settings_global_defaults['layout_slideshow'];

    // Define slides to show values for the predefined layouts.
    switch ($variables['theme_hook_original']) {
      case "drowl_paragraphs_bs_slideshow__1col":
        $slideshow_settings['drowl_paragraphs_bs_slideshow_slides_sm'] = 1;
        $slideshow_settings['drowl_paragraphs_bs_slideshow_slides_md'] = 1;
        $slideshow_settings['drowl_paragraphs_bs_slideshow_slides_lg'] = 1;
        break;

      case "drowl_paragraphs_bs_slideshow__2col":
        $slideshow_settings['drowl_paragraphs_bs_slideshow_slides_sm'] = 1;
        $slideshow_settings['drowl_paragraphs_bs_slideshow_slides_md'] = 1;
        $slideshow_settings['drowl_paragraphs_bs_slideshow_slides_lg'] = 2;
        break;

      case "drowl_paragraphs_bs_slideshow__3col":
        $slideshow_settings['drowl_paragraphs_bs_slideshow_slides_sm'] = 1;
        $slideshow_settings['drowl_paragraphs_bs_slideshow_slides_md'] = 2;
        $slideshow_settings['drowl_paragraphs_bs_slideshow_slides_lg'] = 3;
        break;

      case "drowl_paragraphs_bs_slideshow__4col":
        $slideshow_settings['drowl_paragraphs_bs_slideshow_slides_sm'] = 1;
        $slideshow_settings['drowl_paragraphs_bs_slideshow_slides_md'] = 2;
        $slideshow_settings['drowl_paragraphs_bs_slideshow_slides_lg'] = 4;
        break;

      case "drowl_paragraphs_bs_slideshow__5col":
        $slideshow_settings['drowl_paragraphs_bs_slideshow_slides_sm'] = 2;
        $slideshow_settings['drowl_paragraphs_bs_slideshow_slides_md'] = 3;
        $slideshow_settings['drowl_paragraphs_bs_slideshow_slides_lg'] = 5;
        break;

      case "drowl_paragraphs_bs_slideshow__6col":
        $slideshow_settings['drowl_paragraphs_bs_slideshow_slides_sm'] = 2;
        $slideshow_settings['drowl_paragraphs_bs_slideshow_slides_md'] = 4;
        $slideshow_settings['drowl_paragraphs_bs_slideshow_slides_lg'] = 6;
        break;
    }

    // Add some default classes and attributes on the (.slick) wrapper.
    $variables['slideshow_wrapper_attributes']->addClass([
      'slick--drowl-paragraphs-slideshow-layout',
    ]);

    if (empty($variables['in_preview'])) {
      // Add these only, if not in preview:
      $variables['slideshow_wrapper_attributes']->addClass(['slick', 'blazy']);
    }

    // Show a warning if breakpoint arent configured.
    // The small breakpoint is not relevant, because its always 0 in this case.
    if (empty($drowl_paragraphs_bs_settings_global_defaults['breakpoint_sizes']['md']) || empty($drowl_paragraphs_bs_settings_global_defaults['breakpoint_sizes']['lg'])) {
      \Drupal::messenger()->addError(t('You will need to configure the breakpoints on the DROWL Paragraph Settings page for all the slideshow components to work correctly!'));
      \Drupal::logger('drowl_paragraphs_bs_type_layout')->error('You will need to configure the breakpoints on the DROWL Paragraph Settings page for all the slideshow components to work correctly!');
    }

    // For reasons, we need to pass all settings to all breakpoint groups, so
    // put them into vars first.
    // The Slick (UI) module does basically the same, you have to set up
    // nearly all settings in each breakpoint again.
    // So this seems to be a Slick Carousel library flaw.
    $slick_settings_autoplay = !empty($slideshow_settings['drowl_paragraphs_bs_slideshow_autoplay']) ? filter_var($slideshow_settings['drowl_paragraphs_bs_slideshow_autoplay'], FILTER_VALIDATE_BOOLEAN) : !empty($drowl_paragraphs_bs_settings_global_defaults_layout_slideshow['autoplay']);
    $slick_settings_adaptive_height = !empty($slideshow_settings['drowl_paragraphs_bs_slideshow_adaptive_height']) ? filter_var($slideshow_settings['drowl_paragraphs_bs_slideshow_adaptive_height'], FILTER_VALIDATE_BOOLEAN) : !empty($drowl_paragraphs_bs_settings_global_defaults_layout_slideshow['auto_height']);
    $slick_settings_arrows = !empty($slideshow_settings['drowl_paragraphs_bs_slideshow_arrows']) ? filter_var($slideshow_settings['drowl_paragraphs_bs_slideshow_arrows'], FILTER_VALIDATE_BOOLEAN) : !empty($drowl_paragraphs_bs_settings_global_defaults_layout_slideshow['navigation_arrows']);
    $slick_settings_dots = !empty($slideshow_settings['drowl_paragraphs_bs_slideshow_dots']) ? filter_var($slideshow_settings['drowl_paragraphs_bs_slideshow_dots'], FILTER_VALIDATE_BOOLEAN) : !empty($drowl_paragraphs_bs_settings_global_defaults_layout_slideshow['navigation_dots']);
    $slick_settings_infinite = !empty($slideshow_settings['drowl_paragraphs_bs_slideshow_infinite']) ? filter_var($slideshow_settings['drowl_paragraphs_bs_slideshow_infinite'], FILTER_VALIDATE_BOOLEAN) : !empty($drowl_paragraphs_bs_settings_global_defaults_layout_slideshow['infinite']);
    $slick_settings_center_mode = !empty($slideshow_settings['drowl_paragraphs_bs_slideshow_center_mode']) ? filter_var($slideshow_settings['drowl_paragraphs_bs_slideshow_center_mode'], FILTER_VALIDATE_BOOLEAN) : !empty($drowl_paragraphs_bs_settings_global_defaults_layout_slideshow['center_mode']);
    $slick_settings_slides_to_show_sm = (int) ($slideshow_settings['drowl_paragraphs_bs_slideshow_slides_sm'] ?: $drowl_paragraphs_bs_settings_global_defaults_layout_slideshow['visible_elements_sm']);
    $slick_settings_slides_to_show_md = (int) ($slideshow_settings['drowl_paragraphs_bs_slideshow_slides_md'] ?: $drowl_paragraphs_bs_settings_global_defaults_layout_slideshow['visible_elements_md']);
    $slick_settings_slides_to_show_lg = (int) ($slideshow_settings['drowl_paragraphs_bs_slideshow_slides_lg'] ?: $drowl_paragraphs_bs_settings_global_defaults_layout_slideshow['visible_elements_lg']);

    // Static values.
    // Important: Slick requires real bool and integer values, otherwise bad things will happen.
    $slick_settings_rows = 0;
    $slick_settings_mobile_first = TRUE;
    $slick_settings = [
      'autoplay' => $slick_settings_autoplay,
      'adaptiveHeight' => $slick_settings_adaptive_height,
      'arrows' => $slick_settings_arrows,
      'dots' => $slick_settings_dots,
      'infinite' => $slick_settings_infinite,
      'centerMode' => $slick_settings_center_mode,
      'slidesToShow' => $slick_settings_slides_to_show_sm,
      'slidesToScroll' => $slick_settings_slides_to_show_sm,
      'rows' => $slick_settings_rows,
      'mobileFirst' => $slick_settings_mobile_first,
      'responsive' => [
        [
          'breakpoint' => (int) $drowl_paragraphs_bs_settings_global_defaults['breakpoint_sizes']['md'],
          'settings' => [
            'autoplay' => $slick_settings_autoplay,
            'adaptiveHeight' => $slick_settings_adaptive_height,
            'arrows' => $slick_settings_arrows,
            'dots' => $slick_settings_dots,
            'infinite' => $slick_settings_infinite,
            'centerMode' => $slick_settings_center_mode,
            'slidesToShow' => $slick_settings_slides_to_show_md,
            'slidesToScroll' => $slick_settings_slides_to_show_md,
            'rows' => $slick_settings_rows,
            'mobileFirst' => $slick_settings_mobile_first,
          ],
        ],
        [
          'breakpoint' => (int) $drowl_paragraphs_bs_settings_global_defaults['breakpoint_sizes']['lg'],
          'settings' => [
            'autoplay' => $slick_settings_autoplay,
            'adaptiveHeight' => $slick_settings_adaptive_height,
            'arrows' => $slick_settings_arrows,
            'dots' => $slick_settings_dots,
            'infinite' => $slick_settings_infinite,
            'centerMode' => $slick_settings_center_mode,
            'slidesToShow' => $slick_settings_slides_to_show_lg,
            'slidesToScroll' => $slick_settings_slides_to_show_lg,
            'rows' => $slick_settings_rows,
            'mobileFirst' => $slick_settings_mobile_first,
          ],
        ],
      ],
    ];
    if (!empty($slick_settings) && !empty($variables['region_attributes']['slides'])) {
      $variables['region_attributes']['slides']->setAttribute('data-slick', Json::encode($slick_settings));
      // Pass the settings also available to the twig template, so we
      // are able to modify the markup.
      $variables['slideshow_settings'] = $slick_settings;
    }

    // Add flag to determine if the layout is currently in a "preview"/form-mode
    // (especially while in edit using layout_paragraphs module).
    if (\Drupal::service('module_handler')->moduleExists('layout_paragraphs')) {
      // Ensure each layout_paragraphs builder region is rendered, even if
      // empty:
      // @see https://www.drupal.org/project/drowl_layouts_bs/issues/3294075
      if (!empty($variables['layout'])) {
        $defaultRegion = $variables['layout']->getDefaultRegion();
        $hasDefaultRegion = !empty($defaultRegion);
        // Check if this is a layout paragraph:
        // @todo Find a better way to determine this, as this check is quite
        // risky (same in drowl_layouts_bs!):
        $isLayoutParagraphsBuilder = $hasDefaultRegion && !empty($variables['content'][$defaultRegion]['#attached']['drupalSettings']['lpBuilder']);
        if ($isLayoutParagraphsBuilder) {
          // This is a layout paragraphs builder (edit mode).
          // Set a layout twig variable to implicate we need to force rendering
          // empty regions:
          $variables['drowl_paragraphs_layout_in_preview'] = TRUE;
        }
      }
    }
  }
}

/**
 * Implements hook_theme().
 */
function drowl_paragraphs_bs_type_layout_slideshow_theme($existing, $type, $theme, $path) {
  $templates = $path . '/templates';
  return [
    'paragraph__drowl_paragraphs_bs__layout_slideshow' => [
      'base hook' => 'paragraph',
      'path' => $templates,
    ],
  ];
}

/**
 * Implements hook_theme_suggestions_HOOK_alter().
 */
function drowl_paragraphs_bs_type_layout_slideshow_theme_suggestions_paragraph_alter(&$suggestions, $variables) {
  // Our override should be more general than the theme suggestion:
  if (!empty($variables['elements']['#paragraph']) && $variables['elements']['#paragraph']->bundle() == 'layout_slideshow') {
    array_unshift($suggestions, 'paragraph__drowl_paragraphs_bs__layout_slideshow');
  }
}

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

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