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.

1 Like

Thank you for your suggestion. It looks good!

1 Like