web-dev-qa-db-fra.com

Comment puis-je ajouter une balise span dans mon lien de menu?

Mon fichier twig contient les éléments suivants:

<li{{ item.attributes.addClass(classes) }}>
   {{ link(item.title, item.url) }}
</li>

Quelles sorties:

<li class="menu-item item--search">
    <a href="#search" title="Expand Search" data-drupal-link-system-path="&lt;front&gt;">Search</a>
</li>

Mais je veux vraiment ajouter une balise <span> Autour du texte Search (à des fins de style et en remplaçant le texte par une image d'icône.

J'ai essayé de remplacer {{ link(item.title, item.url) }} par <a href="{{item.url}}"><span>{{item.title}}</span></a> Mais cela perd les précieux attributs fournis par la fonction link (ainsi que le module menu_link_attributes). Je ne sais pas si je peux le faire dans twig ou je dois écrire une sorte de fonction dans mon fichier .theme. Toute aide appréciée. Merci.

2
Kris Robinson

Vous pouvez essayer ce code:

{% set tmp = '<span>'~item.title~'</span>' %}
{% set link_text %}{{ tmp|raw }}{% endset %}
{{ link(link_text, item.url) }}
4
Quan Lee

Pour ajouter du balisage à tous les liens, vous pouvez implémenter hook_link_alter () dans un module personnalisé (dans l'exemple suivant nommé mymodule):

use Drupal\Component\Render\FormattableMarkup;

/**
 * Implements hook_link_alter().
 */
function mymodule_link_alter(&$variables) {
  if (!empty($variables['options']['span_added'])) {
    return;
  }

  $variables['text'] = new FormattableMarkup('<span>@title</span>', [
    '@title' => $variables['text'],
  ]);

  $variables['options']['span_added'] = TRUE;
}
2
Mario Steinitz