최근에 Discourse 헤더를 레거시 ‘위젯’ 렌더링 시스템에서 최신 Glimmer 컴포넌트로 업데이트하는 작업을 진행해 왔습니다. 이 변경 사항은 이제 glimmer header mode 사이트 설정을 통해 Discourse 코어에서 사용할 수 있습니다.
대략적인 타임라인
(매우 대략적인 추정치이며, 양방향으로 변경될 수 있음)
2024년 1분기:
-
코어 구현 완료 및 Meta에서 활성화 -
업그레이드 가이드 게시; 콘솔 비추천(deprecation) 메시지 활성화 -
모든 공식 및 제3자 플러그인/테마 업데이트 작업 시작
2024년 2분기:
-
새 헤더 구현을 기본적으로 활성화하기 시작 -
공식 및 제3자 테마/플러그인 업그레이드 준비 완료 -
남은 이슈에 대해 관리자 경고 배너가 트리거되는 비추천 메시지 시작
2024년 3분기:
-
더 넓은 가시성을 위한 공지 토픽 게시: Preparing your community for behind-the-scenes header changes -
2024년 8월 5일 주 (v3.4.0.beta1): 모든 사이트에서 기본적으로 새 헤더 활성화. 관리자는 ‘glimmer header mode’ 사이트 설정을 전환하여 이전 헤더로 되돌릴 수 있습니다. -
2024년 9월 2일 주: 기능 플래그 및 레거시 코드 최종 제거
나에게 어떤 의미가 있는가?
플러그인이나 테마가 헤더를 커스터마이징하기 위해 ‘위젯’ API를 사용한다면, 새 헤더와의 호환성을 위해 업데이트가 필요합니다.
새 헤더를 어떻게 사용해 볼 수 있는가?
최신 버전의 Discourse에서는 모든 테마/플러그인이 호환되는 경우 새 헤더가 자동으로 활성화됩니다.
테마/플러그인이 호환되지 않는 경우, 레거시 헤더가 계속 사용되며 기존 비추천 메시지와 함께 콘솔에 경고가 출력됩니다. 또한 UI에서 관리자에게 경고 배너가 표시됩니다.
이 자동 시스템이 예상대로 작동하지 않는 극히 드문 경우, glimmer header mode 사이트 설정을 통해 이 '자동 기능 플래그’를 일시적으로 오버라이드할 수 있습니다. 그렇게 할 경우, 이 토픽에서 이유를 알려 주시기 바랍니다.
플러그인/테마를 업데이트해야 하는가?
커스터마이징이 업데이트가 필요한지 확인하려면, 다음 위젯 중 하나에 대해 decorateWidget, changeWidgetSetting, reopenWidget 또는 attachWidgetAction을 사용하는지 확인하십시오:
- header
- site-header
- header-contents
- header-buttons
- user-status-bubble
- sidebar-toggle
- header-icons
- header-topic-info
- header-notifications
- home-logo
- user-dropdown
또는 다음 플러그인 API 메서드 중 하나를 사용하는지 확인하십시오:
addToHeaderIconsaddHeaderPanel
이 모든 것들은 이제 콘솔에 비추천 메시지가 출력되도록 합니다. 비추천 ID는 다음과 같습니다:
discourse.add-header-paneldiscourse.header-widget-overrides
인스턴스에서 테마를 하나 이상 사용하는 경우, 모든 테마를 확인하십시오.
관리자 공지
2024년 6월 20일부터, 위 비추천 항목에 대한 관리자 공지를 활성화했습니다.
이 날짜 이후에 배포된 인스턴스에서 현재 플러그인, 테마 또는 테마 컴포넌트가 비추천 경고 중 하나를 트리거하는 경우, 다음 메시지는 관리자*에게만 표시됩니다:
이 메시지는 관리자가 영향받는 커스터마이징을 현대화하기 위해 조치가 필요함을 알리기 위한 것입니다: 레거시 코드베이스를 제거할 때까지 이전 커스터마이징은 계속 작동합니다.
대체 방안은 무엇인가?
각 테마/플러그인은 다르지만, 가장 일반적인 사용 사례에 대한 지침은 다음과 같습니다:
addToHeaderIcons
사용자 정의 헤더 아이콘의 경우, 코드를 제거하고 공식 Custom Header Links (Icons) Theme Component를 설치하는 것을 권장합니다. 요구 사항을 충족하지 못하는 경우, 필요한 코드 변경 사항에 대한 세부 정보를 확인하려면 아래를 참조하십시오:
addToHeaderIcons 플러그인 API는 새로운 headerIcons API를 لصالح으로 비추천되었습니다. 이는 헤더에서 아이콘을 추가, 제거 또는 순서를 변경하는 것을 허용하기 위해 존재합니다. 컴포넌트를 전달해야 합니다.
컴포넌트는 다음과 같이 전달할 수 있습니다:
| 이전 | 이후 |
|---|---|
| api.addToHeaderIcons(“widget-foo”) | api.headerIcons.add(“foo”, FooIcon) |
| api.decorateWidget(“header-icons:before”, () => return helper.h(“div”, “widget-foo”)) | api.headerIcons.add(“foo”, FooIcon, { before: “search” }) |
| api.decorateWidget(“header-icons:after”, () => return helper.h(“div”, “widget-foo”)) | api.headerIcons.add(“foo”, FooComponent, { after: “search” }) |
이 예제는 Ember의 Template Tag Format (gjs)를 사용하여 컴포넌트를 인라인으로 정의하고 headerButtons.add API에 전달합니다:
// .../discourse/api-initializers/add-my-button.gjs
import DButton from "discourse/components/d-button";
import { apiInitializer } from "discourse/lib/api";
export default apiInitializer("1.0", (api) => {
api.headerIcons.add("some-unique-name", <template>
<li><DButton class="icon btn-flat" @href="/u" @icon="address-book" /></li>
</template>);
});
또는 드롭다운의 경우, <DButton 대신 <DMenu를 사용할 수 있습니다:
import DButton from "discourse/components/d-button";
import { apiInitializer } from "discourse/lib/api";
import DMenu from "float-kit/components/d-menu";
export default apiInitializer("1.0", (api) => {
api.headerIcons.add("some-unique-name", <template>
<li>
<DMenu class="icon btn-flat" @icon="address-book">
<DButton @translatedLabel="User 1" @href="/u/user1" />
<DButton @translatedLabel="User 2" @href="/u/user2" />
<DButton @translatedLabel="User 3" @href="/u/user3" />
</DMenu>
</li>
</template>);
});
업그레이드 커밋 예제:
decorateWidget("header-buttons:*")
사용자 정의 헤더 링크의 경우, 코드를 제거하고 공식 Custom Header Links Theme Component를 설치하는 것을 권장합니다. 요구 사항을 충족하지 못하는 경우, 필요한 코드 변경 사항에 대한 세부 정보를 확인하려면 아래를 참조하십시오:
header-buttons 위젯은 비추천되었으며, headerButtons 플러그인 API를 도입했습니다. 이는 헤더에서 버튼을 추가, 제거 또는 순서를 변경하는 것을 허용하기 위해 존재합니다. 컴포넌트를 전달해야 합니다.
| 이전 | 이후 |
|---|---|
| api.decorateWidget(“header-buttons:before”) | api.headerButtons(“button-name”, ButtonComponent, { before: “auth” }) |
| api.decorateWidget(“header-buttons:after”) | api.headerButtons(“button-name”, ButtonComponent, { after: “auth” }) |
헤더 위젯에 대한 changeWidgetSetting(...)
![]()
changeWidgetSetting의 가장 일반적인 사용은 다음 테마 컴포넌트를 사용하여 달성할 수 있습니다:이 경우 사용 사례에 맞지 않는다면, 계속 읽어보세요…
헤더 위젯의 일부 커스터마이징은 changeWidgetSetting API를 사용했습니다.
위와 같은 커스터마이징에 대한 직접적인 대체 방안은 없지만, Glimmer 컴포넌트 필드의 작동 방식 때문에 Discourse 3.3.0.beta3에서 이러한 일부 사례를 처리하기 위해 새로운 플러그인 API를 도입했습니다.
registerValueTransformer는 소스 코드에서 오버라이드 가능하도록 태그된 값을 오버라이드하는 데 사용할 수 있으며, 이는 플러그인 아웃렛이 작동하는 방식과 유사한 접근 방식입니다.
소스 코드 베이스에서 공통적으로 발견된 사용 사례에 대해 두 가지 변환기를 이미 추가했습니다:
-
home-logo-href: 홈 로고 앵커의 URL을 오버라이드하는 데 사용할 수 있습니다. 예제는 아래home-logo섹션을 참조하십시오. -
header-notifications-avatar-size: 헤더의 사용자 아바타에 가져온 이미지의 크기를 변경하는 데 사용할 수 있습니다. 예제:
아래의 코드:
api.changeWidgetSetting(
"header-notifications",
"avatarSize",
settings.header_avatars_size
);
다음과 같이 변환됩니다:
api.registerValueTransformer(
"header-notifications-avatar-size",
() => settings.header_avatars_size
);
이러한 변환기는 Discourse 소스 코드에 추가되어야 합니다. 다른 것이 필요한 경우, 아래에 사용 사례를 게시하여 알려 주시기 바랍니다.
새로운 값 변환기 API에 대한 자세한 내용은 여기에서 찾을 수 있습니다.
home-logo
home-logo:before 또는 home-logo:after 위젯 장식의 대체로 home-logo 플러그인 아웃렛을 도입했습니다. 커넥터 파일에서 자동 __before 및 __after 명명을 사용하여 사용자 정의 콘텐츠를 배치할 위치를 지정할 수 있습니다.
before/after 커넥터 파일 명명에 대한 자세한 내용은 여기에서 찾을 수 있습니다.
| 이전 | 이후 |
|---|---|
| api.decorateWidget(“home-logo:before”) | 콘텐츠를 /connectors/home-logo__before로 이동 |
| api.decorateWidget(“header-buttons:after”) | 콘텐츠를 /connectors/home-logo__after)로 이동 |
home-logo 앵커 URL 변경:
매우 일반적인 요구 사항은 home-logo가 링크하는 URL을 변경하는 것입니다. 이를 해결하기 위해 home-logo-href 값 변환기를 도입했습니다. 예제:
-
정적 URL로 링크를 변경하려면
api.registerValueTransformer("home-logo-href", () => "https://example.com"); -
현재 사용자를 기반으로 동적 URL을 반환하려면
api.registerValueTransformer("home-logo-href", () => { const currentUser = api.getCurrentUser(); return `https://example.com/${currentUser.username}`; }); -
테마-컴포넌트 설정을 기반으로 URL을 반환하려면
api.registerValueTransformer("home-logo-href", () => { return settings.example_logo_url_setting; });
다른 커스터마이징은 어떻게 되는가?
커스터마이징을 CSS, PluginOutlets 또는 우리가 도입한 새로운 API를 사용하여 달성할 수 없는 경우, 논의하기 위해 새로운 Development 토픽을 만들어 알려 주시기 바랍니다.
새와 구 헤더를 모두 지원하도록 테마/플러그인을 어떻게 업데이트하는가?
이 문서에 나열된 모든 새로운 API와 플러그인 아웃렛은 새 헤더와 구 헤더 모두에서 지원됩니다. 따라서 현재 테마/플러그인에 한 번만 업데이트하면 사용자는 전환에 대비할 수 있습니다.




