예정된 헤더 변경 – 테마 및 플러그인 준비

도대체 무엇이 깨질 예정인가요? 기존에 지원되는 테마 컴포넌트로 충분할 수도 있습니다.

메인 사이트로 연결되는 상단 배너만 해당되는 건가요?

다음에 대한 대체 수단이 있나요?

api.changeWidgetSetting("header-notifications", "avatarSize", "large");

이 코드는 다음과 같은 비추천(deprecation) 경고가 표시되며 해당 문서로 연결됩니다:

The header-notifications widget has been deprecated and changeWidgetSetting is no longer a supported override.

저도 같은 상황입니다.

로고 URL을 제대로 변경하려고 시도하고 있지만, 다음 작업은 더 이상 불가능합니다:

api.changeWidgetSetting("home-logo", "href", "https://my-other-homepage/");

이것을 대체할 API 호출은 무엇인가요?

이에 대한 깔끔한 해결책을 마련하고 있지만, 아직 완전히 준비되지는 않았습니다. 업데이트가 나올 때까지 이 주제를 계속 지켜봐 주세요.

안녕하세요, @david - 6월 7일 금요일까지 깔끔한 해결책이 준비될 수 있을까요? 그렇지 않다면 예상 완료 시점을 알려주실 수 있을까요?
급하게 요청드려 죄송합니다. 6월 17일에 클로즈드 베타를 시작할 예정이라, 테스트 전에 이 기능이 구현될지 여부를 확인해야 합니다.

정확한 날짜는 없지만, 앞으로 1~2주 안에 될 가능성이 높습니다. 내일까지는 준비가 되지 않을 것입니다.

내일까지 작동하는 것이 필요하시다면, 기존 API를 사용하시는 것을 권장합니다. 기존 API는 사이트가 레거시 헤더 구현을 사용하도록 자동으로 전환해 줍니다.

@kana.tatsuta 새 API가 병합되었습니다.

로고 URL을 사용자 지정하는 방법에 대한 예시를 포함하여 OP에 섹션을 추가했습니다.

호환되지 않는 플러그인 또는 테마를 사용하는 인스턴스의 새 배포에 대해 관리자 알림을 활성화했습니다.

코드를 어떻게 업데이트해야 할지 잘 모르겠습니다. 몇 가지 방법을 시도해 봤지만, 항상 라이트 테마의 이미지가 표시되고, 해당 컴포넌트에 직접 업로드한 다크 테마 이미지가 표시되지 않습니다. 이 부분을 어떻게 리팩터링해야 할지 조언을 구합니다.

<script type="text/discourse-plugin" version="0.8.25">
  api.reopenWidget("home-logo", {
    logoUrl() {
      return (
        settings.Alternative_logo_url || ""
      );
    },

    mobileLogoUrl() {
      return (
        settings.Alternative_mobile_logo_url || ""
      );
    },

    smallLogoUrl() {
      return (
        settings.Alternative_small_logo_url || ""
      );
    }
  });
</script>

@tradmo,

home-logo-contents 플러그인 아웃렛에 커넥터를 사용해 보세요. 코드는 다음과 같이 변환됩니다:

// javascripts/discourse/initializers/customize-logo.gjs

import HomeLogoContents from "discourse/components/header/home-logo-contents";
import { withPluginApi } from "discourse/lib/plugin-api";

export default {
  name: `logo-customizations`,
  initialize(container) {
    withPluginApi("1.29.0", (api) => {
      renderHomeLogo(api);
    });
  },
};

function renderHomeLogo(api) {
  const logoSmallUrl = settings.Alternative_small_logo_url || "";
  const logoUrl = settings.Alternative_logo_url || "";
  const mobileLogoUrl = settings.Alternative_mobile_logo_url || "";

  api.renderInOutlet("home-logo-contents", <template>
    <HomeLogoContents
      @logoSmallUrl={{logoSmallUrl}}
      @logoUrl={{logoUrl}}
      @minimized={{@outletArgs.minimized}}
      @mobileLogoUrl={{mobileLogoUrl}}
      @showMobileLogo={{@outletArgs.showMobileLogo}}
      @title={{@outletArgs.title}}
    />
  </template>);
}

reopenWidget (sidebar-toggle)에 대해 다음 코드를 대체하는 방법을 이해하는 데 도움을 주실 수 있을까요? 이 가이드에서 관련 설명을 찾지 못했습니다.

// /javascripts/discourse/api-initializers/desktop-open-sidebar-always.js
/* "reopenWidget"으로 sidebarToggle 버튼이 제거됨, applicationController가 showSidebar를 true로 강제 설정 (desktopView의 경우) */

import { withPluginApi } from "discourse/lib/plugin-api";
import { reopenWidget } from "discourse/widgets/widget";

