Меню Token Drupal 8 альтернатива
В настоящее время я нахожусь в процессе перемещения большого коммерческого сайта Drupal с drupal 7 на drupal 8.
Одна из самых больших проблем, с которыми я сталкивался до сих пор, - это отсутствие версий D8 хорошо используемых модулей, основным из которых является Menu Token.
Это нужно для создания пользовательского меню в разделе "Аккаунт пользователя" на сайте со ссылками на заказы. Мне нужно иметь возможность включить текущий идентификатор пользователя в URL:
пользователь /идентификатор пользователя/ заказы
Есть ли способ сделать это без модуля Menu Token?
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;
}
}