2017-01-18 10 views
0

Я в настоящее время на процессе перемещения большого Drupal сайта коммерции от Drupal 7 до 8. ДрупалМеню Токена Drupal 8 Альтернатива

Одна из самых больших проблем, которые я натолкнулся до сих пор является отсутствием версий D8 из хорошо используемых модулей, основным из которых является токен меню.

Мне нужно это, чтобы создать пользовательское меню в области учетной записи пользователя на сайте со ссылками на заказы. Мне нужно beable включить текущий идентификатор пользователя в URL:

пользователя/User ID/заказах

Есть ли способ сделать это без маркеров модуля меню?

ответ

1

Один из способов борьбы с ним, до тех пор, пока модуль токена меню не будет готов к 8, - это сделать перенаправление самостоятельно. Вы можете сделать это, выполнив EventSubscriber. Это позволяет сделать замену маркера и перенаправить ответ - т. Е. Если ваш путь к меню - это/user/{user}/orders, вы заменяете {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; 
    } 
}