В идеале при кастомизации Discourse с помощью тем или плагинов следует использовать CSS, JavaScript Plugin API или plugin outlets. Если ни один из этих методов не подходит для вашего случая, не стесняйтесь открыть PR в ядро Discourse или создать тему с тегом Development здесь, на Meta. Мы всегда рады обсудить добавление новых outlets/API для упрощения кастомизации.
Если вы исчерпали все остальные варианты, возможно, вам придётся прибегнуть к переопределению шаблонов. Этот метод позволяет полностью переопределить шаблон любого компонента Ember или маршрута из вашей темы/плагина.
Это не рекомендуемый способ кастомизации Discourse. Ежедневные изменения в ядре Discourse в конечном итоге приведут к конфликтам с вашим переопределением шаблона, что может вызвать катастрофические ошибки при отображении форума.
Если вы решите использовать этот подход, убедитесь, что у вас есть достаточные процессы автоматизированного тестирования и контроля качества для обнаружения регрессий. Если вы распространяете тему или плагин с переопределением шаблонов, пожалуйста, убедитесь, что администраторы форумов осведомлены о рисках нестабильности, которые несёт ваша тема/плагин.
![]()
![]()
Обновление за октябрь 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, даже если у компонента ядра есть «колокальный» (colocated) шаблон.
Переопределение шаблонов маршрутов
Переопределение шаблонов маршрутов (то есть всех не-компонентных шаблонов из templates/*) работает так же, как и для компонентов. Создайте шаблон с таким же именем в вашей теме или плагине. Например, чтобы переопределить discovery.hbs в ядре, создайте файл по пути:
{theme}/javascripts/discourse/templates/discovery.hbs
{plugin}/assets/javascripts/discourse/templates/discovery.hbs
Взаимодействие между несколькими темами / плагинами
Если несколько установленных тем или плагинов переопределяют один и тот же шаблон, «победителем» становится тот, у которого наименьший номер ранга в следующем списке:
- Переопределения тем (побеждает тема с наибольшим «id»)
- Переопределения плагинов (побеждает плагин с наибольшим алфавитным именем)
- Ядро
Это правило приоритетов также означает, что вы можете переопределять шаблоны плагинов из тем. Технически вы также можете переопределять шаблоны тем из других тем и шаблоны плагинов из других плагинов, но поведение может быть неожиданным из-за зависимости от имени плагина и идентификатора темы.
Как это работает?
Discourse собирает и расставляет приоритеты шаблонам в классе DiscourseTemplateMap. Для колокальных шаблонов компонентов эта информация используется во время инициализации приложения для замены ассоциаций шаблонов ядра. Для всех остальных шаблонов карта используется разрешителем во время выполнения для получения правильного шаблона.
Этот документ находится под контролем версий — предложите изменения на GitHub.