Рейтинг:0

Template preprocess to generate Font Awesome markup for menu links

флаг nr

In Drupal 9, I need the ability to prepend Font Awesome icons to menu links.

I have attached Font Awesome 5 JS and CSS assets to my theme via *.libraries.yml.

If I open a menu link in the DOM inspector and edit the markup of a link from this:

<ul class="clearfix nav">
  <li class="nav-item">
    <a href="#comments" class="nav-link nav-link-comments">Comments</a>
  </li>
</ul>

to this:

<ul class="clearfix nav">
  <li class="nav-item">
    <i class="fas fa-comment"></i><a href="#comments" class="nav-link nav-link-comments">Comments</a>
  </li>
</ul>

The Font Awesome JavaScript detects the empty <i class="fas fa-comment"></i> element, and the result looks exactly like what I want it to look like.

However, it's been very tricky to add that markup to the link element programmatically.

I can do it with JavaScript DOM manipulation in a Drupal behavior, but I'd prefer to prepare the markup in Twig and preprocess.

After trying and rejecting a couple of other modules, I am now looking at menu_link_attributes.

It's very easy to add the class .fa-comment to this menu link:

<ul class="clearfix nav">
  <li class="nav-item">
    <a href="#comments" class="fa-comment nav-link nav-link-comments">Comments</a>
  </li>
</ul>

I'm looking at an old forum thread which explains a template preprocess approach to matching classes starting with fa-, and using that value to generate <i> tags with the needed classes. This approach may have worked with Drupal 7.

The THEME_menu_link() preprocess function does not seem to work in D8 and D9, so I am trying to rewrite it using THEME_preprocess_links(). But when I drop a dump($variables); in this function, I do not see all the menu links.

While I'm looking for a different template preprocess function, I thought I'd describe the issue here, in case it's something you've encountered before.

NOTE: This question is technically a duplicate, but the old one never got answered so I think I'm safe to ask it again.

sonfd avatar
флаг in
Модуль [Font Awesome Menu Icons] (https://www.drupal.org/project/fontawesome_menu_icons) должен помочь. Хотя бы в качестве ссылки.
Рейтинг:0
флаг nr

Я пошел с этим целесообразным решением:

https://github.com/gnikolovski/link_alter

У разработчика есть сообщение в блоге о своем подходе:

http://dev.studiopresent.com/blog/back-end/altering-menu-links

Суть этого (поскольку ответы только по ссылкам не приветствуются) можно свести к следующему:

В Drupal 8 вы можете использовать hook_link_alter(&$переменные) хук для изменения ссылок меню. [...] Но нет простого способа идентифицировать эту ссылку меню. Вы не можете сказать, какое меню содержит эту ссылку, поэтому, если вы не хотите изменять все ссылки на своем сайте, использование этого хука для точного нацеливания на ссылки меню — плохая идея.

Если только вы каким-то образом не добавите идентификатор.

К счастью, вы можете легко сделать это и сделать все это более динамичным. Ты можешь использовать form_alter() hook, чтобы изменить форму редактирования ссылки меню, и добавить что-то вроде этого: введите описание изображения здесь

Благодаря @sonfd за совет в комментарии, который может быть даже лучше:

https://www.drupal.org/project/fontawesome_menu_icons

Поскольку я уже решил свою проблему и у меня крайний срок, я могу не сразу проверить этот модуль. Но хорошо знать, что он есть!

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.