檢視原始碼 Phoenix.Template (phoenix_template v1.0.4)
範本是編譯為 Elixir 程式碼的標記語言。
這個模組提供載入和從磁碟編譯範本的函式。標記語言透過引擎編譯為 Elixir 程式碼。詳見 Phoenix.Template.Engine
。
實際上,開發人員很少直接使用 Phoenix.Template
。反之,使用程式庫例如 Phoenix.View
和 Phoenix.LiveView
作為構建區塊。
自訂範本引擎
Phoenix 支援自訂範本引擎。引擎會告訴 Phoenix 如何將範本路徑轉換為引用表達式。詳見 Phoenix.Template.Engine
以取得自訂引擎必須實作的 API 進一步資訊。
定義好範本引擎後,你可以透過 template engines 選項來告訴 Phoenix
config :phoenix, :template_engines,
eex: Phoenix.Template.EExEngine,
exs: Phoenix.Template.ExsEngine
格式編碼器
除了範本引擎,Phoenix 有格式編碼器的概念。格式編碼器會個別針對格式處理,並且負責將給定的格式編碼成字串。例如,在呈現 JSON 時,你的範本會傳回一個一般的 Elixir 映射。然後會呼叫 JSON 格式編碼器將它轉換為 JSON。
格式編碼器必須匯出一個名為 encode_to_iodata!/1
的函式,此函式會接收顯示製成品並傳回 iodata。
新編碼器可以透過格式編碼器選項新增
config :phoenix_template, :format_encoders,
html: Phoenix.HTML.Engine
摘要
函式
確保 __mix_recompile__?/0
會被定義。
針對給定 根
中的每個範本編譯函式。
將範本嵌入為函式的簡便巨集。
傳回關鍵字清單,內容包含所有範本引擎副檔名後接其模組。
傳回給定範本根目錄中的所有範本路徑。
傳回給定範本的格式編碼器。
傳回給定根目錄中所有範本路徑的雜湊值。
render(module, template, format, assigns)
render_to_iodata(module, template, format, assign)
render_to_string(module, template, format, assign)
類型
函式
確保 __mix_recompile__?/0
會被定義。
針對給定 根
中的每個範本編譯函式。
converter
是接收範本路徑並傳回函式名稱 (作為字串) 的匿名函式。
例如,若要編譯給定目錄中的所有 .eex
範本,您可以執行
Phoenix.Template.compile_all(
&(&1 |> Path.basename() |> Path.rootname(".eex")),
__DIR__,
"*.eex"
)
如果目錄中有名為 foo.eex
和 bar.eex
的範本,它們將編譯為接收範本 assigns
作為參數的函式 foo/1
和 bar/1
。
您也可以選擇傳遞引擎關鍵字清單。如果指定清單,我們將只搜尋並編譯引擎的此子集。如果未傳遞任何內容 (nil
),將使用 engines/0
傳回的預設清單。
將範本嵌入為函式的簡便巨集。
此巨集建立在更通用的 compile_all/3
功能之上。
選項
:root
- 要內嵌檔案的根目錄。預設為目前模組的目錄 (__DIR__
):suffix
- 要附加到內嵌函式名稱的字串值。預設情況下,函式名稱將是範本檔排除格式和引擎的名稱。
萬用字元模式可用於選擇目錄樹中的所有檔案。例如,假設目錄清單如下
├── pages
│ ├── about.html.heex
│ └── sitemap.xml.eex
然後將範本內嵌到您的模組中
defmodule MyAppWeb.Renderer do
import Phoenix.Template, only: [embed_templates: 1]
embed_templates "pages/*"
end
你的模組現在會擁有 about/1
及 sitemap/1
函數。請注意,不同格式的函數會被嵌入。如果你想加以區別,你可以提供更明確的模式
defmodule MyAppWeb.Emails do
import Phoenix.Template, only: [embed_templates: 2]
embed_templates "pages/*.html", suffix: "_html"
embed_templates "pages/*.xml", suffix: "_xml"
end
函數現在會是 about_html
及 sitemap_xml
。
傳回關鍵字清單,內容包含所有範本引擎副檔名後接其模組。
傳回給定範本根目錄中的所有範本路徑。
傳回給定範本的格式編碼器。
傳回給定根目錄中所有範本路徑的雜湊值。
Phoenix 用來檢查已給的基本路徑是否需要重新編譯。
render(module, template, format, assigns)
對於模組 MyApp.FooHTML
及範本 "index.html.heex",它將
首先嘗試呼叫
MyApp.FooHTML.index(assigns)
接著備用
MyApp.FooHTML.render("index.html", assigns)
否則提升
它預期 HTML 模組、作為字串的範本、格式及一組 assigns。
請注意,此函數會傳回範本的內部表徵。如果你想要編碼後的範本,則改用 render_to_iodata/4
。
範例
Phoenix.Template.render(YourApp.UserView, "index", "html", name: "John Doe")
#=> {:safe, "Hello John Doe"}
Assigns
Assigns 旨在成為使用者資料,這些資料將於範本中可用。不過,Phoenix 會特別處理 assigns 中的鍵,它們分為
:layout
- 告知 Phoenix 以給定的版面包覆已渲染的結果。請見下個章節
版面
可以使用 :layout
選項在其他範本中渲染範本。 :layout
接受表格 {LayoutModule, "template.extension"}
。
會在版面內顯示的範本將置於 @inner_content
assign
<%= @inner_content %>
render_to_iodata(module, template, format, assign)
render_to_string(module, template, format, assign)