You are here

public function RenderCheeseburgerMenuBlock::renderTree in Cheeseburger Menu 8.2

Same name and namespace in other branches
  1. 8.4 src/Controller/RenderCheeseburgerMenuBlock.php \Drupal\cheeseburger_menu\Controller\RenderCheeseburgerMenuBlock::renderTree()
  2. 8.3 src/Controller/RenderCheeseburgerMenuBlock.php \Drupal\cheeseburger_menu\Controller\RenderCheeseburgerMenuBlock::renderTree()

Render given tree.

1 call to RenderCheeseburgerMenuBlock::renderTree()
RenderCheeseburgerMenuBlock::content in src/Controller/RenderCheeseburgerMenuBlock.php

File

src/Controller/RenderCheeseburgerMenuBlock.php, line 115
Controller used for rendering block.

Class

RenderCheeseburgerMenuBlock
Class RenderCheeseburgerMenuBlock.

Namespace

Drupal\cheeseburger_menu\Controller

Code

public function renderTree($route_id, $page_type, $current_route, $config) {
  $menus_appear = isset($config['menus_appear']) ? $config['menus_appear'] : [];
  $menus_weight = isset($config['menus_weight']) ? $config['menus_weight'] : [];
  $menus_title = isset($config['menus_title']) ? $config['menus_title'] : [];
  $taxonomy_appear = isset($config['taxonomy_appear']) ? $config['taxonomy_appear'] : [];
  $taxonomy_weight = isset($config['taxonomy_weight']) ? $config['taxonomy_weight'] : [];
  $taxonomy_title = isset($config['taxonomy_title']) ? $config['taxonomy_title'] : [];
  $cart = [];
  $cart['appear'] = isset($config['cart_appear']) ? $config['cart_appear'] : FALSE;
  $cart['weight'] = isset($config['cart_weight']) ? $config['cart_weight'] : 0;
  $phone['appear'] = isset($config['phone_appear']) ? $config['phone_appear'] : FALSE;
  $phone['weight'] = isset($config['phone_weight']) ? $config['phone_weight'] : 0;
  $phone['store'] = isset($config['phone_store']) ? $config['phone_store'] : FALSE;
  $phone['number'] = isset($config['phone_number']) ? $config['phone_number'] : '';
  $language_switcher = isset($config['lang_switcher']) ? $config['lang_switcher'] : FALSE;
  $language_switcher_weight = isset($config['lang_switcher_weight']) ? $config['lang_switcher_weight'] : 0;
  $headerHeight = isset($config['headerHeight']) ? $config['headerHeight'] : 0;
  $headerPadding = isset($config['headerPadding']) ? $config['headerPadding'] : 0;
  $moduleHandler = $this
    ->moduleHandler();
  $menu_ids = $this
    ->getAllMenuLinkId();
  $taxonomy_term_ids = $this
    ->getAllTaxonomyTermIds();
  $langcode = $this
    ->languageManager()
    ->getCurrentLanguage(LanguageInterface::TYPE_CONTENT)
    ->getId();
  $complete_menu_tree = [];
  $tree = [];
  $titles = [];
  foreach ($menus_appear as $key => $menu) {
    $helpArray = [];
    if ($menus_title[$key] === TRUE || $menus_title[$key] === FALSE) {
      $helpArray['title'] = array_search($key, $menu_ids);
    }
    else {
      $helpArray['title'] = new TranslatableMarkup($menus_title[$key], [], [], $this
        ->getStringTranslation());
    }
    $helpArray['class'] = $key;
    $helpArray['weight'] = $menus_weight[$key];
    $titles[] = $helpArray;
  }
  foreach ($taxonomy_appear as $key => $taxonomy) {
    $helpArray = [];
    if ($taxonomy_title[$key] === TRUE || $taxonomy_title[$key] === FALSE) {
      $helpArray['title'] = array_search($key, $taxonomy_term_ids);
    }
    else {
      $helpArray['title'] = new TranslatableMarkup($taxonomy_title[$key], [], [], $this
        ->getStringTranslation());
    }
    $helpArray['class'] = $key;
    $helpArray['weight'] = $taxonomy_weight[$key];
    $titles[] = $helpArray;
  }
  if ($cart['appear']) {
    $helpArray = [];
    $helpArray['title'] = $this
      ->t('Cart');
    $helpArray['class'] = 'cart';
    $helpArray['url'] = '/cart';
    $helpArray['weight'] = $cart['weight'];
    $titles[] = $helpArray;
  }
  if ($phone['appear']) {
    if ($phone['store'] == 0) {
      $phone_number = $phone['number'];
    }
    else {
      if ($moduleHandler
        ->moduleExists('commerce_store')) {
        $store = Store::load($phone['store']);
        if (!empty($store) && $store
          ->hasField('field_phone')) {
          $phone_number = current($store
            ->get('field_phone')
            ->getValue())['value'];
          $phone_number = str_replace(' ', '', $phone_number);
          if (empty($phone_number)) {
            $phone_number = FALSE;
          }
        }
        else {
          $phone_number = FALSE;
        }
      }
      else {
        $phone_number = FALSE;
      }
    }
    if ($phone_number != FALSE) {
      $helpArray = [];
      $helpArray['title'] = $this
        ->t('Phone');
      $helpArray['class'] = 'phone';
      $helpArray['url'] = 'tel:' . $phone_number;
      $helpArray['weight'] = $phone['weight'];
      $titles[] = $helpArray;
    }
  }
  $titles = $this
    ->bubbleSortWeight($titles);
  $tree[] = [
    '#theme' => 'hierarchical_navigation',
    '#tree' => $titles,
  ];
  $tree[] = [
    '#markup' => '<div class="cheeseburger-menu__menus">',
  ];
  $trees = [];

  // MENUS.
  foreach ($menus_appear as $key => $menu) {
    if ($menus_title[$key] === TRUE) {
      $title = array_search($key, $menu_ids);
    }
    elseif ($menus_title[$key] === FALSE) {
      $title = FALSE;
    }
    else {
      $title = $menus_title[$key];
    }
    $menu_tree = $this
      ->getMenuTree($key);
    $complete_menu_tree[] = $menu_tree;
    $trees[] = [
      '#theme' => 'hierarchical_menu',
      '#menu_tree' => $menu_tree,
      '#route_id' => $route_id,
      '#page_type' => $page_type,
      '#title' => $title,
      '#machine_name' => $key,
      '#current_url' => $current_route,
      '#cache' => [
        'max-age' => 0,
      ],
      '#attached' => [
        'library' => [
          'cheeseburger_menu/cheeseburger_menu',
        ],
        'drupalSettings' => [
          'collapsibleMenu' => 1,
          'interactiveParentMenu' => 0,
          'headerHeight' => $headerHeight,
          'headerPadding' => $headerPadding,
          'breakpoints' => $config['breakpoints'],
          'activeBreakpoints' => [],
        ],
      ],
      'weight' => $menus_weight[$key],
    ];
  }

  // Taxonomies.
  foreach ($taxonomy_appear as $key => $taxonomy) {
    if ($taxonomy_title[$key] === TRUE) {
      $title = array_search($key, $taxonomy_term_ids);
    }
    elseif ($taxonomy_title[$key] === FALSE) {
      $title = FALSE;
    }
    else {
      $title = $taxonomy_title[$key];
    }
    $entityTypeManager = $this
      ->entityTypeManager();
    $vocabulary_tree = $entityTypeManager
      ->getStorage('taxonomy_term')
      ->loadTree($key);
    $vocabulary_tree_array = [];
    foreach ($vocabulary_tree as $item) {
      $term_storage = $this
        ->entityTypeManager()
        ->getStorage('taxonomy_term');

      /** @var \Drupal\taxonomy\Entity\Term $term */
      $term = $term_storage
        ->load($item->tid);
      if ($term
        ->hasField('field_icon')) {
        $icon = $term
          ->get('field_icon');
        if (!empty($icon
          ->getValue())) {
          $icon = $term
            ->get('field_icon')->entity
            ->getFileUri();
          $icon = file_create_url($icon);
        }
        else {
          $icon = '';
        }
      }
      else {
        $icon = '';
      }
      $translation = $term
        ->getTranslation($langcode);
      $vocabulary_tree_array[] = [
        'id' => $item->tid,
        'name' => $translation
          ->getName(),
        'url' => $term
          ->url(),
        'parents' => $item->parents,
        'interactive_parent' => 1,
        'type' => 'taxonomy_term',
        'icon' => $icon,
      ];
    }
    $vocabulary_tree = $this
      ->generateTree($vocabulary_tree_array);
    $complete_menu_tree[] = $vocabulary_tree;
    $trees[] = [
      '#theme' => 'hierarchical_menu',
      '#menu_tree' => $vocabulary_tree,
      '#route_id' => $route_id,
      '#page_type' => $page_type,
      '#title' => $title,
      '#machine_name' => $key,
      '#current_url' => $current_route,
      '#cache' => [
        'max-age' => 0,
      ],
      '#attached' => [
        'library' => [
          'cheeseburger_menu/cheeseburger_menu',
        ],
        'drupalSettings' => [
          'collapsibleMenu' => 1,
          'interactiveParentMenu' => 0,
          'headerHeight' => $headerHeight,
          'headerPadding' => $headerPadding,
          'breakpoints' => $config['breakpoints'],
          'activeBreakpoints' => [],
        ],
      ],
      'weight' => $taxonomy_weight[$key],
    ];
  }
  if ($language_switcher == 1) {

    /** @var Drupal\Core\Language\LanguageManager $languageManager */
    $languageManager = $this
      ->languageManager();
    $current_language = $languageManager
      ->getCurrentLanguage()
      ->getId();
    $languageTree = [];
    $languages = $languageManager
      ->getLanguages();
    foreach ($languages as $language) {
      $languageTree[] = [
        'name' => $language
          ->getName(),
        'id' => $language
          ->getId(),
        'url' => $language
          ->isDefault() ? '/' : '/' . $language
          ->getId(),
        'type' => 'language',
      ];
    }
    $complete_menu_tree[] = $languageTree;
    $title = 'Language';
    $trees[] = [
      '#theme' => 'hierarchical_menu',
      '#menu_tree' => $languageTree,
      '#route_id' => $current_language,
      '#page_type' => 'language',
      '#title' => $title,
      '#machine_name' => 'language_switcher',
      '#current_url' => $current_route,
      '#cache' => [
        'max-age' => 0,
      ],
      '#attached' => [
        'library' => [
          'cheeseburger_menu/cheeseburger_menu',
        ],
        'drupalSettings' => [
          'collapsibleMenu' => 1,
          'interactiveParentMenu' => 0,
          'headerHeight' => $headerHeight,
          'headerPadding' => $headerPadding,
          'breakpoints' => $config['breakpoints'],
          'activeBreakpoints' => [],
        ],
      ],
      'weight' => $language_switcher_weight,
    ];
  }
  $active_child = $this
    ->findActiveChild($complete_menu_tree, $route_id, $current_route, $page_type);
  $trees = $this
    ->bubbleSortWeight($trees);
  foreach ($trees as $key => $iterator) {
    $trees[$key]['#active'] = $active_child;
    unset($trees[$key]['weight']);
  }
  $tree = array_merge($tree, $trees);
  $tree[] = [
    '#markup' => '</div>',
  ];
  return $tree;
}