Puncte:0

Template preprocess to generate Font Awesome markup for menu links

drapel 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
drapel in
Modulul [Font Awesome Menu Icons](https://www.drupal.org/project/fontawesome_menu_icons) ar trebui să fie de ajutor. Cel puțin ca referință.
Puncte:0
drapel nr

Am mers cu această soluție convenabilă:

https://github.com/gnikolovski/link_alter

Dezvoltatorul are o postare pe blog despre abordarea sa:

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

Cheia (pentru că răspunsurile numai pe link-uri sunt descurajate) se poate rezuma la aceasta:

În Drupal 8 puteți utiliza hook_link_alter(&$variabile) cârlig pentru a modifica link-urile meniului. [...] Dar, nu există o modalitate ușoară de a identifica acest link de meniu. Nu puteți spune ce meniu conține acest link, așa că, cu excepția cazului în care doriți să modificați toate linkurile de pe site-ul dvs., folosirea acestui cârlig pentru a viza cu precizie linkurile de meniu este o idee proastă.

Cu excepția cazului în care adaugi cumva un identificator.

Din fericire, puteți face asta cu ușurință și face toate acestea mai dinamice. Poți să folosești form_alter() agățați pentru a modifica formularul de editare a linkului de meniu și adăugați ceva de genul acesta: introduceți descrierea imaginii aici

Mulțumită @sonfd pentru sfatul din comentariu, care ar putea fi chiar mai bun:

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

Deoarece mi-am rezolvat deja problema și am un termen limită, s-ar putea să nu verific modulul imediat. Dar este bine de știut că există!

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.