模板语法

XenForo 2 模板语法对于开发人员和论坛管理员都是强大的工具,使您可以完全控制 XenForo 页面的排版。

最佳示例

  • 按照惯例,XenForo 的标签是 lowercase
  • 所有 XenForo 标签都以 xf: 命名空间为前缀。

有帮助的消息

对模板进行注释

如果您想注释掉一些您不想在最终页面原代码中看到的模板代码(或者励志的消息),则可以使用 xf:comment 标签。

<xf:comment>
如果你不再以你喜欢什麽和不喜欢什麽来看待这个世界,
而是看到了事物本身的真实面目,
你就会发现你的生活将会更加地祥和。
</xf:comment>

在模板中加入另一个模板

xf:include 标签允许你在当前模板中加入一个不同的模板。

<xf:include template="my_template" />

只需将 template 属性设置为你想加入的模板名称即可。

模板巨集

模板巨集是 XenForo 模板语法的一个非常强大的部分。

通常,你应该在编程语言中使用函数或子程序的任何地方使用巨集。 对于非程序员来说,我把这一点总结为:要么在任何您想在多个不同文件中多次生成相同事物的地方使用巨集,或者在不同情况下生成不同的东西(如果你查看定义巨集的指南,这可能会更有帮助)。

Warning

出于可读性原因,您不应该使用巨集标签作为变量。 您应该使用 Set 标签,并像对待任何模板变量一样对待变量。

定义巨集

<xf:macro
    name="my_macro_name">

    <!-- 你的巨集内容 -->

</xf:macro>

最简単的,可以用 name 属性定义一个巨集,并在巨集标签中重复你想要的内容。

Note

当您在多个文件中使用巨集时,最佳做法是将巨集放入自己的模板中。

巨集参数

<xf:macro
    name="my_macro_name"
    arg-message="我超厉害的巨集消息!">

    <h1>消息</h1>
    <p>{$message}</p>

</xf:macro>

在此示例中,为巨集定义了 arg-message (我惊人的巨集消息!) 的默认值。 如果使用 message 参数调用巨集,则该值将被复盖。

有时需要将一个参数标记为必填项。 这可以通过在巨集定义中把参数值设置为 ! 来实现。

加入和使用巨集

<xf:macro template="my_macro_template" name="my_macro_name" />

最简単的方法是,通过设置 name 属性并将标签保留为空来加入巨集。

Note

使用巨集标签时,你应该使用标签的自动关闭形式,以便让别人更容易区分巨集的定义和用法的区别。

巨集参数

您还可以为巨集提供参数:

<xf:macro template="my_macro_template" name="my_macro_name" arg-argName="argValue" />

其中 argName 是巨集参数的名称。

Note

您应该使用 lowerCamelCase 来命名你的巨集参数。

模板控制结构

XenForo 2 模板语法支援某些控件结构,以使某些任务更易于实现。

If 标签

if 模板标签可用于有条件地显示一些 HTML 或模板的一部分。

<!-- Shows content only if a user is signed in... -->
<xf:if is="$xf.visitor.user_id">
    <!-- 做点什麽... -->
</xf:if>

if 标签具有以下属性:

  • is - 满足条件时应显示标签内容的条件。

条件

