I have an app that has a few pages where the html is just a single tag with an id that a javascript app gets loaded into. I do want those pages to load with the standard layouts/app.html.heex layout, but it seems silly to me to have a separate function in a separate file for just <div id="app-target"></div>. Is there a way to call something like the Phoenix.Controller.html function in a way that you can (1) pass it some .heex sigil code, and (2) have it render with the app’s layout included?
Basically, I want to be able to do something like this:
defmodule MyAppWeb.MyController do
use MyAppWeb, :controller
def show(conn, _params) do
conn
|> heex(~H"""
<div id="app-target"></div>
"""
, assign_1: "some assign for app.html.heex layout", assign_2: "some other assign for app.html.heex layout")
end
end
Just as @lubien said!
Only it would return %Phoenix.LiveView.Rendered{} struct which can be converted to IO data to send to client via Phoenix.HTML.Safe.to_iodata/1
For anyone who’s curious, I have not figured out how to get this function to apply the app’s normal layouts in the traditional way with this technique, but I did figure out a decent workaround. I changed the <%= @inner_content %> line in app.html.heex and root.html.heex from this
<%= @inner_content %>
to this
<%= if assigns[:inner_content] do %>
<%= @inner_content %>
<% else %>
<%= render_slot(@inner_block) %>
<% end %>
and now when I call the heex function, I can just add them around the heex template explicitly so the end result looks like this: