silverdr
Changing default layout in PHX 1.7 / LiveView
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?
Marked As Solved
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
Also Liked
josevalim
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.
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
silverdr
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.








