silverdr

silverdr

In 1.6 one could use something like

pipeline :guest_layout do
	plug :put_layout, {PhxAppWeb.LayoutView, :guest}
end

inside router.ex and then pipe_through it in appropriate scope. That doesn’t seem to work anymore in 1.7? How does one change the app layout these days?

Showing Posts 1 to 5

codeanpeace

codeanpeace

It looks like the function signature for put_layout/2 has changed from v1.6 to v1.7 such that the second argument now expects a keyword list that includes format :: atom() as the first item in each tuple.

put_layout/2 in v1.6:

@spec put_layout(
  Plug.Conn.t(),
  {atom(), binary() | atom()} | atom() | binary() | false
) ::
  Plug.Conn.t()

conn = put_layout conn, {AppView, "application.html"}
conn = put_layout conn, "print.html"

put_layout/2 in v1.7:

@spec put_layout(
  Plug.Conn.t(),
  [{format :: atom(), layout()}] | false
) ::
  Plug.Conn.t()

conn = put_layout(conn, html: {AppView, :application})
conn = put_layout(conn, html: :print)

Maybe try something like this:

pipeline :guest_layout do
	plug :put_layout, [html: {PhxAppWeb.LayoutView, :guest}]
end
addstar

addstar

I wanted to have a different layout for certain live view pages and I ended up modifying the my_app_web.ex file so that in my live views I could do this use MyAppWeb, {:live_view, layout: :home}. I do wonder if someone has a different approach though?

codeanpeace

codeanpeace

You could try scopes that pipe through different Router plugs like what @silverdr was doing.

defmodule HelloWeb.Router do
  use HelloWeb, :router

  pipeline :guest_layout do
    plug :put_layout, [html: {HelloWeb.LayoutView, :guest}]
  end

  pipeline :admin_layout do
    plug :put_layout, [html: {HelloWeb.LayoutView, :admin}]
  end

  scope "/guest", HelloWeb do
    pipe_through [:guest_layout]
    live "/feed", HelloWeb.FeedLive, :index
    live "/status", HelloWeb.StatusLive, :index
    live "/status/:id", HelloWeb.StatusLive, :show
  end
  
  scope "/admin", HelloWeb do
    pipe_through [:admin_layout]
    live "/admin", HelloWeb.AdminDashboardLive, :index
    live "/admin/posts", HelloWeb.AdminPostLive, :index
  end
end

Poking around the LiveView docs, I see there’s also a live_session/3 function for grouping together live routes into a session for live redirects which happens to accept an optional layout in the form of “a tuple with the view module and template string or atom name”.

defmodule HelloWeb.Router do
  use HelloWeb, :router

  live_session :guest, layout: {HelloWeb.LayoutView, :guest} do
    live "/feed", HelloWeb.FeedLive, :index
    live "/status", HelloWeb.StatusLive, :index
    live "/status/:id", HelloWeb.StatusLive, :show
  end

  live_session :admin, layout: {HelloWeb.LayoutView, :admin} do
    live "/admin", HelloWeb.AdminDashboardLive, :index
    live "/admin/posts", HelloWeb.AdminPostLive, :index
  end
end
josevalim

josevalim

Creator of Elixir

Excellent replies @codeanpeace.

I have pushed a commit to LiveView that improves its docs: Improve layout docs · phoenixframework/phoenix_live_view@5ef4153 · GitHub

For regular controllers (put_layout) both old and new styles should be supported, this means your code should work @silverdr. Please open up a bug report with reproduction steps if it does not.

silverdr

silverdr OP

It was a combination of factors that caused some confusion. Actually the original style works. The reason for it not working was elsewhere but since LS reported that Function guest_layout/2 has no local return it looked like the old style no longer working. When I change to the new style though, the Dialyzer warning disappears, but… the pipeline becomes ineffective. IOW - this:

	pipeline :guest_layout do
		plug :put_layout, {PhxAppWeb.LayoutView, :guest}
	end

works despite the warning being emitted, while changing it to:

	pipeline :guest_layout do
		plug :put_layout, [html: {PhxAppWeb.LayoutView, :guest}]
	end

makes the warning go away together with the functionality of changing the layout. Any clues? The layout and view is a DeadView if this makes any difference.

— All posts loaded —

Where Next? Top

Trending in Questions Top

katta
I having some trouble figuring out if I have set myself too strict of standards for my production server. Currently I can handle 75% of r...
New
achenet
Hello, I’m trying to build a basic Phoenix web-app, and I’d like to use Tailwind. However, when I launch mix phx.server, I get an error...
New
Cxx-mlr
I’m working on a small exercise involving update_in/3, and I came up with this solution: data = %{ name: "Periodic Table", category:...
New
ChrisAmelia
I’ve got trouble wrapping my head around the order in which functions are called in this snippet (from Phoenix’s authentication): toke...
New
unaware8150
Hello folks! So at work, we are seeing some situations where we have to define some “fixed” strings that are used across the codebase in...
New
dillonoconnor
Is there any way to avoid the Hologram compiler running when using iex? It seems like the front-end code could potentially be disregarded...
New
thiagogsr
** (ArgumentError) expected :max_attempts to be a positive integer, got: {:@, [line: 10, column: 19], [{:max_attempts, [line: 10, column:...
New

Other Trending Topics Top

GenericJam
Edit: 2026 May 15 - This post is archived. Mob is alive!! Main docs: mob v0.7.11 — Documentation A bit of explanation for the slightly c...
New
garrison
Hobbes is a low-level distributed database for the Elixir programming language. Hobbes provides a simple, safe, and scalable storage lay...
New
budgie
A little off-topic, but I feel like people here have a good head on their shoulders. I used to be quite good at making software. Was luc...
New
KristerV
Hey. Is there anyone here who creates agents in their apps? Not talking about using agents, but creating them. I’m finding it pretty diff...
New
mcass19
ExRatatui lets you cook up rich terminal UIs in Elixir, powered by Rust’s ratatui via Rustler NIFs. Build interactive terminal applicatio...
New
georgeguimaraes
Just published claude-code-elixir, a plugin marketplace for Claude Code with Elixir support. These are the plugins I’ve been using for my...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews