You are here

public function Styleswitcher::build in Style Switcher 8.2

Same name and namespace in other branches
  1. 3.0.x src/Plugin/Block/Styleswitcher.php \Drupal\styleswitcher\Plugin\Block\Styleswitcher::build()

Builds and returns the renderable array for this block plugin.

If a block should not be rendered because it has no content, then this method must also ensure to return no content: it must then only return an empty array, or an empty array with #cache set (with cacheability metadata indicating the circumstances for it being empty).

Return value

array A renderable array representing the content of the block.

Overrides BlockPluginInterface::build

See also

\Drupal\block\BlockViewBuilder

File

src/Plugin/Block/Styleswitcher.php, line 86

Class

Styleswitcher
Provides the Style Switcher block.

Namespace

Drupal\styleswitcher\Plugin\Block

Code

public function build() {
  $block = [];
  $theme = $this->themeManager
    ->getActiveTheme()
    ->getName();

  // List of styles a user can switch between.
  $styles = styleswitcher_style_load_multiple($theme, [
    'status' => TRUE,
  ]);

  // Do not display block if there is only one style (no alternatives).
  if (count($styles) > 1) {
    uasort($styles, 'styleswitcher_sort');
    $links = [];
    $destination = $this->redirectDestination
      ->getAsArray();
    foreach ($styles as $name => $style) {
      $name_hyphenated = strtr($name, '_', '-');
      $name_parts = explode('/', $name_hyphenated);
      $class = [
        'style-switcher',
        $name_parts[0] . '-style',
        'style-' . $name_parts[1],
      ];
      $route_params = [
        'theme' => $theme,
        'type' => $name_parts[0],
        'style' => $name_parts[1],
      ];
      $options = [
        'query' => $destination,
        'attributes' => [
          'class' => $class,
          'data-rel' => $name,
          'rel' => 'nofollow',
        ],
      ];
      $links[] = Link::fromTextAndUrl($style['label'], Url::fromRoute('styleswitcher.switch', $route_params, $options));

      // Make paths absolute for JS.
      if (isset($style['path'])) {
        $styles[$name]['path'] = file_create_url($style['path']);
      }
      else {
        $styles[$name]['path'] = Url::fromRoute('styleswitcher.css', [
          'theme' => $theme,
        ], [
          'absolute' => TRUE,
        ])
          ->toString();
      }
    }
    $js_settings = [
      'styleSwitcher' => [
        'styles' => $styles,
        'default' => styleswitcher_default_style_key($theme),
        'enableOverlay' => $this->configFactory
          ->get('styleswitcher.settings')
          ->get('enable_overlay'),
        'cookieExpire' => STYLESWITCHER_COOKIE_EXPIRE,
        'theme' => $theme,
      ],
    ];
    $attached['library'][] = 'styleswitcher/styleswitcher';
    $attached['drupalSettings'] = $js_settings;
    $block = [
      '#theme' => 'item_list',
      '#items' => $links,
      '#attached' => $attached,
      '#cache' => [
        // We cannot cache globally, because we use drupal_get_destination()
        // with links in block, which is different from page to page. And we
        // cannot avoid using destination, because in this case site users
        // with JS-disabled browsers won't go back to the same page they were
        // at, but will go to the front page each time. We also cannot rely on
        // $_SERVER['HTTP_REFERER'], because it can be empty.
        'contexts' => [
          'theme',
          'url',
        ],
        'tags' => [
          'config:styleswitcher.settings',
          'config:styleswitcher.custom_styles',
          'config:styleswitcher.styles_settings',
        ],
      ],
    ];
  }
  else {
    $block['#cache'] = [
      'contexts' => [
        'theme',
      ],
      'tags' => [
        'config:styleswitcher.custom_styles',
        'config:styleswitcher.styles_settings',
      ],
    ];
  }
  return $block;
}