0

我目前正在将大型 Drupal 商务网站从 drupal 7 迁移到 drupal 8。

到目前为止,我遇到的最大问题之一是缺乏 D8 版本的常用模块,主要是 Menu Token。

我需要这个在网站的用户帐户区域创建一个带有订单链接的自定义菜单。我需要能够在 url 中包含当前用户 ID:

用户/用户ID /订单

没有菜单令牌模块有没有办法做到这一点?

4

1 回答 1

2

在菜单令牌模块准备好 8 之前,一种处理方法是自己进行重定向。您可以通过实现 EventSubscriber 来做到这一点。这使得可以进行令牌替换并重定向响应 - 即,如果您的菜单路径是 /user/{user}/orders 您将 {user} 替换为当前用户 ID 并重定向响应。

您的事件订阅者可能如下所示:

namespace Drupal\YOUR_MODULENAME\EventSubscriber;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;


class RedirectRequestEventSubscriber implements EventSubscriberInterface {

  public function checkUserUidRedirection(GetResponseEvent $event) {
    if (\Drupal::currentUser()->isAnonymous()) {
      return;
    }
    $request_uri = urldecode(\Drupal::request()->getRequestUri());
    if (preg_match('/\{user\}/', $request_uri)) {
      $current_user = \Drupal::currentUser()->id();
      $request_uri = preg_replace('/\{user\}/', $current_user, $request_uri);
      $response = new RedirectResponse($request_uri, 301);
      $response->send();
    }
  }

  /**
   * {@inheritdoc}
   */
  public static function getSubscribedEvents() {
    $events[KernelEvents::REQUEST][] = array('checkUserUidRedirection');
    return $events;
  }
}
于 2017-02-23T10:58:27.930 回答