muser-8.x-1.x-dev/modules/custom/muser_user/src/Plugin/Block/UserMenu.php

modules/custom/muser_user/src/Plugin/Block/UserMenu.php
<?php

namespace Drupal\muser_user\Plugin\Block;

use Drupal\Core\Block\BlockBase;
use Drupal\user\Entity\User;
use Drupal\Core\Link;
use Drupal\Core\Url;
use Drupal\Component\Utility\Html;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Session\AccountProxyInterface;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Drupal\Core\Routing\RedirectDestination;

/**
 * Provides a 'UserMenu' block.
 *
 * @Block(
 *  id = "muser_user_menu",
 *  admin_label = @Translation("Muser user menu block"),
 * )
 */
class UserMenu extends BlockBase implements ContainerFactoryPluginInterface {

  /**
   * @var ConfigFactoryInterface
   */
  protected $configFactory;

  /**
   * @var AccountProxyInterface
   */
  protected $currentUser;

  /**
   * @var RequestStack
   */
  protected $requestStack;

  /**
   * @var RedirectDestination
   */
  private $redirectDestination;

  /**
   * UserMenu constructor.
   *
   * @param array $configuration
   * @param $plugin_id
   * @param $plugin_definition
   * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
   * @param \Drupal\Core\Session\AccountProxyInterface $current_user
   * @param \Symfony\Component\HttpFoundation\RequestStack $request_stack
   * @param \Drupal\Core\Routing\RedirectDestination $redirect_destination
   */
  public function __construct(
    array $configuration,
    $plugin_id,
    $plugin_definition,
    ConfigFactoryInterface $config_factory,
    AccountProxyInterface $current_user,
    RequestStack $request_stack,
    RedirectDestination $redirect_destination
  ) {
    parent::__construct($configuration, $plugin_id, $plugin_definition);
    $this->configFactory = $config_factory;
    $this->currentUser = $current_user;
    $this->requestStack = $request_stack;
    $this->redirectDestination = $redirect_destination;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
    return new static(
      $configuration,
      $plugin_id,
      $plugin_definition,
      $container->get('config.factory'),
      $container->get('current_user'),
      $container->get('request_stack'),
      $container->get('redirect.destination')
    );
  }

  /**
   * {@inheritdoc}
   */
  public function build() {

    $menu_items = [];

    if ($this->currentUser->isAnonymous()) {

      // Anonymous user.
      $user_login_method = $this->configFactory->get('muser_system.settings')->get('user_login_method');

      switch ($user_login_method) {

        case 'basicshib':
          // When using Shib for login, use a Shib login link.
          /** @var \Drupal\basicshib\AuthenticationHandler $authentication_handler */
          $authentication_handler = \Drupal::service('basicshib.authentication_handler');
          $menu_items['profile'] = [
            'link' => [
              '#theme' => 'basicshib_login_link',
              '#login_url' => $authentication_handler->getLoginUrl(),
              '#login_link_label' => $this->t('Log in'),
              '#cache' => [
                'contexts' => ['url.path', 'user'],
              ],
            ],
            'classes' => 'role--anonymous',
          ];
          break;

        case 'drupal':
        default:
          $menu_items['profile'] = [
            'link' => [
              '#type' => 'link',
              '#url' => Url::fromRoute('user.login', [$this->redirectDestination->getAsArray()]),
              '#title' => $this->t('Log in'),
              '#cache' => [
                'contexts' => ['url.path', 'user'],
              ],
            ],
            'classes' => 'role--anonymous',
          ];

      } // End switch on login method.

    }
    else {

      // Authenticated user.
      $this->currentUser = User::load($this->currentUser->id());
      $current_uri = $this->requestStack->getCurrentRequest()->getRequestUri();

      // Mentor menu items.
      if ($this->currentUser->hasRole('mentor')) {
        $options = [];
        $menu_item_classes = ['menu--mentor'];
        if (strpos($current_uri, '/mentor') === 0) {
          $options = ['attributes' => ['class' => 'is-active']];
          $menu_item_classes[] = 'menu-item--active-trail';
        }
        $menu_items['mentor_tasks'] = [
          'link' => [
            '#type' => 'link',
            '#url' => Url::fromRoute('view.my_projects.page', ['user' => $this->currentUser->id()], $options),
            '#title' => $this->t('Mentor tasks'),
          ],
          'classes' => implode(' ', $menu_item_classes),
        ];
        $options = ['set_active_class' => TRUE];
        $menu_items['mentor_tasks']['children'][] = Link::createFromRoute($this->t('My projects'), 'view.my_projects.page', ['user' => $this->currentUser->id()], $options);
        $menu_items['mentor_tasks']['children'][] = Link::createFromRoute($this->t('Applications'), 'view.applications.page_new', ['user' => $this->currentUser->id()], $options);
      } // Mentor?

      // Student menu item(s).
      if ($this->currentUser->hasRole('student')) {
        $options = [];
        $menu_item_classes = ['menu--student'];
        if (strpos($current_uri, '/student') === 0) {
          $options = ['attributes' => ['class' => 'is-active']];
          $menu_item_classes[] = 'menu-item--active-trail';
        }
        $menu_items['student'] = [
          'link' => [
            '#type' => 'link',
            '#url' => Url::fromRoute('view.my_favorites.page', ['user' => $this->currentUser->id()], $options),
            '#title' => $this->t('My applications'),
          ],
          'classes' => implode(' ', $menu_item_classes),
        ];
      } // Student?

      $options = [];
      $menu_item_classes = [];
      if (strpos($current_uri, '/user') === 0) {
        $options = ['attributes' => ['class' => 'is-active']];
        $menu_item_classes[] = 'menu-item--active-trail';
      }

      if (!muser_user_profile_is_complete($this->currentUser)) {
        $menu_item_classes[] = 'user-profile--incomplete';
      }

      $roles = $this->currentUser->getRoles();
      foreach ($roles as $role) {
        $menu_item_classes[] = Html::getClass('role--' . $role);
      }

      $menu_items['profile'] = [
        'link' => [
          '#type' => 'link',
          '#url' => Url::fromRoute('entity.user.canonical', ['user' => $this->currentUser->id()], $options),
          '#title' => $this->currentUser->getDisplayName(),
        ],
        'classes' => implode(' ', $menu_item_classes),
      ];

      $options = ['set_active_class' => TRUE];
      $menu_items['profile']['children'][] = Link::createFromRoute($this->t('My profile'), 'entity.user.canonical', ['user' => $this->currentUser->id()], $options)->toString();
      $menu_items['profile']['children'][] = Link::createFromRoute($this->t('Edit profile'), 'entity.user.edit_form', ['user' => $this->currentUser->id()], $options)->toString();
      $menu_items['profile']['children'][] = Link::createFromRoute($this->t('Log out'), 'user.logout')->toString();

    } // Logged in?

    $build = [
      '#theme' => 'muser_user_menu',
      '#nav' => [
        'id' => 'block-muserusermenu',
        'label' => $this->t('Muser navigation'),
        'label_id' => 'block-muserusermenu-menu',
      ],
      '#menu_items' => $menu_items,
      '#cache' => [
        'contexts' => [
          'user.roles',
          'user',
          'url.path',
        ],
      ],
    ];

    $renderer = \Drupal::service('renderer');
    $renderer->addCacheableDependency($build, $this->currentUser);

    return $build;

  }

}

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

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