Come personalizzare l'intestazione con un plugin?

Sto cercando di creare un plugin che modifichi l’intestazione in qualcosa di simile a questo


Non è importante come appaia esattamente, ciò che conta è che non voglio utilizzare la personalizzazione nel percorso /admin/customize/css_html. Voglio creare un plugin che modifichi magicamente tutto ciò di cui ho bisogno.

Finora ho scoperto che non esiste un template per l’intestazione, poiché viene renderizzata tramite virtual-dom.

Il processo di rendering è il seguente:

  1. Il template assets/javascripts/discourse/templates/application.hbs, che può essere sovrascritto, renderizza il 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. Il componente assets/javascripts/discourse/components/site-header.js.es6 estende e restituisce il widget header.

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

    export default SiteHeaderComponent;

  3. Il widget assets/javascripts/discourse/widgets/header.js.es6 genera il virtual-dom per l’intestazione.

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

    html(attrs, state) {}
    });

Le mie riflessioni

Potrei creare il mio widget my-header che estende il header esistente; lì aggiornerei semplicemente l’HTML. Non voglio copiare e incollare nulla al suo interno, ma solo sovrascrivere il metodo html().

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

Poi potrei creare il mio componente my-site-header che estende il site-header esistente, sovrascrivendolo semplicemente per puntare al widget my-header.

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

Infine, sovrascriverei il template application per mostrare il componente my-site-header al posto di 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 domanda è: come posso estendere tutti questi componenti e widget? Potreste indicarmi il modo corretto per farlo? Grazie.

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.