布局定义了您页面的通用框架,这通常意味着每个页面上重复出现的所有内容,例如页眉和页脚。它们几乎总是包含 HTML 代码,例如 HEAD、TITLE 和 BODY 标签。
布局模板文件位于您主题的 layouts 目录中。布局模板文件应具有 htm 扩展名。在布局文件中您应使用 {% page %} 标签来输出页面内容。接下来是可能最简单的布局示例。
<html>
<body>
{% page %}
</body>
</html>请记住,如果你从一个子目录引用布局,你应该指定该子目录的名称。
要为一个 页面 使用布局,该页面应在配置部分引用布局文件名(不带扩展名)。下面是一个使用 default.htm 布局的示例页面模板。
url = "/"
layout = "default"<p>Hello, world!</p>当请求此页面时,其内容会与布局合并,或者更精确地说 - 布局的 {% page %} 标签会被页面内容替换。 先前的示例将生成以下标记:
<html>
<body>
<p>Hello, world!</p>
</body>
</html>请注意,你可以在布局中渲染局部文件。这让你能够共享不同布局之间常见的标记元素。例如,你可以有一个局部文件,用于输出网站的 CSS 和 JavaScript 链接。这种方法简化了资源管理 - 如果你想添加一个 JavaScript 引用,你应该修改一个局部文件,而不是编辑所有布局。
配置部分对于布局是可选的。支持的配置参数是 name 和 description。这些参数是可选的,并在后端用户界面中使用。带描述的布局模板示例:
description = "Basic layout example"<html>
<body>
{% page %}
</body>
</html>一个 页面 的 meta_title 和 meta_description 属性支持从页面生命周期中解析变量。以下布局模板将基于活动页面的值设置页面标题。
<html>
<head>
<title>{{ this.page.meta_title }} - October CMS</title>
</head>
<body>
{% page %}
</body>
<html>页面模板随后可以使用类似 Twig 的变量语法并利用全局环境中可用的值来定义其标题,本例中使用了 post.title 值。
url = "/blog"
meta_title = "{{ post.title }} - Blog"注意: 仅支持基本的 Twig 变量。不支持使用过滤器、标签和函数。
占位符允许页面将内容注入到布局中。占位符在布局模板中通过 {% placeholder %} 标签定义。下一个示例展示了一个布局模板,其中包含一个在HTML HEAD部分中定义的占位符 head。
<html>
<head>
{% placeholder head %}
</head>
...
</html>页面可以使用 {% put %} 和 {% endput %} 标签向占位符注入内容。以下示例演示了一个简单的页面模板,该模板将一个 CSS 链接注入到上一个示例中定义的占位符 head 中。
url = "/my-page"
layout = "default"{% put head %}
<link href="/themes/demo/assets/css/page.css" rel="stylesheet">
{% endput %}
<p>The page content goes here.</p>有关占位符的更多信息可以在 在标记指南中 找到。
布局,和页面一样,可以使用任何 Twig 特性。 请参阅 动态页面部分 的文档以了解详情。
在布局的 PHP 部分中,你可以定义以下函数来处理页面执行生命周期: onInit, onStart, onBeforePageStart and onEnd.
onInit 函数在所有组件初始化完成且处理 AJAX 请求之前执行。 onStart函数在页面处理开始时执行。 onBeforePageStart 函数在布局 组件 运行后但在页面的 onStart 函数执行之前执行。 onEnd函数在页面渲染后执行。 处理程序的执行顺序如下:
onInit() 函数。onInit() 函数。onStart() 函数。布局组件的 onRun() 方法。onBeforePageStart() 函数。onStart() 函数。onRun() 方法。onEnd() 函数.onEnd() 函数。最近的上下文用于访问局部文件、页面和布局内部的变量和方法。请看以下 PHP 代码片段 的定义。
function onStart()
{
$this['myVariable'] = 'foo';
}
function myMethod()
{
return 'bar';
}在上述示例中,访问myVariable或this.myMethod()在 Twig 内部将按照以下顺序检查其存在性:
布局可以在其设置中指定一个 is_priority 属性,以激活优先级模式。在正常情况下,布局内容在页面内容之后渲染。这使得页面可以操作布局属性,例如标题或元描述。从视觉上看,顺序如下所示。
Layout (3) ← Page (1) → Partials (2)在优先级模式下,布局使用更自然的加载顺序,其中 {% page %} 标签与布局内容内联渲染。然而,在使用此模式时,不支持占位符。优先级布局的加载顺序更像这样。
Layout (1) → Page (2) → Partials (3)这在 构建 API 端点 时特别有用. 在以下示例中, 页面逻辑将不会运行因为页面标签从未被调用.
description = "API Layout"
is_priority = 1{% if false %}
{% page %}
{% endif %}