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="<front>">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.
Vous pouvez essayer ce code:
{% set tmp = '<span>'~item.title~'</span>' %}
{% set link_text %}{{ tmp|raw }}{% endset %}
{{ link(link_text, item.url) }}
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;
}