bootstrap_italia-8.x-0.x-dev/src/Helper/Suggestions.php

src/Helper/Suggestions.php
<?php

namespace Drupal\bootstrap_italia\Helper;

use Drupal\block_content\BlockContentInterface;
use Drupal\Component\Utility\Html;
use Drupal\node\NodeInterface;
use Drupal\taxonomy\Entity\Term;

/**
 * Helper Suggestions class for bootstrap_italia theme.
 *
 * Why isn't it a service? https://www.drupal.org/project/drupal/issues/2002606.
 */
class Suggestions {

  /**
   * Set form suggestions.
   *
   * @param array<string> &$suggestions
   *   Referenced $suggestions.
   * @param array<string, mixed> $variables
   *   Referenced $variables.
   * @param string|null $hook
   *   Specific hook.
   */
  public static function form(array &$suggestions, array $variables, ?string $hook = NULL): void {
    // Add a suggestion based on the element type.
    if (isset($variables['element']['#type'])) {
      $suggestions[] = $variables['theme_hook_original'] . '__type__' . $variables['element']['#type'];
    }
    if (isset($variables['element']['#type']) && !is_null($hook)) {
      $suggestions[] = $hook . '__type__' . $variables['element']['#type'];
    }
    if (isset($variables['element']['#id'])) {
      $suggestions[] = $variables['theme_hook_original'] . '__id__' . self::sanitize($variables['element']['#id']);
    }
    if (isset($variables['element']['#id']) && !is_null($hook)) {
      $suggestions[] = $hook . '__id__' . self::sanitize($variables['element']['#id']);
    }
    if (isset($variables['element']['#name'])) {
      $suggestions[] = $variables['theme_hook_original'] . '__name__' . $variables['element']['#name'];
    }
    if (isset($variables['element']['#name']) && !is_null($hook)) {
      $suggestions[] = $hook . '__name__' . $variables['element']['#name'];
    }
  }

  /**
   * Set blocks suggestions.
   *
   * @param array<string> &$suggestions
   *   Referenced $suggestions.
   * @param array<string, mixed> $variables
   *   Referenced $variables.
   *
   * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException
   * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException
   */
  public static function block(array &$suggestions, array $variables): void {
    $content = $variables['elements']['content'];
    if (isset($content['#block_content']) and $content['#block_content'] instanceof BlockContentInterface) {
      $bundle = $content['#block_content']->bundle();
      $view_mode = $content['#view_mode'];
      $suggestions[] = 'block__' . $bundle;
      $suggestions[] = 'block__' . $view_mode;
      $suggestions[] = 'block__' . $bundle . $view_mode;
    }

    if (!empty($variables['elements']['#id'])) {
      /** @var \Drupal\block\BlockInterface $block */
      $block = \Drupal::entityTypeManager()
        ->getStorage('block')
        ->load($variables['elements']['#id']);

      if (!empty($block->getRegion())) {
        $region = $block->getRegion();
      }
      else {
        $region = (isset($variables['elements']['#configuration']['region'])) ? $variables['elements']['#configuration']['region'] : '';
      }
      // Adds suggestion with region and block id.
      $suggestions[] = 'block__' . $region . '__' . $variables['elements']['#id'];
      // Adds suggestion with region id.
      $suggestions[] = 'block__' . $region;

      if (isset($variables['elements']['#base_plugin_id'])) {
        // Adds suggestions with base and derivative plugin id.
        $suggestions[] = 'block__' . $region . '__' . $variables['elements']['#base_plugin_id'];

        if ($variables['elements']['#derivative_plugin_id']) {
          $suggestions[] = 'block__' . $region . '__' . $variables['elements']['#base_plugin_id'] . '__' . self::sanitize($variables['elements']['#derivative_plugin_id']);
        }

        $route_name = str_replace('.', '_', \Drupal::routeMatch()->getRouteName());
        $suggestions[] = $variables['theme_hook_original'] . '__' . $variables['elements']['#base_plugin_id'] . '__' . self::sanitize($route_name);

      }
    }
  }

