Очень полезно, большое спасибо!
Я пробовал использовать этот код, но, похоже, он не работает.
Я вижу контейнер breadcrumbsContainer и его белый фон, но внутри него не генерируются хлебные крошки.
Я пробовал использовать его как компонент и напрямую как часть темы в разделе “Custom CSS/HTML”.
Есть ли какие-то идеи, что я могу делать не так?
Да, @DogBite, решение заключается в том, чтобы добавить теги Script в начало и в конец файла header.html…
В начале:
<script type="text/discourse-plugin" version="0.8">
В конце:
</script>
Вот как это выглядит…
<script type="text/discourse-plugin" version="0.8">
api.onPageChange((url) => {
updateBreadcrumbs(url);
});
const updateBreadcrumbs = (url) => {
// Вспомогательная функция для сброса контейнера хлебных крошек
const resetBreadcrumbs = () => {
$("#breadcrumbsContainer").empty();
// Если на главной странице
if (url === '/') {
$("#breadcrumbsContainer").append(`
<li class="breadcrumb-item">
<a href="YOUR HOME"><i class="home">HOME</i></a>
</li>
<li class="breadcrumb-item active">
Сообщество
</li>
`);
} else {
$("#breadcrumbsContainer").append(`
<li class="breadcrumb-item">
<a href="YOUR HOME"><i class="home">HOME</i></a>
</li>
<li class="breadcrumb-item">
<a href="/">Сообщество</a>
</li>
`);
}
};
resetBreadcrumbs();
if (url.includes('/c/')) {
// Если на странице категории
const categorySlugOrId = url.split('/')[2];
$.ajax({
type: "GET",
url: `/c/${categorySlugOrId}/show.json`,
success: function(response) {
if (response && response.category && response.category.name) {
const categoryTitle = response.category.name;
$("#breadcrumbsContainer").append(`
<li class="breadcrumb-item active">
${categoryTitle}
</li>
`);
}
},
error: function(error) {
console.error("Ошибка при получении деталей категории", error);
}
});
} else if (url.includes('/t/')) {
// Если на странице темы
const topicId = url.split('/')[2];
$.ajax({
type: "GET",
url: `/t/${topicId}.json`,
success: function(response) {
if (response && response.title) {
const topicTitle = response.title;
const categoryId = response.category_id;
// Теперь получаем название категории, используя её ID
$.ajax({
type: "GET",
url: `/c/${categoryId}/show.json`,
success: function(categoryResponse) {
if (categoryResponse && categoryResponse.category) {
const categoryTitle = categoryResponse.category.name;
const categoryURL = `/c/${categoryResponse.category.slug}`;
$("#breadcrumbsContainer").append(`
<li class="breadcrumb-item">
<a href="${categoryURL}">${categoryTitle}</a>
</li>
<li class="breadcrumb-item active">
${topicTitle}
</li>
`);
}
},
error: function(error) {
console.error("Ошибка при получении деталей категории для темы", error);
}
});
}
},
error: function(error) {
console.error("Ошибка при получении деталей темы", error);
}
});
}
}
</script>
Здесь я реализовал очень простой компонент темы «Хлебные крошки» (в виде ссылок), где на главной странице хлебные крошки не отображаются… PR приветствуются!
Также (что важно) в настоящее время это работает корректно только с категориями — подкатегории не обрабатываются!
Вот как это выглядит на странице списка категорий…
А вот как это выглядит на странице темы…
При более детальном изучении выяснилось, что в начале этого года в Discourse был добавлен компонент хлебных крошек: FEATURE: Introduce DBreadcrumbs components (#27049) · discourse/discourse@1239178 · GitHub. В настоящее время он отображается только на отдельных страницах администратора.
Поэтому я создал тестовый компонент для отображения хлебных крошек: Manuel Kostka / Discourse / Components / Breadcrumbs · GitLab. Текущий шаблон выглядит так:
<template>
{{#if this.currentPage}}
{{bodyClass "has-breadcrumbs"}}
<ul class="breadcrumbs {{concat '--' settings.plugin_outlet}}">
<li class="breadcrumbs__item --home">
{{#if this.homePage}}
{{i18n "js.home"}}
{{else}}
<a href="/">{{i18n "js.home"}}</a>
{{/if}}
</li>
{{#if this.parentCategory}}
<li class="breadcrumbs__item --parent">
<a href="/c/{{this.parentCategoryLink}}">
{{this.parentCategoryName}}</a>
</li>
{{/if}}
{{#unless this.homePage}}
<li class="breadcrumbs__item --current">
{{this.currentPage}}
</li>
{{/unless}}
</ul>
{{/if}}
</template>
Теперь я создал ветку, использующую новый компонент DBreadcrumbs: Files · dbreadcrumbs · Manuel Kostka / Discourse / Components / Breadcrumbs · GitLab. Это сделало бы шаблон более лаконичным и, полагаю, в целом обеспечило бы лучшую согласованность и доступность:
<template>
{{#if this.currentPage}}
{{bodyClass "has-breadcrumbs"}}
<DBreadcrumbsContainer class="{{concat '--' settings.plugin_outlet}}" />
<DBreadcrumbsItem @path="/" @label={{i18n "js.home"}} />
{{#if this.parentCategory}}
<DBreadcrumbsItem
@path="/c/{{this.parentCategoryLink}}"
@label={{this.parentCategoryName}}
/>
{{/if}}
{{#unless this.homePage}}
<DBreadcrumbsItem @path="" @label={{this.currentPage}} />
{{/unless}}
{{/if}}
</template>
Однако при использовании DBreadcrumbsItem порядок отображения родительской категории и подкатегории в отрендеренном компоненте нарушается. Текущая категория вставляется первой:
Интересно, связано ли это с поведением, описанным в сообщении коммита?
- DBreadcrumbsItem — компонент, регистрирующий LinkTo
для цепочки хлебных крошек. Цепочка хлебных крошек > будет
отображаться в зависимости от порядка, в котором эти элементы
рендерятся на странице.


