Implementing Wordpress-like dynamic theme selection within Elixir/Phoenix?

Hi all,
I’m trying to design a new CMS using Elixir and was wondering about implementing a browsable catalog of themes that a use can just click and install - just like on Wordpress.
How would one go about this - since Elixir requires these to be compiled or in the very least would require a server restart, from my understanding.
To add to the complexity - Each theme would be unique, have a different set of variables (configurable on the CMS backend).
Currently, I have a subfoler where a user can place their theme and would need to specify the theme name in config.exs.

I thought of storing compiled HTML into the database from the themes themselves, with placeholders for variables to be injected. Eg. A compiled HTML for title would be

and then I could parse it on my backend with a HTML parser in Elixir and inject the actual value for the title. But, surely there’s gotta be a cleaner way?

Any ideas are much appreciated as usual :smiley:

Hi.

I think you could just replace the static :root in :put_root_layout with a function, which fetches the layout dynamically, e.g:

plug :put_root_layout, {CmsWeb.LayoutView, CmsWeb.current_theme()}

and then you need to define a matching render function handling the evaluation of the templete (for production you would probably just compile it once and call Code.eval_quoted in the render function):

defmodule CmsWeb.LayoutView do
  use CmsWeb, :view

  def render(theme_name, assigns) do
    theme_name
    |> CmsWeb.path_for_theme()
    |> EEx.eval_file([assigns: assigns], engine: Phoenix.HTML.Engine)
  end
end

When installing a new template, you then would need to download the theme file to some location and add a database entry containing the name and the path to the template file.

Not sure if that is the nicest way, but it should work.

Thank you for your suggestion. It looks good!

I know this is an old thread, but I eventually managed to take the Shopify route - Liquid template parser which Phoenix/Elixir has 100% support for.

Which package did you end up using for liquid templates? Saw that there are multiple libraries

I used this one. GitHub - handlecommerce/liquex: Liquid template processor for Elixir · GitHub
To me the 100% compatibility with Liquid gem was kind of a requirement. The other alternative I considered was just exposing EEX/HEEX based templates to the developers, but I wasn’t sure of the security implications.