Вы здесь

Как в user account menu показывалось имя текущего юзера?

0

Использую hook_link_alter чтобы вместо "My account" в user account menu показывалось имя текущего юзера.

Вот код:

/**
 * Implements hook_link_alter().
 */
function tanw_link_alter(&$variables) {

  /**
   * The URL of the link.
   *
   * @var Url
   */
  $url = $variables['url'];

  // Return early where possible.
  if ($url->isExternal()) return;

  $route_name = $url->getRouteName();
  if ($route_name != 'user.page') {
    return;
  }
  elseif ($variables['text'] == 'My account') {
    $variables['text'] =  \Drupal::currentUser()->getDisplayName(); 
  } 
}

Проблема в том, что иногда пользователь видит в правом верхнем углу имя ДРУГОГО пользователя. То есть такое впечатление, что при первом заходе любого юзера после чистки кэша что-то где-то зачем-то закэшивается и потом показывается из кэша уже всем подряд. Как бы с этим​ бороться?

Версия Drupal: 
8.x
Вопрос задан 15.04.2017 - 18:50

Ответы

0

Нужно изменить контекст кеша, чтобы меню кешировалось для каждого пользователя отдельно. Проще всего сделать свой MenuLink плагин. Пример есть в модуле user (LoginLogoutMenuLink).

Ответ дан 15.04.2017 - 20:25
Аватар пользователя Chi
Chi
68

Спасибо, буду разбираться с этим. А может есть более удачный хук, где это можно сделать проще?

Комментарий оставлен 16.04.2017 - 08:57
0
{% import _self as menus %}

{{ menus.menu_links(items, attributes, 0, user.account.name) }}
{% macro menu_links(items, attributes, menu_level, formatted_name) %}
  {% import _self as menus %}
  {% if items %}
    {% if menu_level == 0 %}
      <ul{{ attributes.addClass('user-menu') }}>
    {% else %}
      <ul class="sub-menu">
    {% endif %}
    {% for item in items %}
      {%
        set classes = [
          'menu-item',
          item.is_expanded ? 'menu-item--expanded',
          item.is_collapsed ? 'menu-item--collapsed',
          item.in_active_trail ? 'menu-item--active-trail',
        ]
      %}
      <li{{ item.attributes.addClass(classes) }}>
            {% if formatted_name and item.title == "My account" or item.title == "Учётная запись" %}
              {{ link(formatted_name, item.url) }}
      {% else %}
                {{ link(item.title, item.url) }}
            {% endif %}
        {% if item.below %}
          {{ menus.menu_links(item.below, attributes, menu_level + 1) }}
        {% endif %}
      </li>
    {% endfor %}
    </ul>
  {% endif %}
{% endmacro %}
Ответ дан 16.04.2017 - 13:16

Отличная идея, спасибо! Это же должно называться menu--user.html.twig, я правильно понял?
Только попробую выцеплять нужную ссылку не по item.title == "My account"/"Учетная запись", а по item.url == "/adminpage" - так совсем красиво будет, и при добавлении языков не сломается.

Комментарий оставлен 16.04.2017 - 15:46

он самый)
тоже попробую adminpage)

Комментарий оставлен 24.04.2017 - 18:55