Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Phoenix additional layout variables like @inner

I am looking to add additional layout parameters like the @inner for the layout. For example @title for the <title>@title</title> and an area for onload javascript for individual pages.

window.onload = function () {
   @onload_js
}

These are set in the layout, so I am not sure the best way to handle these in Phoenix. Thanks :D.

like image 854
rockerBOO Avatar asked Sep 02 '15 14:09

rockerBOO


Video Answer


1 Answers

For the page title, you can simply pass a value through from your controller:

def edit(conn, params) do
  render(conn, "edit.html", page_title: "Edit The Thing")
end

<head>
  <title><%= assigns[:page_title] || "Default Title" %></title>
</head>

Note that this uses assigns[:page_title] instead of @page_title or assigns.page_title as they will error if the :page_title key is not present in assigns.


For including templates (your script example) there is render_existing/3 (and the docs for the same function in the latest version of Phoenix).

The documentation gives a similar example to what you requested so I have copied it here for convenience:

Consider the case where the application layout allows views to dynamically render a section of script tags in the head of the document. Some views may wish to inject certain scripts, while others will not.

<head>
  <%= render_existing view_module(@conn), "scripts.html", assigns %>
</head>

Then the module for the @inner view can decide to provide scripts with either a precompiled template, or by implementing the function directly, ie:

def render("scripts.html", _assigns) do
  "<script src="...">"
end

To use a precompiled template, create a scripts.html.eex file in the templates directory for the corresponding view you want it to render for. For example, for the UserView, create the scripts.html.eex file at web/templates/user/.

like image 94
Gazler Avatar answered Sep 21 '22 19:09

Gazler