В идеале при кастомизации Discourse через темы или плагины следует использовать CSS, JavaScript Plugin API или plugin outlets. Если ни один из этих методов не подходит для вашего случая, не стесняйтесь создать PR в ядро Discourse или начать тему с тегом Development на Meta. Мы всегда рады обсудить добавление новых outlets/API для упрощения кастомизации.
Если вы исчерпали все другие варианты, возможно, вам придется прибегнуть к переопределению шаблонов (template overrides). Этот метод позволяет переопределить весь шаблон любого компонента Ember или маршрута из вашей темы или плагина.
Это не рекомендуемый способ кастомизации Discourse. Ежедневные изменения в ядре Discourse в конечном итоге приведут к конфликтам с вашим переопределением шаблона, что может вызвать катастрофические ошибки при отображении форума.
Если вы решите использовать этот подход, убедитесь, что у вас есть достаточные процессы автоматизированного тестирования и QA для обнаружения регрессий. Если вы распространяете тему или плагин с переопределением шаблонов, пожалуйста, убедитесь, что администраторы форумов осведомлены о рисках нестабильности, которые несет ваша тема или плагин.
:rotaching_light:
![]()
Обновление за октябрь 2023 года: Для новых функций Discourse всё чаще переходит к использованию компонентов, созданных с использованием формата файлов
.gjsв Ember. Шаблоны для этих компонентов определяются внутри файла и не могут быть переопределены темами или плагинами.В дальнейшем вся кастомизация шаблонов должна выполняться с использованием Plugin Outlets
Я понимаю, что это скоро перестанет работать, но покажите мне документацию всё равно
Переопределение шаблонов компонентов
Чтобы переопределить шаблон компонента Ember (то есть любой элемент в components/* в ядре Discourse), создайте файл с таким же именем .hbs в вашей теме или плагине. Например, чтобы переопределить шаблон компонента badge-button в ядре Discourse, создайте файл шаблона в вашей теме или плагине по следующему пути:
{theme}/javascripts/discourse/templates/components/badge-button.hbs
{plugin}/assets/javascripts/discourse/templates/components/badge-button.hbs
Переопределение всегда должно быть вложено в директорию /templates, даже если у основного компонента есть «колокализованный» шаблон.
Переопределение шаблонов маршрутов
Переопределение шаблонов маршрутов (то есть всех не-компонентных шаблонов в templates/*) работает так же, как и для компонентов. Создайте шаблон с таким же именем в вашей теме или плагине. Например, чтобы переопределить discovery.hbs в ядре, создайте файл:
{theme}/javascripts/discourse/templates/discovery.hbs
{plugin}/assets/javascripts/discourse/templates/discovery.hbs
Переопределение «сырых» шаблонов (.hbr)
Система «сырых» шаблонов Discourse скоро будет заменена обычными компонентами Ember. Но до тех пор переопределение сырых шаблонов работает так же, как и шаблонов Ember. Например, чтобы переопределить topic-list-item.hbr в ядре, можно создать файл:
{theme}/javascripts/discourse/templates/list/topic-list-item.hbr
{plugin}/assets/javascripts/discourse/templates/list/topic-list-item.hbr
Взаимодействие нескольких тем / плагинов
Если несколько установленных тем или плагинов переопределяют один и тот же шаблон, «победителем» становится тот, у которого наименьший номер ранга в этом списке:
- Переопределения тем (побеждает тема с наибольшим «id»)
- Переопределения плагинов (побеждает плагин с последним алфавитным именем)
- Ядро
Эта приоритетность также означает, что вы можете переопределять шаблоны плагинов из тем. Технически вы также можете переопределять шаблоны тем из других тем и шаблоны плагинов из других плагинов, но поведение может быть неожиданным из-за зависимости от имени плагина и id темы.
Как это работает?
Discourse собирает и определяет приоритеты шаблонов в классе DiscourseTemplateMap. Для колокализованных шаблонов компонентов эта информация используется во время инициализации приложения для замены ассоциаций шаблонов ядра. Для всех остальных шаблонов карта используется разрешителем во время выполнения для получения правильного шаблона.
Этот документ находится под контролем версий — предложите изменения на GitHub.