You are here

public function SlickManager::preRenderSlick in Slick Carousel 8.2

Same name and namespace in other branches
  1. 8 src/SlickManager.php \Drupal\slick\SlickManager::preRenderSlick()

Builds the Slick instance as a structured array ready for ::renderer().

File

src/SlickManager.php, line 98

Class

SlickManager
Implements BlazyManagerInterface, SlickManagerInterface.

Namespace

Drupal\slick

Code

public function preRenderSlick(array $element) {
  $build = $element['#build'];
  unset($element['#build']);
  $settings =& $build['settings'];
  $settings += SlickDefault::htmlSettings();
  $defaults = Slick::defaultSettings();

  // Adds helper class if thumbnail on dots hover provided.
  if (!empty($settings['thumbnail_effect']) && (!empty($settings['thumbnail_style']) || !empty($settings['thumbnail']))) {
    $dots_class[] = 'slick-dots--thumbnail-' . $settings['thumbnail_effect'];
  }

  // Adds dots skin modifier class if provided.
  if (!empty($settings['skin_dots'])) {
    $dots_class[] = 'slick-dots--' . str_replace('_', '-', $settings['skin_dots']);
  }
  if (isset($dots_class) && !empty($build['optionset'])) {
    $dots_class[] = $build['optionset']
      ->getSetting('dotsClass') ?: 'slick-dots';
    $js['dotsClass'] = implode(" ", $dots_class);
  }

  // Handle some accessible-slick options.
  if ($settings['library'] == 'accessible-slick' && $build['optionset']
    ->getSetting('autoplay') && $build['optionset']
    ->getSetting('useAutoplayToggleButton')) {
    foreach ([
      'pauseIcon',
      'playIcon',
    ] as $setting) {
      if ($classes = trim(strip_tags($build['optionset']
        ->getSetting($setting)))) {
        if ($classes != $defaults[$setting]) {
          $js[$setting] = '<span class="' . $classes . '" aria-hidden="true"></span>';
        }
      }
    }
  }

  // Checks for breaking changes: Slick 1.8.1 - 1.9.0 / Accessible Slick.
  // @todo Remove this once the library has permanent solutions.
  if (!empty($settings['breaking'])) {
    if ($build['optionset']
      ->getSetting('rows') == 1) {
      $js['rows'] = 0;
    }
  }

  // Overrides common options to re-use an optionset.
  if ($settings['display'] == 'main') {
    if (!empty($settings['override'])) {
      foreach ($settings['overridables'] as $key => $override) {
        $js[$key] = empty($override) ? FALSE : TRUE;
      }
    }

    // Build the Slick grid if provided.
    if (!empty($settings['grid']) && !empty($settings['visible_items'])) {
      $build['items'] = $this
        ->buildGrid($build['items'], $settings);
    }
  }
  $build['attributes'] = $this
    ->prepareAttributes($build);
  $build['options'] = isset($js) ? array_merge($build['options'], $js) : $build['options'];
  $this->moduleHandler
    ->alter('slick_optionset', $build['optionset'], $settings);
  foreach (SlickDefault::themeProperties() as $key) {
    $element["#{$key}"] = $build[$key];
  }
  unset($build);
  return $element;
}