Навігація по сторінці
В Albireo є корисние поле для формування списку із заголовків поточної сторінки, що полегшує навігацію у статті, особливо, якщо вона структурована і достатньо довга.
Стандартний підхід
З коробки, Albireo пропонує підключення сніппету, який, по суті, є нічим іншим, як скриптом JS, для підключення до будь-якої сторінки. Результатом, згідно довідника, буде формування навігації з html-тегів другого рівня <h2> поточної сторінки, оформлене в три колонки.
<div class="article_navigation"></div>
<?= snippet('article-navigation-flat') ?>
Варіації стандарту
Можна змінювати ім'я адженди в сніпеті, або додати 'h2,h3' як параметр, що логічно додасть теги <h3> до списку (не пам'ятаю, чи це документовано саме так, але воно спрацьовує).
<div class="article_navigation"></div>
<?= snippet('article-navigation-flat', 'h2,h3', 'Навігація по тегах h2,h3') ?>
Результат виглядатиме так:
Звісно, це треба розміщувати на початку статті, або оформити на свій смак де-інде.
Нестандартний підхід
Чи достатньо коробочного виводу - кожен вирішує сам, але ми спробували трохи погратись на таку тему й створити древовидну структуру списків, які візуалізують ієрархію. Хочу зауважити, що наведений нижче код написаний без підглядання до авторського стандартного, тому критика має бути напралена виключно на автора статті.
Одинарний список <h2>
Це виведе список по тегу 'h2', але, на відміну від авторського - в один стовпчик.
<ul class="height" id="h2-list"></ul>
<script>
document.addEventListener('DOMContentLoaded', function () {
// Знаходимо всі елементи <h2>
const h2Elements = document.querySelectorAll('h2');
const ulElement = document.getElementById('h2-list');
// Перетворюємо NodeList у масив та перебираємо кожен заголовок
h2Elements.forEach((h2, index) => {
// Додаємо унікальний id для кожного <h2>
const id = `section${index + 1}`;
h2.setAttribute('id', id);
// Створюємо елемент <li> зі посиланням <a>
const li = document.createElement('li');
const anchor = document.createElement('a');
// Створюємо текст і посилання для анкора
anchor.textContent = h2.textContent;
anchor.href = `#${id}`;
// Додаємо посилання до <li> і <li> до <ul>
li.appendChild(anchor);
ulElement.appendChild(li);
}
});
</script>
Одинарні списки <h2> та <h3>
Наступний скрипт - звичайний розвиток попереднього, але з виводом окремих списків для кожного тега. Практичну потребу в такому варіанті уявити важкувато, тому його код ми наводити не будемо, хоча результат продемонструємо:
Комбіновані списки з <h2> та <h3>
Скрипт генерації древовидної структури сторінки, зформованої по тегах заголовків на льоту. Виводиться одним блоком, до того ж він працюватиме й за межами Albireo.
<ul id="toc-list"></ul>
<script>
document.addEventListener('DOMContentLoaded', function () {
// Знаходимо всі елементи <h2> та <h3>
const headings = document.querySelectorAll('h2, h3');
const ulElement = document.getElementById('toc-list');
let currentUl = ulElement;
headings.forEach((heading, index) => {
// Створюємо унікальний id для кожного заголовка
const id = `section${index + 1}`;
heading.setAttribute('id', id);
// Створюємо елемент <li> зі посиланням <a>
const li = document.createElement('li');
const anchor = document.createElement('a');
anchor.textContent = heading.textContent;
anchor.href = `#${id}`;
// Додаємо посилання до <li>
li.appendChild(anchor);
// Якщо це <h2>, додаємо його в основний список
if (heading.tagName.toLowerCase() === 'h2') {
ulElement.appendChild(li);
// Створюємо новий підсписок для <h3>, якщо він з'явиться
currentUl = document.createElement('ul');
li.appendChild(currentUl);
} else if (heading.tagName.toLowerCase() === 'h3') {
// Якщо це <h3>, додаємо його у підсписок до поточного <h2>
currentUl.appendChild(li);
}
}
});
</script>
На виході отримаємо більш логічну древовидну структуру заголовків такого плану:
Таке уже можна додавати до свого проекту в теку albireo/website/templates/default/assets/js наприклад, під назвою htree.js, або у вигляді сніппета. Після чого, не забудьте його підключити разом з іншими полями в коді PHP отак: js.lazy[]: htree.js. Головне, - ці скрипти мають розміщуватися в кінці розмітки, перед закриваючим /body, щоби DOM встиг завантажитись повністю. Порівняйте результат зі стандартним на початку статті та виберіть варіант, який вам до вподоби.
Ну й на цьому все сьогодні.