Идеальный способ кастомизации Discourse с помощью тем или плагинов — использовать CSS, JavaScript Plugin API или plugin outlets. Если ни один из этих вариантов не подходит для вашего случая, вы можете открыть PR в ядро Discourse или создать тему в разделе Development на Meta. Мы всегда рады обсудить добавление новых outlets/API, чтобы упростить кастомизацию.
Если вы исчерпали все остальные варианты, возможно, вам придется прибегнуть к переопределению шаблонов (template overrides). Эта техника позволяет вам переопределить весь шаблон любого компонента или маршрута 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»)
- Переопределения плагинов (выигрывает плагин с последним именем в алфавитном порядке)
- Ядро
Этот приоритет также означает, что вы можете переопределять шаблоны плагинов из тем. Технически вы также можете переопределять шаблоны тем из других тем, а также шаблоны плагинов из других плагинов, но поведение может быть неожиданным из-за зависимости от имени плагина и id темы.
Как это работает?
Discourse собирает и приоритизирует шаблоны в классе DiscourseTemplateMap. Для колотированных шаблонов компонентов эта информация используется во время инициализации приложения для замены ассоциаций шаблонов ядра. Для всех остальных шаблонов карта используется резолвером во время выполнения для получения правильного шаблона.
Этот документ управляется версиями - предложите изменения на github.