¿Cómo personalizar el encabezado con un plugin?

Estoy intentando crear un plugin que cambie la cabecera por algo así


No importa mucho cómo se vea, lo importante es que no quiero usar la personalización en la ruta /admin/customize/css_html. Quiero crear un plugin que cambie mágicamente todo lo que necesito.

Lo que he encontrado hasta ahora es que no hay una plantilla para la cabecera; se renderiza mediante virtual-dom.

El proceso de renderizado es el siguiente:

  1. La plantilla assets/javascripts/discourse/templates/application.hbs, que puede ser sobrescrita, renderiza el 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. El componente assets/javascripts/discourse/components/site-header.js.es6 extiende y devuelve el widget header.

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

    export default SiteHeaderComponent;

  3. El widget assets/javascripts/discourse/widgets/header.js.es6 genera el virtual-dom para la cabecera.

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

    html(attrs, state) {}
    });

Mis ideas

Puedo crear mi propio widget my-header que extienda el header existente; allí solo actualizaré el html. No quiero copiar y pegar nada en él, solo quiero sobrescribir el método html().

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

Luego puedo crear mi propio componente my-site-header que extienda el site-header existente, simplemente sobrescribiéndolo para que apunte al widget my-header.

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

Después, sobrescribo la plantilla application para mostrar el componente my-site-header en lugar 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"}}

La pregunta es: ¿cómo puedo extender todos estos componentes y widgets? ¿Podrías indicarme la forma correcta de hacerlo? Gracias.

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.