dsignr

dsignr

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:

Most Liked

dsignr

dsignr

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.

moogle19

moogle19

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.

dsignr

dsignr

Thank you for your suggestion. It looks good!

Where Next?

Popular in Questions Top

jaysoifer
Is there a way to rollback a specific migration and only that one (“skipping” all the other ones)? Would mix ecto.rollback -v 200809061...
New
lanycrost
Hi everyone! I need implement if…else if…else condition from my elixir code, and anymore of this control flow structures not work proper...
New
sergio
In Ruby, I can go: User.find_by(email: "foobar@email.com").update(email: "hello@email.com") How can I do something similar in Elixir? ...
New
JulienCorb
I am trying to implement my new.html.eex file to create new posts on my website. new.html.eex: <h1>Create Post</h1> <%= ...
New
nsuchy
Hi. I’ve noticed that Windows Powershell has it’s own IEX command and you cannot access Elixir’s IEX due to the conflict. This isn’t a cr...
New
fireproofsocks
I’m working on defining a simple Ecto schema for a table (in PostGres), but I don’t see where I can define a column as NOT NULL. Conside...
New
greenz1
I have a phoenix application from which a user can download multiple(5-6) files of size 1MB. I couldn’t find anything related to sending ...
New
script
If I have a string “1000 cfu/ml” . I want to remove the characters and / and space . So the string is like this "1000" What is the ...
New
shahryarjb
Hello, I have map which I want to convert it to string like this: the map: %{last_name: "tavakkoli", name: "shahryar"} the string I ne...
New
WestKeys
Currently suffering from paralysis by [HTTP client] analysis. This is rather unusual in Elixirland as there tends to be consensus on the ...
New

Other popular topics Top

electic
Hi, I am new to Elixir. I am trying to use the DateTime component to insert a date into MySQL however the there seems to be no way to fo...
New
RisingFromAshes
I’ve read in another post that it may be possible with a router helper - but I couldn’t find an appropriate one, and tbh, I’m still just ...
New
josevalim
Hi everyone, One of the features added to Elixir early on to help integration with Erlang code was the idea of overridable function defi...
New
dokuzbir
I want to highlight html closing tags when i click a html tag. That works in .html files but doesnt work for html.eex templates. How can...
New
sorentwo
Hello! tl;dr Announcing Oban, an Ecto based job processing library with a focus on reliability and historical observability. After spen...
985 43487 311
New
jerry
Good day to you all. I have been struggling to get a query involving like and ilike to work. Can anyone assist me on this, please? pro...
New
pmjoe
I have a relationship of love and hate with Elixir. Lots of things are just absolutely right, but there are some things that are kind of ...
New
SoCreat
i’m a new one to elixir which editor can i use vs code? or atom? Thanks! :smiley:
New
WestKeys
Currently suffering from paralysis by [HTTP client] analysis. This is rather unusual in Elixirland as there tends to be consensus on the ...
New
jason.o
In the code below, if the create action is not set to accept “extra_key” as an input, it errors out with a message shown above. Is there ...
New

Latest on Elixir Forum

We're in Beta

About us Mission Statement