檢視原始碼 Phoenix.Template (phoenix_template v1.0.4)

範本是編譯為 Elixir 程式碼的標記語言。

這個模組提供載入和從磁碟編譯範本的函式。標記語言透過引擎編譯為 Elixir 程式碼。詳見 Phoenix.Template.Engine

實際上,開發人員很少直接使用 Phoenix.Template。反之,使用程式庫例如 Phoenix.ViewPhoenix.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 會被定義。

連結到此巨集

compile_all(轉換器,根,範本 \\ "*",引擎 \\ nil)

檢視程式碼來源 (巨集)

針對給定 中的每個範本編譯函式。

converter 是接收範本路徑並傳回函式名稱 (作為字串) 的匿名函式。

例如,若要編譯給定目錄中的所有 .eex 範本,您可以執行

Phoenix.Template.compile_all(
  &(&1 |> Path.basename() |> Path.rootname(".eex")),
  __DIR__,
  "*.eex"
)

如果目錄中有名為 foo.eexbar.eex 的範本,它們將編譯為接收範本 assigns 作為參數的函式 foo/1bar/1

您也可以選擇傳遞引擎關鍵字清單。如果指定清單,我們將只搜尋並編譯引擎的此子集。如果未傳遞任何內容 (nil),將使用 engines/0 傳回的預設清單。

連結到此巨集

embed_templates(範本,opts \\ [])

檢視程式碼來源 (巨集)

將範本嵌入為函式的簡便巨集。

此巨集建立在更通用的 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/1sitemap/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_htmlsitemap_xml

@spec engines() :: %{required(atom()) => module()}

傳回關鍵字清單,內容包含所有範本引擎副檔名後接其模組。

指向此函數的連結

find_all(根,範本 \\ "*",引擎 \\ engines())

檢視程式碼來源
@spec find_all(root(), pattern :: String.t(), %{required(atom()) => module()}) :: [
  path()
]

傳回給定範本根目錄中的所有範本路徑。

@spec format_encoder(format :: String.t()) :: module() | nil

傳回給定範本的格式編碼器。

指向此函數的連結

雜湊(根,範本 \\ "*",引擎 \\ engines())

檢視程式碼來源
@spec hash(root(), pattern :: String.t(), %{required(atom()) => module()}) :: binary()

傳回給定根目錄中所有範本路徑的雜湊值。

Phoenix 用來檢查已給的基本路徑是否需要重新編譯。

指向此函數的連結

module_to_template_root(模組, 基本, 字尾)

檢視程式碼來源
此函數已過時。請使用 Phoenix.View.module_to_template_root/3。

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 %>
指向此函數的連結

從模組呈現範本,並傳回 iodata。

檢視程式碼來源

render_to_iodata(module, template, format, assign)

render_to_string(module, template, format, assign)

指向此函數的連結

template_path_to_name(路徑, 根目錄)

檢視程式碼來源
此函數已過時。請使用 Phoenix.View.template_path_to_name/3。