Comment personnaliser l'en-tête avec un plugin ?

J’essaie de créer un plugin qui modifiera l’en-tête pour ressembler à quelque chose comme ceci


Ce n’est pas vraiment important à quoi cela ressemble, ce qui compte, c’est que je ne veux pas utiliser la personnalisation via le chemin /admin/customize/css_html. Je veux créer un plugin qui changera magiquement tout ce dont j’ai besoin.

Ce que j’ai découvert jusqu’à présent, c’est qu’il n’existe aucun modèle pour l’en-tête ; il est rendu via un virtual-dom.

Le processus de rendu est le suivant :

  1. Le modèle assets/javascripts/discourse/templates/application.hbs, qui peut être surchargé, rend le composant 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. Le composant assets/javascripts/discourse/components/site-header.js.es6 étend et retourne le widget header.

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

    export default SiteHeaderComponent;

  3. Le widget assets/javascripts/discourse/widgets/header.js.es6 génère le virtual-dom pour l’en-tête.

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

    html(attrs, state) {}
    });

Mes réflexions

Je peux créer mon propre widget my-header qui étendra le header existant ; là, je mettrai simplement à jour la méthode html. Je ne veux copier-coller rien dedans, je veux juste surcharger la méthode html().

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

Ensuite, je peux créer mon propre composant my-site-header qui étendra le site-header existant en le surchargeant simplement pour qu’il pointe vers le widget my-header.

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

Ensuite, je surcharge le modèle application pour afficher le composant my-site-header au lieu 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 question est : comment puis-je étendre tous ces composants et widgets ? Pourriez-vous s’il vous plaît m’indiquer la bonne méthode pour faire cela ? Merci.

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.