В экземпляре Discourse, который я поддерживаю, есть компонент (наследованный от предыдущего администратора экземпляра) для отображения логотипов спонсоров этого экземпляра в подвале. Компонент работал корректно до недавнего времени, но теперь он отображается неправильно: директивы управления шаблоном выводятся буквально (а плейсхолдеры значений шаблона вставляются в HTML буквально, из-за чего пути к изображениям не разрешаются):
Компонент не хранится в git-репозитории, он настроен напрямую через «Администрирование» → «Внешний вид» → «Темы и компоненты» → вкладка «Компоненты»:
Пользовательский код
Пользовательские секции:
- Общие: CSS, Подвал, JS
Загрузки
- $geoaargau: geoaargau.jpg
- $asseco_berit: asseco_berit.jpg
Дополнительные файлы
Экспортируйте тему, чтобы просмотреть эти файлы.
- javascripts/discourse/api-initializers/theme-initializer.gjs
Содержимое этих «секций»
как видно при нажатии «Редактировать код»; путь к соответствующим файлам в экспорте указан в скобках
CSS (common/common.scss)
.sponsors {
.inner {
display: flex;
align-items: center;
justify-content: space-around;
margin-bottom: 10px;
}
.heading {
font-size: 1.75em;
}
.sponsor-image {
max-height: 55px;
}
.geoaargau {
max-height: 45px;
}
}
Подвал (common/footer.html)
{{#if displaySponsors}}
<div class="sponsors-wrapper wrap">
<div class="inner">
<h3 class="heading">Sponsoren</h3>
<a href="http://www.asseco-berit.ch/"><img src="{{theme-setting "theme_uploads.asseco_berit"}}" alt="Asseco Berit" class="sponsor-image asseco-berit"></a>
<a href="http://www.geoaargau.ch/"><img src="{{theme-setting "theme_uploads.geoaargau"}}" alt="GEOAargau" class="sponsor-image geoaargau"></a>
</div>
</div>
{{/if}}
JS (javascripts/discourse/api-initializers/theme-initializer.gjs)
import { apiInitializer } from "discourse/lib/api";
export default apiInitializer((api) => {
// Это выходной интерфейс плагина, за которым следует пользовательское имя компонента
api.registerConnectorClass("above-footer", "sponsors", {
setupComponent(args, component) {
var topMenuRoutes =
component.siteSettings.top_menu.split('|')
.map(function(route) {return '/' + route});
var homeRoute = topMenuRoutes[0];
api.onPageChange((url) => {
if (url === "/" || url === homeRoute ){
document.querySelector("html").classList.add("sponsors");
component.set("displaySponsors", true);
} else {
document.querySelector("html").classList.remove("sponsors");
component.set("displaySponsors", false);
}
});
}
});
});
В экспорте также содержится:
about.json (466 Bytes)
что, полагаю, генерируется на лету при экспорте, поэтому я не считаю его релевантным.
Релевантная часть фактического DOM с этой ошибкой:
<div class="custom-footer-content">
{{#if displaySponsors}}
<div class="sponsors-wrapper wrap">
<div class="inner">
<h3 class="heading">Sponsoren</h3>
<a href="http://www.asseco-berit.ch/"><img src="{{theme-setting " theme_uploads.asseco_berit"}}"="" alt="Asseco Berit" class="sponsor-image asseco-berit"></a>
<a href="http://www.geoaargau.ch/"><img src="{{theme-setting " theme_uploads.geoaargau"}}"="" alt="GEOAargau" class="sponsor-image geoaargau"></a>
</div>
</div>
{{/if}}
</div>
здесь видно, что директива управления {{#if ...}}...{{/if}} и плейсхолдеры {{theme-setting "..."}} были использованы как обычный HTML, а не выполнены/оценены/интерполированы.
Как и почему это изменилось, и как мне это исправить?
Возможно, это связано с Upcoming Header Changes - Preparing Themes and Plugins? (Хотя я не вижу упоминания изменений синтаксиса шаблонов там.)
