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.






















