Điểm:0

Template preprocess to generate Font Awesome markup for menu links

lá cờ 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
lá cờ in
Mô-đun [Biểu tượng menu tuyệt vời về phông chữ](https://www.drupal.org/project/fontawesome_menu_icons) sẽ hữu ích. Ít nhất là như một tài liệu tham khảo.
Điểm:0
lá cờ nr

Tôi đã đi với giải pháp thiết thực này:

https://github.com/gnikolovski/link_alter

Nhà phát triển có một bài đăng trên blog về cách tiếp cận của mình:

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

Điểm mấu chốt của nó (vì các câu trả lời chỉ liên kết không được khuyến khích) có thể được rút gọn thành điều này:

Trong Drupal 8, bạn có thể sử dụng hook_link_alter(&$biến) hook để thay đổi liên kết menu. […]Nhưng, không có cách nào dễ dàng để xác định liên kết menu này. Bạn không thể biết menu nào chứa liên kết này, vì vậy trừ khi bạn muốn thay đổi tất cả các liên kết trên trang web của mình, sử dụng hook này để nhắm mục tiêu chính xác các liên kết menu là một ý tưởng tồi.

Trừ khi, bằng cách nào đó bạn thêm một số nhận dạng.

May mắn thay, bạn có thể dễ dàng làm điều đó và làm cho tất cả điều này trở nên năng động hơn. Bạn có thể dùng form_alter() hook để thay đổi biểu mẫu chỉnh sửa liên kết menu và thêm một cái gì đó như thế này: nhập mô tả hình ảnh ở đây

Nhờ vào @sonfd để biết mẹo trong nhận xét, điều này có thể còn tốt hơn nữa:

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

Vì tôi đã giải quyết được vấn đề của mình và đang đến hạn chót nên tôi có thể không kiểm tra mô-đun đó ngay. Nhưng thật tốt khi biết rằng nó tồn tại!

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.