Como personalizar o cabeçalho com um plugin?

Estou tentando criar um plugin que altere o cabeçalho para algo assim


Não importa muito como ele fica visualmente; o importante é que não quero usar personalização no caminho /admin/customize/css_html. Quero criar um plugin que mágicamente altere tudo o que preciso.

O que descobri até agora é que não há um template para o cabeçalho; ele é renderizado via virtual-dom.

A forma como ele é renderizado é a seguinte:

  1. O template assets/javascripts/discourse/templates/application.hbs, que pode ser sobrescrito, renderiza o componente 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. O componente assets/javascripts/discourse/components/site-header.js.es6 estende e retorna o widget header.

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

    export default SiteHeaderComponent;

  3. O widget assets/javascripts/discourse/widgets/header.js.es6 gera o virtual-dom para o cabeçalho.

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

    html(attrs, state) {}
    });

Minhas ideias

Posso criar meu próprio widget my-header que estenderá o header existente; lá, apenas atualizarei o HTML. Não quero copiar e colar nada nele; quero apenas sobrescrever o método html().

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

Depois, posso criar meu próprio componente my-site-header que estenderá o site-header existente, apenas sobrescrevendo-o para apontar para o widget my-header.

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

Em seguida, sobrescrevo o template application para mostrar o componente my-site-header em vez de 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"}}

A pergunta é: como posso estender todos esses componentes e widgets? Poderia, por favor, indicar o caminho correto para fazer isso? Obrigado.

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.