shortify-1.0.9/src/AdditionalClass/Helpers/MenuHelper.php

src/AdditionalClass/Helpers/MenuHelper.php
<?php

namespace Drupal\shortify\AdditionalClass\Helpers;


use Drupal;
use Drupal\Core\Menu\MenuTreeParameters;
use Drupal\node\NodeInterface;

class MenuHelper {

  public static function getMenuFooter(string $name, string $break = ''): string {
    $links = "";
    $menuTree = Drupal::menuTree();
    $parameters = $menuTree->getCurrentRouteMenuTreeParameters($name);
    $tree = $menuTree->load($name, $parameters);
    $manipulators = [
      ['callable' => 'menu.default_tree_manipulators:checkAccess'],
      ['callable' => 'menu.default_tree_manipulators:generateIndexAndSort'],
    ];
    $tree = $menuTree->transform($tree, $manipulators);
    $menuTmp = $menuTree->build($tree);

    $menu = [];
    if (array_key_exists('#items', $menuTmp)) {
      foreach ($menuTmp['#items'] as $item) {
        if ($item['url']->getRouteName() === '<front>') {
          $menu[] = [$item['title'] => '/'];
        } else if ($item['url']->getRouteName() === '<nolink>') {
          $menu[] = [$item['title'] => NULL];
        }
        elseif ($item['url']->getRouteName() == 'entity.node.canonical') {
          $node = [$item['title'] => $item['url']->getRouteParameters()];
          $node = $node[$item['title']];
          $nodeAlias = '';
          foreach ($node as $node_number) {
            $path = '/node/' . (int) $node_number;
            $langCode = Drupal::languageManager()
              ->getCurrentLanguage()
              ->getId();
            $nodeAlias = Drupal::service('path_alias.manager')
              ->getAliasByPath($path, $langCode);
          }
          $menu[] = [$item['title'] => trim($nodeAlias, '/')];
        }
        else {
          $menu[] = [$item['title'] => $item['url']->getInternalPath()];
        }
      }
      $i = 1;

      foreach ($menu as $menu_item) {
        foreach ($menu_item as $name => $url) {
          if (is_null($url)) {
            $menuItem =  "<li><a title='no link' href='#' class='nolink'>$name</a></li>";
          } else {
            $menuItem = "<li><a href='/$url'>$name</a></li>";
          }


          if ($i != count($menu_item)) {
            $links .= "$menuItem$break";
            $i++;
          }
          else {
            $links .= $menuItem;
          }
        }
      }
    }
    else {
      $links = "";
    }

    return $links;
  }

  public static function getMenu($name, $dropdown = FALSE, $styled = FALSE): string {
    $active = "";
    $links = "";
    $dropdownMenu = "";
    $menuTree = Drupal::menuTree();
    $parameters = new MenuTreeParameters();
    $parameters->onlyEnabledLinks();
    $tree = $menuTree->load($name, $parameters);
    $manipulators = [
      ['callable' => 'menu.default_tree_manipulators:checkAccess'],
      ['callable' => 'menu.default_tree_manipulators:generateIndexAndSort'],
    ];
    $tree = $menuTree->transform($tree, $manipulators);
    $menu_tmp = $menuTree->build($tree);
    $menu = [];

    if (isset($menu_tmp['#items'])) {
      foreach ($menu_tmp['#items'] as $item) {
        if ($item['url']->isRouted()) {
          if ($item['url']->getRouteName() === '<front>') {
            $menu_item = [
              "url" => '/',
              "name" => $item['title'],
            ];
          }
          elseif ($item['url']->getRouteName() === '<nolink>') {
            $menu_item = [
              "url" => NULL,
              "name" => $item['title'],
            ];
          }
          elseif ($item['url']->getRouteName() == 'entity.node.canonical') {
            $node = [$item['title'] => $item['url']->getRouteParameters()];
            $node = $node[$item['title']];
            $node_alias = '';
            foreach ($node as $node_number) {
              $path = '/node/' . (int) $node_number;
              $langCode = Drupal::languageManager()
                ->getCurrentLanguage()
                ->getId();
              $node_alias = Drupal::service('path_alias.manager')
                ->getAliasByPath($path, $langCode);
            }
            $menu_item = [
              "url" => $node_alias,
              "name" => $item['title'],
            ];
          }
          else {
            $menu_item = [
              "url" => '/' . $item['url']->getInternalPath(),
              "name" => $item['title'],
            ];
          }
        }
        elseif ($item['url']->isExternal()) {
          $menu_item = [
            "url" => $item['url']->getUri(),
            "name" => $item['title'],
          ];
        }
        else {
          $menu_item = [
            "url" => str_replace('base:', '', '/' . $item['url']->toUriString()),
            "name" => $item['title'],
          ];
        }

        if ($dropdown) {
          if (is_array($item['below']) && !empty($item['below'])) {
            if ($styled) {
              $dropdownMenu .= self::getDropdownMenu($item['below'], 1, TRUE);
            }
            else {
              $dropdownMenu .= self::getDropdownMenu($item['below'], 1, FALSE);
            }
            $menu_item['dropdown'] = $dropdownMenu;
            $dropdownMenu = "";
          }
        }

        $menu[] = $menu_item;
      }
    }

    $result = self::getActiveClass();
    $first = FALSE;

    foreach ($menu as $menu_item) {
      $dropdownMenu = $menu_item["dropdown"] ?? "";
      $isUrlNull = is_null($menu_item['url']);

      if ($result && !$first) {
        if (!$isUrlNull && $menu_item['url'] == $result || $menu_item['url'] == trim($result, "/") || $menu_item['name'] == $result) {
          $active = "class='ps-active'";
          $first = TRUE;
        }
      }


      if ($styled && !$isUrlNull) {
        $links .= "<li $active><a href='{$menu_item['url']}'>{$menu_item['name']}</a>$dropdownMenu</li>";
      }
      elseif ($isUrlNull) {
        $links .= "<li $active><a href='#' title='no link' class='nolink'>{$menu_item['name']}</a>$dropdownMenu</li>";
      }
      else {
        $links .= "<li><a href='{$menu_item['url']}'>{$menu_item['name']}</a>$dropdownMenu</li>";
      }
      $active = "";
    }

    return $links;
  }