  /**
   * Set menu suggestions.
   *
   * @param array<string> &$suggestions
   *   Referenced $suggestions.
   * @param array<string, mixed> $variables
   *   Referenced $variables.
   */
  public static function menu(array &$suggestions, array $variables): void {
    // See bootstrap_italia_preprocess_block().
    if (isset($variables['attributes']['data-block']['region'])) {
      $region = $variables['attributes']['data-block']['region'];
      $suggestions[] = $variables['theme_hook_original'] . '__' . $region;
      $suggestions[] = 'menu__' . $region;
    }
  }

  /**
   * Set page suggestions.
   *
   * @param array<string> &$suggestions
   *   Referenced $suggestions.
   * @param array<string, mixed> &$variables
   *   Referenced $variables.
   */
  public static function page(array &$suggestions, array &$variables): void {
    // Add content type suggestions.
    if (($node = \Drupal::request()->attributes->get('node')) &&
      !strpos($_SERVER['REQUEST_URI'], "revisions")
    ) {
      if ($node instanceof NodeInterface) {
        array_splice($suggestions, 1, 0, 'page__node__' . $node->getType());
        $variables['content_type_name'] = $node->getType();
      }
    }
    // Add taxonomy suggestions.
    if (($term = \Drupal::request()->attributes->get('taxonomy_term')) &&
      !strpos($_SERVER['REQUEST_URI'], "revisions")
    ) {
      if ($term instanceof Term) {
        if ($term->get('parent')->target_id == 0) {
          $suggestions[] = 'page__taxonomy__term__firstlevel';
        }
        else {
          $suggestions[] = 'page__taxonomy__term__secondlevel';
        }
        $term_name = Html::getUniqueId(strtolower($term->getName()));
        $suggestions[] = 'page__taxonomy__term__' . self::sanitize($term_name);
        $suggestions[] = 'page__taxonomy__term__' . $term->bundle();
      }
    }

  }

  /**
   * Set image_formatter suggestions.
   *
   * @param array<string> &$suggestions
   *   Referenced $suggestions.
   * @param array<string, mixed> $variables
   *   Referenced $variables.
   */
  public static function imageFormatter(array &$suggestions, array $variables): void {
    $entity = $variables['item']->getEntity();
    $field_name = $variables['item']->getParent()->getName();

    $suggestions[] =
      $variables['theme_hook_original'] . '__' . $entity->getEntityTypeId();

    $suggestions[] =
      $variables['theme_hook_original'] . '__' . $entity->bundle();

    $suggestions[] =
      $variables['theme_hook_original'] . '__' . $field_name;

    $suggestions[] = $variables['theme_hook_original']
      . '__' . $entity->getEntityTypeId() . '__' . $entity->bundle();

    $suggestions[] = $variables['theme_hook_original']
      . '__' . $entity->getEntityTypeId() . '__' . $field_name;

    $suggestions[] = $variables['theme_hook_original']
      . '__' . $entity->bundle() . '__' . $field_name;

    $suggestions[] =
      $variables['theme_hook_original']
      . '__' . $entity->getEntityTypeId()
      . '__' . $entity->bundle()
      . '__' . $field_name;
  }

  /**
   * Set image_style suggestions.
   *
   * @param array<string> &$suggestions
   *   Referenced $suggestions.
   * @param array<string, mixed> $variables
   *   Referenced $variables.
   */
  public static function imageStyle(array &$suggestions, array $variables): void {
    if (isset($variables['style_name'])) {
      $suggestions[] = $variables['theme_hook_original'] . '__' . $variables['style_name'];
    }
  }

  /**
   * Sanitize string to use in suggestion.
   *
   * @param string $s
   *   String to sanitize.
   *
   * @return string
   *   Clean string
   */
  public static function sanitize(string $s): string {
    return str_replace('-', '_', $s);
  }

}

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

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