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 ![]()
Most Liked
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
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
Thank you for your suggestion. It looks good!
Popular in Questions
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #advent-of-code
- #elixirconf-us
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #security
- #performance