  private static function getDropdownMenu($dropdown, $level, $styled): string {
    $content_below = "";

    if ($level > 1) {
      $content = $styled ? "<ul class='ps-dropdown'>" : "<ul>";
    }
    else {
      $content = $styled ? "<i class='fas fa-caret-down'></i><ul class='ps-dropdown'>" : "<ul>";
    }

    foreach ($dropdown as $item) {
      $title = $item['title'];

      if ($item['url']->isRouted() && $item['url']->getRouteName() == 'entity.node.canonical') {
        $node = [$item['title'] => $item['url']->getRouteParameters()];
        $node = $node[$item['title']];
        $node_alias = '';

        foreach ($node as $node_number) {
          $path = '/node/' . (int) $node_number;
          $langCode = Drupal::languageManager()
            ->getCurrentLanguage()
            ->getId();
          $node_alias = Drupal::service('path_alias.manager')
            ->getAliasByPath($path, $langCode);
        }
      }
      elseif ($item['url']->isExternal()) {
        $node_alias = $item['url']->getUri();
      }
      elseif ($item['url']->getRouteName() == '<front>') {
        $node_alias = '/';
      }
      elseif ($item['url']->getRouteName() === '<nolink>') {
        $node_alias = NULL;
      }
      else {
        $node_alias = str_replace('base:', '', $item['url']->toUriString());
      }

      $url = $node_alias;
      $isUrlNull = is_null($url);
      $right_arrow = "";

      if (is_array($item['below']) && !empty($item['below'])) {
        $content_below .= self::getDropdownMenu($item['below'], 2, $styled);
        $right_arrow = "<i class='fas fa-caret-right'></i>";
      }

      if ($styled && !$isUrlNull) {
        $content .= "<li><a href='$url'>$title</a>$right_arrow $content_below</li>";
      }
      elseif ($isUrlNull) {
        $content .= "<li><a href='#' title='no link' class='nolink'>$title</a>$right_arrow $content_below</li>";
      }
      else {
        $content .= "<li><a href='$url'>$title</a>$content_below</li>";
      }

      $content_below = "";
    }

    $content .= "</ul>";
    return $content;
  }

  private static function getActiveClass() {
    if (Drupal::service('path.matcher')->isFrontPage()) {
      return "/";
    }

    $node_id = "";
    $parentInfo = NULL;
    $node = Drupal::routeMatch()->getParameter('node');

    if ($node instanceof NodeInterface) {
      $node_id = $node->id();
    }

    $menu_link_manager = Drupal::service('plugin.manager.menu.link');
    $result = $menu_link_manager->loadLinksByRoute('entity.node.canonical', ['node' => $node_id]);

    if (empty($result)) {
      return FALSE;
    }

    foreach ($result as $child) {
      $currentPluginId = $child->getPluginId();
      $getParents = $menu_link_manager->getParentIds($currentPluginId);
      $parent = array_reverse($getParents);
      $parent = reset($parent);
      $parentInfo = $menu_link_manager->getDefinition($parent);
    }

    if (isset($parentInfo['title'])) {
      return $parentInfo['title'];
    }
    if (count($parentInfo['route_parameters']) <= 0 && $parentInfo['route_name'] == "<front>") {
      return "/";
    }

    $path = '/node/' . (int) $parentInfo['route_parameters']['node'];
    $langCode = Drupal::languageManager()
      ->getCurrentLanguage()
      ->getId();

    return Drupal::service('path_alias.manager')
      ->getAliasByPath($path, $langCode);
  }

}

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

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