kbee

kbee

How do i dynamically theme Phoenix views

Hello community,

I’m new to phoenix and struggling to implement a feature that would allow my users to apply a theme of their choice (e.g. animals, cars, nature).

Each of these themes has its own assets and I’m using put_layout to assign the chosen layout but struggling to render the views according to the chosen theme

My controller looks like this

defmodule Client.PageController do
  use Client, :controller
  
  def index(conn, _params) do
    theme = get_user_theme(conn)

    conn
    |> put_layout(theme)
    |> render('index.html')
  end
end 

My templates directory

templates\
 -> layouts
     - app.html.eex
     - themeA.html.eex
     - themeB.html.eex
 -> pages
     - index.html.eex
 -> themeA
     - index.html.eex
 -> themeB
     - index.html.eex

how do i dynamically choose between themeA/index.html.eex and themeB/index.html.eex without getting a template not found error

Marked As Solved

kokolegorille

kokolegorille

If You are using PageController, You are using PageView, which will look into template/page.

Try to put themes folder inside page folder.

Also Liked

kbee

kbee

@kokolegorille thanks for your answer. It set me back on track. I was able to get it to to render using by moving and renaming themeA\index.html.eex to page\themeA.index.html.

I wanted to be able to neatly put organise themes in folders and I found this topic https://forum.elixirforum.com/t/how-to-render-a-template-inside-a-web-templates-folder-subfolder/1404/6?u=kbee and changed my view to

defmodule MyApp.PageView do
  use Phoenix.View, root: "lib/myapp/templates", pattern: "**/*"
end

and now I can do

defmodule MyApp.PageController do
  use MyApp, :controller
  
  def index(conn, _params) do
    theme = get_user_theme(conn)

    conn
    |> put_layout(theme)
    |> render('#{theme}/index.html')
  end
end 
kokolegorille

kokolegorille

Hello and welcome,

I think it should be…

|> put_layout(theme)

as theme is your variable.

Where Next?

Popular in Questions Top

aadeshere1
I have a another noob question about loop. Since elixir is immutable, while loop is not directly possible. total = 10 while total != 0 ...
New
qwerescape
Is there a way to get the call stack or stack trace at any point in the code? Not from exceptions, but an expression that returns how the...
New
ovidiubadita
Hey all, I discovered Elixir and I love it. I always wanted to learn a functional programming and I intended to go for Haskell, but afte...
New
JorisKok
I have a server on AWS, and was running a load test using artillery. When looking at the Phoenix dashboard I see the Ports going to 100% ...
New
stefanchrobot
What’s the safe way to decode a JSON string into a struct? I want to avoid calling String.to_atom. Jason.decode can give me a map with st...
New
beno
I will often find my self writing things similar to: case some_value do nil -> something() "" -> something() _ -> somethi...
New
vrod
I am using the Starship cross-shell prompt – it seems pretty nice, but I get some errors: [WARN] - (starship::utils): Executing command ...
New
dblack
I’ve got an issue with an app and I’ve no idea of how to troubleshoot it. I’m hoping someone here might have seen something similar. I p...
New
romenigld
I am trying to run a deploy with docker and I successfully runned with this command: docker build -t romenigld/blog-prod . but when I t...
New
vonH
In asking this question I am more interested about the expressiveness of the language itself and less concerned about the availability of...
New

Other popular topics Top

vertexbuffer
Hello, can anybody help here..? I have a list of players and I what to delete an element, but every for loop the list is reverting to ori...
New
albydarned
Hello all! I am typing this post from my new MacBook Pro with the M1 chip. I’m loving it so far, and will probably use it as my daily dr...
New
chrismccord
As promised, the first release candidate of Phoenix 1.3.0 is out! This release focuses on code generators with improved project structure...
New
msaraiva
Surface is an experimental library built on top of Phoenix LiveView and its new LiveComponent API that aims to provide a more declarative...
564 43622 214
New
hariharasudhan94
lets say i have a sample like a = 20; b = 10; if (a > b) do {:ok, "a"} end if (a < b) do {:ok, b} end if (a == b) do {:ok, "equa...
New
vonH
When I run the Plug and I recompile I wind up having to use Ctrl C to quit iex and start again. Witht the help of rlwrap I can use the cu...
New
grych
Hi folks, Few months ago I have announced the proof-of-concept of the library to manipulate the browsers DOM objects directly from Elixi...
639 52341 488
New
sergio_101
I am VERY much an elixir newbie. I have taken one elixir course and one phoenix course on Udemy. During that course, I saw the instructor...
New
axelson
This post is a wiki (feel free to hit the edit button near the bottom right of this post to add your own changes!) This post collects co...
239 47930 226
New
PeterCarter
There are pre-rolled solutions for other frameworks that do work. However, Phoenix does not seem to have these. Have people had good expe...
New

We're in Beta

About us Mission Statement