webapp_json-8.x-1.0-beta3/src/Helpers/MenuLoader.php

src/Helpers/MenuLoader.php
<?php

namespace Drupal\webapp\Helpers;

use Drupal\file\Entity\File;

/**
 * Get menu content.
 */
class MenuLoader {

  const EXCLUDE_MENUS = [
    'admin' => 'admin',
    'tools' => 'tools',
    'account' => 'account'
  ];

  public function getMenuTree() {
    $menuTree = [];
    $menuList = menu_ui_get_menus();

    $menuList = array_diff_key($menuList, self::EXCLUDE_MENUS);

    foreach ($menuList as $menuKey => $menuName) {
      $menuTree[$menuKey] = $this->getMenuData($menuKey);
    }

    return $menuTree;
  }

  private function getMenuData($menuKey) {
    $menu_tree = \Drupal::menuTree();

    // Build the typical default set of menu tree parameters.
    $parameters = $menu_tree->getCurrentRouteMenuTreeParameters($menuKey);

    // Load the tree based on this set of parameters.
    $tree = $menu_tree->load($menuKey, $parameters);

    $renderedMenuTree = $this->parseMenuTree($tree);

    return $renderedMenuTree;
  }

  private function parseMenuTree($tree) {
    $menuTree = [];

    foreach ($tree as $treeItem) {
      if (!$treeItem->link->isEnabled()) {
        continue;
      }

      unset($menuItem);

      $treeItemLink = $treeItem->link;
      $urlObj = $treeItemLink->getUrlObject();

      if ($urlObj->isRouted() || $urlObj->isExternal()) {
        $uuid = $treeItemLink->getDerivativeId();

        if ($uuid) {
          $entity = \Drupal::service('entity.repository')
            ->loadEntityByUuid('menu_link_content', $uuid);
          if ($entity->hasField('thumbnail')) {
            $thumbNail = $entity->get('thumbnail');
            $thumbNailValue = $thumbNail->getValue()[0];
            $imageFile = File::load($thumbNailValue['target_id']);
            if ($imageFile) {
              $menuItem['thumbnail_url'] = file_url_transform_relative($imageFile->Url());
            }
          }
          if ($entity->hasField('icon')) {
            $menuItem['icon_id'] = $entity->get('icon')->value;
          }
          $menuItem['weight'] = $entity->getWeight();
        }
      }

      $treeItemLink = $treeItem->link;
      $treeItemUrl = $treeItemLink->getUrlObject();

      $menuItem['title'] = $treeItemLink->getTitle();

      $menuItem = array_merge($treeItem->options, $menuItem);

      if ($treeItemUrl->isExternal()) {
        $menuItem['is_external'] = true;
        $menuItem['uri'] = $treeItemUrl->getUri();
      } else {
        $menuItem['is_external'] = false;
        $menuItem['internal_path'] = '/' . $treeItemUrl->getInternalPath();
        $menuItem['alias'] = \Drupal::service('path.alias_manager')->getAliasByPath($menuItem['internal_path']);
      }

      if ($treeItem->hasChildren) {
        $menuItem['children'] = $this->parseMenuTree($treeItem->subtree);
      }

      if (!$menuItem['is_external']) {
        $path = \Drupal::service('path.alias_manager')->getPathByAlias($menuItem['alias']);
        if(preg_match('/node\/(\d+)/', $path, $matches)) {
          if ($this->userHasAccess($matches[1])) {
            $menuTree[] = $menuItem;
          }
        }
      } else {
        $menuTree[] = $menuItem;
      }
    }

    usort($menuTree, function($a, $b) {
      return $a['weight'] > $b['weight'];
    });

    return $menuTree;
  }

  private function userHasAccess($nodeId) {
    $current_user = \Drupal::currentUser();
    $user = \Drupal\user\Entity\User::load($current_user->id());

    if (($user === null) || ($current_user->id() === 0)) {
      throw new \Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException('Access denied!');
    }

    $currentUserRoles = $user->getRoles();

    $storage = \Drupal::entityTypeManager()->getStorage('node');
    $loadedEntity = $storage->load($nodeId);
    $whoHasAccess = ['administrator'];

    if ($loadedEntity) {
      $fieldAccess = $loadedEntity->get('field_access');
      foreach ($fieldAccess as $fieldAccessItem) {
        $valueId = $fieldAccessItem->getValue()['target_id'];
        $definition = $fieldAccessItem->getDataDefinition();
        $dataType = $definition->getSetting('target_type');
        $taxonomyTerm = \Drupal::entityTypeManager()->getStorage($dataType)->load($valueId);

        if ($taxonomyTerm) {
          $name = $taxonomyTerm->getName();
          $whoHasAccess[] = $name;
        }
      }
    }

    $rolesMatching = array_intersect(array_map('strtolower', $whoHasAccess), array_map('strtolower', $currentUserRoles));

    if (count($rolesMatching) > 0) {
      return true;
    }

    return false;
  }

}

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

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