菜单令牌Drupal 8替代

时间:2017-01-18 10:20:45

标签: drupal drupal-8 drupal-commerce drupal-navigation

我目前正在将一个大型Drupal商业网站从drupal 7移动到drupal 8。

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

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

user / 用户ID / orders

有没有一种方法可以在没有菜单标记模块的情况下执行此操作?

1 个答案:

答案 0 :(得分:1)

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

您的活动订阅者可能如下所示:

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;
  }
}