プラグインでヘッダーをカスタマイズする方法は?

ヘッダーを以下のようなものに変更するプラグインを作成しようとしています。


見た目は重要ではなく、重要なのは /admin/customize/css_html パスでのカスタマイズを使用したくないということです。必要なすべてを魔法のように変更するプラグインを作成したいのです。

これまでに見つけた情報によると、ヘッダー用のテンプレートはなく、仮想 DOM(virtual-dom)を介してレンダリングされます。

レンダリングの手順は以下の通りです:

  1. オーバーロード可能な assets/javascripts/discourse/templates/application.hbs テンプレートが site-header コンポーネントをレンダリングします。

    {{plugin-outlet “above-site-header”}}
    {{site-header canSignUp=canSignUp
    showCreateAccount=“showCreateAccount”
    showLogin=“showLogin”
    showKeyboard=“showKeyboardShortcutsHelp”
    toggleMobileView=“toggleMobileView”
    toggleAnonymous=“toggleAnonymous”
    logout=“logout”}}
    {{plugin-outlet “below-site-header”}}

  2. assets/javascripts/discourse/components/site-header.js.es6 コンポーネントが header ウィジェットを拡張して返します。

    const SiteHeaderComponent = MountWidget.extend(Docking, {
    widget: ‘header’,
    ..
    });

    export default SiteHeaderComponent;

  3. assets/javascripts/discourse/widgets/header.js.es6 ウィジェットがヘッダーの仮想 DOM を生成します。

    export default createWidget(‘header’, {
    tagName: ‘header.d-header.clearfix’,

    html(attrs, state) {}
    });

私の考え

既存の header を拡張する独自の my-header ウィジェットを作成し、そこで html を更新できます。コピー&ペーストはしたくなく、html() メソッドをオーバーライドするだけです。

/plugins/discourse-foo/assets/javascripts/discourse/widgets/my-header.js.es6

次に、既存の site-header を拡張し、単に my-header ウィジェットを指すようにオーバーライドする独自の my-site-header コンポーネントを作成できます。

/plugins/discourse-foo/assets/javascripts/discourse/components/my-site-header.js.es6

その後、application テンプレートをオーバーライドして、site-header の代わりに my-site-header コンポーネントを表示します。

/plugins/discourse-foo/assets/javascripts/discourse/templates/application.hbs

{{plugin-outlet "above-site-header"}}
{{my-site-header canSignUp=canSignUp
              showCreateAccount="showCreateAccount"
              showLogin="showLogin"
              showKeyboard="showKeyboardShortcutsHelp"
              toggleMobileView="toggleMobileView"
              toggleAnonymous="toggleAnonymous"
              logout="logout"}}
{{plugin-outlet "below-site-header"}}

質問ですが、これらすべてのコンポーネントとウィジェットを拡張するにはどうすればよいでしょうか?正しい方法を教えていただけますか?ありがとうございます。

Based on the screenshot, this seems like something that is plausible to do with just CSS customizations. That would also be much simpler than writing a plugin and would not require updating with new versions of Discourse code.

Well, I knew you going to say that, that’s why I mentioned that I need a plugin :slight_smile:

First of all, because I want to learn how to do plugins, I’ll have to do whole lot more complicated things later. That menu is just an example.

Secondly, I really need that menu to be a plugin, because:

  1. We may reuse it on different projects;
  2. We need a version control, to roll back sometimes;
  3. Some links will be generated from external json;
  4. I want a clean solution. I believe doing it with a plugin is a clean solution;

Sitepoint use a plugin to override the header.
Take a look here:

Thank you for your link, it will be definitely interesting to see how other people are doing it.

As I see now, they are not extending existing header widget. They just copy-pasted it from the core and customised it.
In that case they have to support that code themselves, and Discourse most likely to break it on next update.