이상적으로는 Discourse를 테마/플러그인으로 커스텀할 때 CSS, JavaScript 플러그인 API, 또는 플러그인 아웃렛을 사용해야 합니다. 이 중 어느 것도 사용 사례에 맞지 않는다면, Discourse 코어에 PR을 열거나 Meta의 Development 토픽에서 대화를 시작해 주세요. 커스텀을 더 쉽게 만들기 위해 새로운 아웃렛/API를 추가하는 것에 대해 항상 논의하는 것을 환영합니다.
모든 다른 옵션을 다 시도해 보았음에도 불구하고 템플릿 오버라이드가 필요한 경우가 있습니다. 이 기법은 테마/플러그인에서 어떤 Ember 컴포넌트나 라우트의 전체 템플릿을 오버라이드할 수 있게 해줍니다.
이것은 Discourse를 커스텀하는 권장되지 않는 방법입니다. Discourse 코어의 일상적인 변경 사항은 결국 템플릿 오버라이드와 충돌할 것이며, 포럼 렌더링 시 치명적인 오류를 일으킬 수 있습니다.
이 접근 방식을 결정했다면, 회귀를 감지하기 위한 충분한 자동화 테스트와 QA 프로세스를 갖추고 있는지 확인하세요. 템플릿 오버라이드가 포함된 테마/플러그인을 배포하는 경우, 포럼 관리자가 해당 테마/플러그인이 내포하는 안정성 위험을 인지하고 있는지 반드시 확인해야 합니다.
![]()
![]()
2023년 10월 업데이트: 새로운 기능에 대해 Discourse는 점점 더 Ember의
.gjs파일 형식으로 작성된 컴포넌트 사용으로 이동하고 있습니다. 이러한 컴포넌트의 템플릿은 인라인으로 정의되며, 테마/플러그인에 의해 오버라이드될 수 없습니다.앞으로 모든 템플릿 커스텀은 플러그인 아웃렛을 사용하여 수행해야 합니다.
가까운 미래에 이것이 깨질 것이라는 것을 알고 있지만, 그래도 문서를 보여주세요
컴포넌트 템플릿 오버라이드
Ember 컴포넌트 템플릿(즉, Discourse 코어의 components/* 아래에 있는 모든 것)를 오버라이드하려면, 테마/플러그인에서 동일한 이름을 가진 .hbs 파일을 생성해야 합니다. 예를 들어, Discourse 코어의 badge-button 컴포넌트 템플릿을 오버라이드하려면, 테마/플러그인의 다음 위치에 템플릿 파일을 생성해야 합니다:
{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 클래스에서 템플릿을 조립하고 우선순위를 부여합니다. 동반(colocated) 컴포넌트 템플릿의 경우, 해당 정보는 앱 초기화 동안 코어 템플릿 연관성을 대체하는 데 사용됩니다. 모든 다른 템플릿의 경우, 이 맵은 런타임의 리졸버에 의해 올바른 템플릿을 가져오는 데 사용됩니다.
이 문서는 버전 관리됩니다 - github에서 변경 사항을 제안하세요.