is 属性支援一些逻辑运算符:

  • OR - 用于连接替代条件。(二择一: ||
  • AND - 用于连接其他条件。 (二择一: &&
  • ! - 放在条件前,使其反転。(称为:"否")
  • XOR - 如果两个条件中只有一个为 true,则返回 true。(称为:"异或")

Else/Else-If 标签

else 和 else-if 标签与 if 标签结合使用,以按名称建议的方式有条件地显示 HTML。

else 用法示例:

<xf:if is="$xf.visitor.is_admin">
    <!-- 这里的内容只有管理员才会看到... -->
<xf:else />
    <!-- 这里的内容将被显示给任何非管理员的人看到! -->
</xf:if>

else-if 的用法示例:

<xf:if is="$xf.visitor.is_admin">
    <!-- 这里的内容只有管理员才会看到... -->
<xf:elseif is="$xf.visitor.is_moderator" />
    <!-- 这里的内容只会显示给版主(不包括兼任管理员的用户)。 -->
<xf:else />
    <!-- 这里的内容将显示给非管理员或版主的任何人。 -->
</xf:if>

正如你所看到的,一旦一个条件被满足,其余的 if 语句将被忽略。(所以,在这种情况下,如果用户是管理员,上面的 xf:if 部分被运行,其余的 if 语句则被忽略。)

For-each 标签

for-each 标签使您可以遍历项目数组,为每个项目印出 HTML 区块。

<xf:set var="$names" value="{{ ['派翠克', '特丽莎', '金博尔', '韦恩', '格雷斯'] }}" />

<xf:foreach loop="$names" key="$key" value="$name" i="$i">
    <p>你好, {$name}。 这是名字 {$i} 。 该元素的数组 key 值为: {$key}</p>
</xf:foreach>

for-each 标签具有以下属性:

  • loop - 要循环的数组。
  • key - 在循环中使用的变量名称,以获取当前元素的数组 key。 可以是整数(普通数组)或字符串(关联数组)。
  • value - 在循环中使用的变量名称,包含当前数组项。
  • i - 在循环中用于当前索引的变量名称。

输出示例

你好,派翠克。 这是名字 1。

你好,特丽莎。 这是名字 2。

你好,金博尔。 这是名字 3。

你好,韦恩。 这是名字 4。

你好,格雷斯。 这是名字 5。

模板标签

头像标签

在页面中插入用户的头像。

<xf:avatar user="{$xf.visitor}" size="o" canonical="true" />

头像标签具有以下属性:

  • user - 要生成头像的 XenForo 用户物件。
  • size - 要生成的图像大小。(参见图像尺寸)
  • canonical - 是否使用有利于 SEO 的完整 URL。该值只对 custom 头象有效。
  • notooltip - 当鼠标悬停在头像上时显示的工具提示是否应该被关闭。
  • forcetype - 可以用来强制取得 gravatarcustom 头像,设置值为其中之一。
  • defaultname - 如果 user 属性包含一个无效的用户时,默认要使用的用户名称。

图像大小

如果提供的头像大小无效,则代码将回退到大小 's'。

  • o - 384px
  • h - 384px
  • l - 192px
  • m - 96px
  • s - 48px

页面路径导览列标签

修改页面路径导览列。

<xf:breadcrumb href="{{ link('my_page') }}">{{ phrase('my_page_name') }}</xf:breadcrumb>

页面路径导览列标签具有以下属性:

  • href - 为页面路径导览列中的最后一个元素设置的链接。

标签的值可用于设置页面路径导览列中最后一个元素的名称。

其他用法

<xf:breadcrumb source="$category.getBreadcrumbs(false)" />

您还可以通过 source 在页面路径导览列标签的属性中调用函数来以编程方式定义自己的页面路径导览列。

source 参数基本上采用一个具有 hrefvalue 属性的物件数组(多维数组),其中每个物件都是一个页面路径导览列元素。

Note

如果要更改根目录页面路径导览列,可以在 "基本信息面板" 选项部分中更改 "Root breadcrumb" 选项。

按钮标签

添加具有适当类的按钮元素以及(可选)图标。

<xf:button icon="save"></xf:button>

button 标签具有以下属性:

  • icon - 应用于按钮的图标类。(参见按钮图标)

按钮图标

默认情况下,XenForo 按钮支援以下图标(使用CSS创建):

  • add
  • confirm
  • write
  • import
  • export
  • download
  • disable
  • edit
  • save
  • reply
  • quote
  • purchase
  • payment
  • convert
  • search
  • sort
  • upload
  • attach
  • login
  • rate
  • config
  • refresh
  • translate
  • vote
  • result
  • history
  • cancel
  • preview
  • conversation
  • bolt
  • list
  • prev
  • next
  • markRead
  • notificationsOn
  • notificationsOff
  • merge
  • move
  • copy
  • approve
  • unapprove
  • delete
  • undelete
  • stick
  • unstick
  • lock
  • unlock

Callback 标签

运行一个 PHP Callback 方法。

<xf:callback class="Vendor\Addon\Class" method="getX" params="['abc']"></xf:callback>

此 callback 标签具有以下属性:

  • class - 该 class(从 root 命名空间)包含要运行的方法。
  • method - 要运行的方法。 (参见 callback 方法)
  • params - 提供给此方法的参数数组。

Callback 方法

为了使一个方法被认为是 callback 方法,必须对其进行适当的命名,否则它将抛出错误 'callback_method_x_does_not_appear_to_indicate_read_only'。为了使它被认为是唯读的,方法名称必须以下列前缀之一开头:

  • are
  • can
  • count
  • data
  • display
  • does
  • exists
  • fetch
  • filter
  • find
  • get
  • has
  • is
  • pluck
  • print
  • render
  • return
  • show
  • total
  • validate
  • verify
  • view

CSS 标签

加入一个外部 CSS 或 LESS 模板文件。

<xf:css src="mycss_file.css"  />

CSS 标签具有以下属性:

  • src - 要加入的 CSS 或 LESS 模板文件。

其他用法

<xf:css>
html, body {
 font-family: "Roboto", sans-serif;
}
</xf:css>

如果 CSS 标签不为空,则标签中的所有内容都将転换为嵌入式 CSS。

进一步说明

对于[CSS],不用再将它们称为文件了。将它们复制并粘贴到新模板中,并按如下所示进行调用:
来源自:克里斯·D,XenForo 开发人员

<xf:css src="questionthreads_fonticonpicker.css" />
<xf:css src="questionthreads_fonticonpicker_grey.css" />

JS 标签

加入一个JavaScript文件。

<xf:js src="myaddon/vendor/scripts/myjs_file.js"  />

JS 标签具有以下属性:

  • src - 要加入到模板中的 JS 文件。
  • prod - 要加入到模板中的 JS 文件,只适用于生产模式。
  • dev - 要加入到模板中的 JS 文件,只适用于开发模式。
  • min - 是否要加入最小化版本的文件。(用 .min.js 取代 .js) - 只需要在生产模式下关心。
  • addon - 是否要使用开发中 JS 的 URL。 - 只需要在开发模式下关心。

Warning

The src tag cannot be used in conjunction with either the prod or dev tags.

其他用法

<xf:js>
alert("真相很伤人,我知道。其实这是基于生物学上的。");
</xf:js>

如果 JS 标签不为空,则标签中的所有内容都会転换为嵌入式 JS。

进一步说明

JavaScript 文件是相对于 /js 目录提供的。尽管不建议这样做,但您也可以在此标签中加入外部资源。

这个标签在 editor 模板中就是一个很好的例子。

Set 标签

set 标签允许您创建一个对另一个变量的参考或创建一个新的变量。你应该在编程语言中使用变量的任何地方使用 set 标签。

<xf:set var="$visitor" value="{$xf.visitor}" />

Warning

不要对要在多个模板中使用的一组元素使用 Set 标签,而应使用 Macro 标签。

Warning

变量名称(var 属性)必须以 $ 开头。

set 标签具有以下属性::

  • var - 您想定义变量的名称(本质上是别名)。
  • value - 要参考的变量或变量值。

其他用法

<xf:set var="$myVariableName">
我的变量值!
这可以是一个 callback,或者只是一组短语。
</xf:set>

如果 value 未提供属性且标签不为空,则变量值将设置为标签的内容。

Warning

当您以这种形式使用 Set 标签时,该值将被転义,并且结果值将是一个字符串。该 value 属性虽然不支援 HTML 或类似 HTML 的标签,但没有此限制。

Likes 标签

显示帖子的喜欢次数以及一些喜欢该帖子的用户。

<xf:likes content="{$post}" url="" />

likes 标签具有以下属性:

  • content - 要显示 '喜欢' 文本的 XF\Entity\PostXF\Entity\ProfilePost 数据实体。
  • url - 点击 '喜欢' 文本时显示的 URL。

格式

你, 里斯本, kcho 和 2 其他人

格式为 [👍 abc 和 2 其他人](其中 👍 "大拇指" 表情符代表 "点賛" 图标,abc 代表最后三个点賛该帖子的用户名字。)

参见 Sectioned 标签.

SideNav 标签

参见 Sectioned 标签.

Title 标签

设置页面的标题,包括页面上的 h1 标签和浏览器标签。

<xf:title>{{ phrase('my_page_title') }}</xf:title>

进一步说明

虽然可以对 Title 进行永久性编辑,但是 强烈建议 您使用一个短语,以实现国际化,并增加网站管理员端的可定制性。

Widget 标签

在页面中包含小组件,或将小组件添加到小组件的位置上。

<xf:widget key="widget_name" />

widget 标签具有以下属性:

  • key - 小组件的 key,如小组件设置中定义的。
  • position - 如果设置,则改变小组件将被喧染的位置。
  • class - 不要与 HTML 的 class 混肴,这是包含小组件定义的 PHP 类。
    • title - 当使用 class 属性时,您可以使用 title 属性来设置小组件的标题。
    • 当使用class属性时,你也可以提供小组件特定的选项作为属性。

Warning

class 标签不能与 key 标签一起使用。

UserActivity 标签

根据用户上一次操作以及该操作发生的时间来显示用户的状态。

<xf:useractivity user="{$xf.visitor}" />

UserActivity 标签具有以下属性:

  • user - 用户显示的状态。

格式

查看页面 最新案例文件 · 4分锺前

格式为 [活动名称] · [时间]

UserBanners 标签

在水平列表中显示用户的横幅。

<xf:userbanners user="{$xf.visitor}" />

UserBanners 标签具有以下属性:

  • user - 显示该用户的用户横幅。

示例

UserBanners 标签的示例结果。

UserBanners 标签的示例结果。

UserBlurb tag

显示用户个人资料的単行摘要。

<xf:userblurb user="${xf.visitor}" />

UserBlurb 标签具有以下属性:

  • user - 显示 XenForo 用户对象的简介。

格式

FBI 顾问 · 43 · 来自美国

格式为 [角色 / 自定义标题] · 年龄 · 位置

Username 标签

Displays the user's username, optionally with a tool-tip. 显示用户的用户名,可选择使用工具提示。 显示用户的用户名(可选)和工具提示。

<xf:username user="{$xf.visitor.username}" notooltip="true" />

Username 标签具有以下属性:

  • user - 要显示其名称的 XenForo 用户对象。
  • notooltip - 是否关闭工具提示。
  • href - 点击用户名时所导向到的链接。

Warning

如果设置了 href,则不会显示工具提示,因为它不起作用,而且可能会误导用户。

UserTitle 标签

Displays the user's title.显示用户的头衔。

<xf:usertitle user="{$xf.visitor}" />

UserTitle 标签具有以下属性:

  • user - 此 XenForo 用户物件,用于显示用户头衔。

Sectioned 标签

Sectioned 标签全都会调用函数 modifySectionedHtml。 它们修改的 HTML 元素就是标签名称。因此 sidebar 标签会修改侧边栏的 HTML 等等。

示例

<xf:sidebar>
 <h1>我的神奇侧边栏!</h1>
</xf:sidebar>

共同属性

  • mode - 修改模式。(请参阅修改模式)

修改方式

默认情况下,修改方式为 replace。(即,如果没有指定属性。)

  • prepend - 将标签的内容放在 HTML 元素的开头。
  • append - 将标签的内容放在 HTML 元素的末尾。
  • replace - 用标签的内容替换 HTML 的元素。