Can I override app/views/layouts/application.html.erb from a plugin?

I have a very specific scenario where I need to load and cache the site header and footer from our primary website. This is fairly trivial to do in ERB:

<!-- My Customization -->
  <% cache("footer_#{I18n.locale}", expires_in: 1.week) do %>
    <%= raw open("https://myserver.com/#{I18n.locale}/remote/footer").read %>
  <% end %>
<!-- End Customization -->

Note in my example that I am passing along the I18n locale as well.

Neither the caching nor passing the locale will work with the html custom header option provided with Discourse so I’m left with two options, both of which would need to be implemented as a plugin.


OPTION 1: Use Javascript

There are outlets placed where my header and footer would go, but I don’t know how to cache the requests and I can see this quickly becoming taxing on both the server and the Ember app if server-side caching is not used.

OPTION 2: Override the application.html.erb template

First off: I am very aware that I would have to keep my custom plugin in lock-step with any changes to Discourse to ensure that my override doesn’t interfere with upgrades.

This would be my preference but I can’t seem to find any convention that will let me override the ERB templates from a plugin.

Has anyone tried this? Am I on a fools errand?

Thanks in advance for your help.

2 « J'aime »

Yes, you can override the set_layout method in application_controller.rb. Take a look at this (unfinished) plugin for an example:

9 « J'aime »

This does EXACTLY what I needed. THANKS @simon!

2 « J'aime »

Désolé de raviver ce très vieux sujet, j’espère que cela ne pose pas de problème.

Pouvons-nous surcharger (dans un plugin) :

app/views/layouts/application.html.erb

De cette manière :

register_asset '../views/layouts/application.html.erb'

Je soupçonne que la réponse est « NON ! »… si la réponse est « non » (car les « assets » ne sont pas des « vues » dans Rails), pouvons-nous avoir à l’avenir une méthode de plugin :

register_view

Ainsi, nous pourrions simplement faire cela à l’avenir (par exemple) :

register_asset 'layouts/application.html.erb'

et surcharger 'layouts/application.html.erb'

Cela me semble être une bonne idée, sans être pour autant un expert des plugins Discourse.

Merci de votre considération.

Faites-le simplement dans un thème à la place. Vous pouvez ajouter une couche de mise en cache standard devant l’API à partir de laquelle les informations sont récupérées.

1 « J'aime »

Peut-on utiliser du code Ruby intégré dans un thème ?

Je dois être confus… je pensais que le travail sur les thèmes n’était pas l’endroit approprié pour du Ruby intégré.

Édition :

Je viens de relire le sujet suivant et, comme je le soupçonnais, je ne trouve aucune référence à l’ajout de Ruby intégré dans un thème :slight_smile:

Developing Discourse Themes & Theme Components

Relecture…

J’avais oublié la section cache et je supposais que cela interrogerait le serveur à chaque requête, alors j’ai pensé qu’une récupération côté client fonctionnerait aussi.

À la place, une solution viable consisterait à faire en sorte que le serveur distant pousse le contenu dans la section Pied de page HTML d’un composant de thème.

1 « J'aime »