Change Menu My Account to Current User Name

2018-01-04

Drupal 預設的account menu有兩個:my account 跟 login/logout
如何改掉my account顯示登入者的名字呢?
hook 的 function 名字要怎麼叫他才會呼叫到呢?

一開始在twig裏面動手,
把 text = 'my account' 換掉,結果行不通...
最後沒有解決是哪裡出了問題

然後查了很多決定在 .module 裏面做

/*change route user.page title to current user name, but link is always cached*/
function blog_user_manager_menu_links_discovered_alter(&$links) {
  $uid = \Drupal::currentUser()->id();
  $user = \Drupal\user\Entity\User::load($uid);
  $name = $user->getUsername();
  $links['user.page']['title'] = $name;
}

 

以上可以改掉my account的title沒錯,但是link 是在 page render之前做好的?
所以一定會被cache起來,即使我們page cache都關關掉也沒用的。
清掉所有cache後第一次登入是我sean,
之後不論是誰登入還是顯示sean...

為了解決cache的問題和Mark弄了一整天,沒有辦法成功,
大部份是在處理動態route的問題。
最後決定回到render page的層面處理。

/*make account_menu do not cache with user changed*/
function mapleblog2_preprocess_page(&$variables) {
  $variables['page']['navigation_collapsible']['mapleblog2_account_menu']['#cache']['contexts'][] = 
    'user';
}

 

以上使得account menu的render不會cache,
但是$link在這之前已經固定了...

在kint($variables[page])找不到$link title有關的東西,
最後的最後還是得在theme做啊~

讓我們把剛剛那些通通刪掉!

 

答案

找到render menu account的twig然後在custom theme裏面編輯,
在<li>...</li>之間找到印出menu item的地方,

{% if item.title == 'My account' %}
          {{ link(user.displayname, item.url) }}
        {% else %}
          {{ link(item.title, item.url) }}
        {% endif %}

 

drupal8 預設有提供$user給twig用,因此可以使用user裏面的displayname,
不過我們的theme用了macro 這個function來處理menu item,
macro有自己的scope,twig doc
因此我們需要解決如何讓macro裏面也叫到 $user,
Issues with passing a variable to a macro

所以補上user參數傳進去

{{ menus.menu_links(items, attributes, 0, user) }}
{% macro menu_links(items, attributes, menu_level, user) %}

 

成功!

----------------------------------

後記:
cache context加 $user 是必要的,不然該menu block可能會顯示出其他人的名字(cached)

標籤
drupal 8
display user name

留言

Sia on 2018/01/04, 週四 - 17:26

天啊!!!你們好棒棒crying

yes,恭喜,Sean逐步開竅了。從零到今天,真不簡單。

昨晚我還在想Drupal 8搞得這麼複雜,學習門檻這麼高,怎辦?

今天的突破也給我很大的鼓勵,楓葉板社羣的一個主要SIG (Special Interest Group)即是Drupal SIG。Sean真的是MapleBoard Drupal SIG的拓荒者。smiley