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 „Gefällt mir“

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

9 „Gefällt mir“

This does EXACTLY what I needed. THANKS @simon!

2 „Gefällt mir“

Entschuldigung, dass ich dieses sehr alte Thema wieder aufgreife, hoffe, das ist in Ordnung.

Können wir (in einem Plugin) überschreiben?

app/views/layouts/application.html.erb

So etwas wie:

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

Ich vermute, die Antwort ist „NEIN!

Machen Sie es stattdessen in einem Theme. Sie können eine Standard-Caching-Schicht vor die API stellen, von der die Informationen abgerufen werden.

1 „Gefällt mir“

Können wir in einem Theme eingebetteten Ruby-Code verwenden?

Ich muss mich wohl irren… Ich dachte, Themes seien nicht der richtige Ort für eingebetteten Ruby-Code.

Edit:

Ich habe gerade das folgende Thema durchgesehen und wie erwartet finde ich keinen Hinweis darauf, wie man eingebetteten Ruby-Code in einem Theme hinzufügt :slight_smile:

Developing Discourse Themes & Theme Components

Nochmal lesen…

Ich hatte das cache-Stanza vergessen und ging davon aus, dass bei jeder Anfrage der Server aufgerufen wird, weshalb ich dachte, dass auch ein clientseitiger Abruf funktionieren würde.

Stattdessen könnte etwas funktionieren, bei dem der Remote-Server den Inhalt in den HTML-Footer-Bereich einer Theme-Komponente schiebt.

1 „Gefällt mir“