function sidebarToggle(api) {
  const applicationController = api.container.lookup("controller:application");
  api.reopenWidget("sidebar-toggle", {
    html(attrs) {
      if (this.site.desktopView == true && attrs.showSidebar == false) {
        applicationController.set("showSidebar", true);
      }
    },
  });
}

export default {
  name: "desktop-open-sidebar-always",
  initialize() {
    withPluginApi("0.10.1", sidebarToggle);
  },
};

여러분 안녕하세요 :wave:,

이 작업을 위해 필요한 변경 사항에 대해 도움을 주실 분이 있을까요?

<script type="text/discourse-plugin" version="0.4">
const { iconNode } = require("discourse-common/lib/icon-library");

api.decorateWidget('header-icons:before', helper => {
    return helper.h('li', [
        helper.h('a#graduation-cap.icon', {
            href:'https://example.com/',
            title: 'Learning Center'
        }, iconNode('graduation-cap')),
    ]);
});
</script>

api.headerIcons.add(“foo”, FooIcon, { before: “search” })을 사용하도록 변환해야 하는 것 같지만, 정확히 어떻게 해야 하는지 100% 확신이 서지 않습니다. :frowning:

도움 주시면 감사하겠습니다. :pray:

@angelinekwan 님,

다음과 같이 권장합니다:

1. 기존 javascripts/discourse/api-initializers/desktop-open-sidebar-always.js 파일을 삭제하세요

2. 새 파일 javascripts/discourse/pre-initializers/desktop-open-sidebar-always.js를 생성하고 다음 코드를 추가하세요:

import { withPluginApi } from "discourse/lib/plugin-api";

const PLUGIN_NAME = "desktop-open-sidebar-always";

export default {
  name: PLUGIN_NAME,

  initialize() {
    withPluginApi("1.34.0", (api) => {
      api.modifyClass("controller:application", {
        pluginId: PLUGIN_NAME,

        calculateShowSidebar() {
          if (this.site.desktopView && this.canDisplaySidebar) {
            return true;
          }

          return this._super(...arguments);
        },
      });
    });
  },
};

common/common.scss에 다음을 추가하세요

html.desktop-view {
  .header-sidebar-toggle {
    display: none;
  }
}

HI @Danny_Dainton,

Custom Header Links (icons) 테마 컴포넌트를 확인해 보세요. 필요하신 기능을 수행하는 것 같습니다.

테마 컴포넌트를 사용할 수 없다면, api.headerIcons.add를 사용하면 됩니다. :smiley:

  • 새로운 초기화 파일(initializer file)을 생성하세요. 확장자는 .gjs여야 합니다.
  • 다음 코드가 원하시는 작업을 수행할 것입니다:
// javascripts/discourse/initializers/custom-header-icons.gjs

import { apiInitializer } from "discourse/lib/api";
import dIcon from "discourse-common/helpers/d-icon";

export default apiInitializer("1.34.0", (api) => {
  api.headerIcons.add(
    "custom-header-home",
    <template>
      <li>
        <a id="graduation-cap" class="icon" href="https://example.com/" title="Learning Center">
          {{dIcon "graduation-cap"}}
        </a>
      </li>
    </template>,
    { before: "search" }
  );
});

감사합니다, 선생님!

이제 직접 눈으로 보니 조금 더 이해가 됩니다.

답변 정말 감사드립니다!! :heart:

다음과 같은 코드 조각을 마이그레이션하는 데 도움이 필요합니다. 어떻게 마이그레이션해야 할지 모르겠습니다:

api.reopenWidget("user-dropdown", {
  html(attrs) {
    return h(
      "a.icon",
      {title: I18n.t("custom.string.title")},
      [iconNode("bell"), this.attach("header-notifications", attrs)],
    );
  },
});

이 변경 사항의 원래 목표는 user-dropdown 메뉴를 그대로 유지하면서 프로필 이미지를 아이콘(벨)으로 교체하는 것입니다.

원하는 효과를 얻는 가장 쉬운 방법은 기존 PluginOutlet을 사용하여 아이콘을 추가하고 CSS로 사용자 아바타 이미지를 숨기는 것입니다.

.gjs 파일에서:

// javascripts/discourse/initializers/user-dropdown-bell-icon.gjs

import { withPluginApi } from "discourse/lib/plugin-api";
import dIcon from "discourse-common/helpers/d-icon";

export default {
  name: "user-dropdown-bell-icon",
  initialize(container) {
    withPluginApi("1.34.0", (api) => {
      api.renderInOutlet("user-dropdown-notifications__before", <template>
        {{dIcon "bell"}}
      </template>);
    });
  },
};

다음과 같은 CSS를 추가하세요:

.header-dropdown-toggle.user-menu-panel img {
  display: none;
}

결과가 다음과 같습니다:

기존 위젯 코드가 제거되었습니다.

“home-logo” 옆에 텍스트를 추가하는 테마 컴포넌트를 업데이트하는 데 도움을 주실 수 있나요? 미리 감사드립니다.