Je veux générer les éléments html et leurs classes pour s'adapter à mon style du menu principal.
Je suis confus par toutes les quasi-possibilités offertes dans la documentation de l'API et en regardant les thèmes principaux, etc. et je ne vois toujours pas vraiment ce que je dois faire, ni où je dois le faire.
Je serais très reconnaissant d'avoir des indications claires pour:
Vraisemblablement, dans MYTHEME.theme
J'aurai besoin d'une fonction de prétraitement quelconque à ajouter aux attributes
et item.attributes
variables qui links.html.twig
utilise pour imprimer le menu ul
et l'élément de menu li
.
[Mise à jour] Jusqu'à présent, j'ai découvert une façon de placer des classes dans le ul
du menu principal, mais idéalement, j'aimerais ajouter une classe au ul
de chaque sous-menu indiquant la profondeur du sous-menu.
Et je ne trouve pas de documentation ou d'exemples à partir desquels je peux comprendre la génération/modification des différents éléments li
nk du menu principal.
Cette fonction va dans le fichier MYTHEME.theme
.
function MYTHEME_preprocess_page(&$variables) {
// Pass the main menu and secondary menu to the template as render arrays.
if (!empty($variables['main_menu'])) {
$variables['main_menu']['#attributes']['id'] = 'main-menu-links';
$variables['main_menu']['#attributes']['class'] = array('links', 'clearfix', 'MYNEW_class');
}
}
Remplacez le fichier twig pour le menu principal en enregistrant menu--main.html.twig
Dans votre thème. Copiez le menu.html.twig original de /core/modules/system/templates/menu.html.twig
Ou /core/themes/classy/templates/navigation/menu.html.twig
si votre thème s’étend de Classy.
Vous pouvez ensuite modifier la macro Twig utilisée pour générer la sortie du menu. Pour obtenir une classe sur les ul pour indiquer le niveau, vous pouvez faire ceci:
{% if menu_level == 0 %}
<ul{{ attributes.addClass('menu', 'menu-level--' ~ menu_level) }}>
{% else %}
<ul class="menu {{ 'menu-level--' ~ menu_level }}">
{% endif %}
Vous pouvez faire des manipulations similaires aux li:
<li{{ item.attributes }}>
Tack sur .addClass('class-name')
pour des attributs comme ceci:
<li{{ item.attributes.addClass('class-name') }}>
Si vous êtes un snob HTML/nom de classe comme moi, vous pouvez également supprimer des classes comme ceci: {{ item.attributes.removeClass('menu-item') }}
Ce que j'ai fait sur la ligne au-dessus de li
dans la boucle for
.
La façon d'obtenir le menu principal avec des éléments à tous les niveaux a été résolue dans Drupal 8 - "Implémenter les liens de menu en tant que plugins", essayant de construire une arborescence de men
Pour ajouter une classe à ul et li, nous avons eu 3 options:
A. Menu prioritaire Service d'arbre:
P.S: Pas très sûr, si vous avez besoin de faire tout ce remplacement pour ajouter de la classe.
Remplacez simplement la construction d'arbre sur la couche de thème:
C. Utilisation de Drupal.behaviors.MYTHEME en JavaScript (à partir de https://www.drupal.org/project/gratis )