页面

October CMS Documentation Docs

页面

每个网站至少提供一个页面,在 October CMS 中,一个页面用页面模板表示。 页面模板文件位于主题的 pages 目录中。 页面文件名不会影响路由,但根据页面的功能来命名页面是个好主意。 这些文件应具有 htm 扩展名。

页面需要 配置部分Twig 模板部分,但 PHP 部分 是可选的 . 下面,您可以看到最简单的主页示例:

url = "/"
==
<h1>Hello, world!</h1>

# 页面配置

页面配置定义在页面模板文件的配置部分中。 页面配置定义了路由和渲染页面及其组件所需的页面参数,在另一篇文章中进行了解释。 页面支持以下配置参数:

参数 描述
url 页面 URL,必填。 URL 语法如下所述。
title 页面标题,必填。
layout 页面 布局,可选。 如果指定,则应包含布局文件的名称,不带扩展名,例如:default
description 后端界面的页面描述,可选。
hidden 隐藏页面只能由登录的后端用户访问,可选。

# URL 语法

页面 URL 使用 url 配置参数定义。 URL 应以正斜杠字符开头,并且可以包含参数。 没有参数的 URL 是固定且严格的。 在以下示例中,页面 URL 是 /blog

url = "/blog"

注意:页面 URL 默认不区分大小写。

带参数的 URL 更灵活。 具有以下示例中定义的 URL 模式的页面将针对任何地址(如 /blog/post/something)显示。 URL 参数可以通过 October 组件或从页面 PHP 代码 部分访问。

url = "/blog/post/:post_id"

这是从页面的 PHP 部分访问 URL 参数的方法(有关更多详细信息,请参阅 动态页面 部分):

url = "/blog/post/:post_id"
==
function onStart()
{
    $post_id = $this->param('post_id');
}
==

参数名称应与 PHP 变量名称兼容。 要使参数可选,请在其名称后添加一个问号:

url = "/blog/post/:post_id?"

URL 中间的参数不能是可选的。 在下一个示例中,:post_id 参数被标记为可选,但会按要求进行处理。

url = "/blog/:post_id?/comments"

可选参数可以具有默认值,这些默认值用作备用值,以防 URL 中未显示实际参数值。 默认值不能包含任何星号*、管道符号|或问号?。 默认值在**?**之后指定。 在下一个示例中,URL /blog/categorycategory_id 参数将为 10

url = "/blog/category/:category_id?10"

您还可以使用正则表达式来验证参数。 要添加验证表达式,请在参数名称后添加管道符号或问号,并指定表达式。 这些表达式中不允许使用正斜杠符号。 例子:

url = "/blog/:post_id|^[0-9]+$/comments" ; this will match /blog/10/comments

url = "/blog/:post_id|^[0-9]+$" ; this will match /blog/3

url = "/blog/:post_name?|^[a-z0-9\-]+$" ; this will match /blog/my-blog-post

通过在参数后放置一个星号,可以使用特殊的通配符参数。 与常规参数不同,通配符参数可以匹配一个或多个 URL 段。 一个 URL 只能包含一个通配符参数,不能使用正则表达式,也不能跟一个可选参数。

url = "/blog/:category*/:slug"

但是,通配符参数本身可以通过在星号前加上 ? 字符来成为可选参数。

url = "/blog/:slug?*"

例如,像 /color/:color/make/:make*/edit 这样的 URL 将匹配 /color/brown/make/volkswagen/beetle/retro/edit 并提取以下参数值:

  • color: brown
  • make: volkswagen/beetle/retro

注意:子目录不影响页面 URL - URL 仅使用 url 参数定义。

# 动态页面

在页面模板的 Twig 部分 内,您可以使用任何 由 October 提供的功能、过滤器和标签。任何动态页面都需要变量。 在October,变量可能由页面、布局PHP 部分组件 准备。在本文中,我们将在 PHP 部分描述如何准备变量。

# 页面执行生命周期

可以在页面和布局的 PHP 部分定义特殊函数:onInitonStartonEndonInit 函数在所有组件初始化时和 AJAX 请求被处理之前执行。 onStart 函数在页面执行开始时执行。 onEnd 函数在页面渲染之前和页面 组件 执行之后执行。在 onStartonEnd 函数中,你可以将变量注入到 Twig 环境中。使用 数组表示法 将变量传递给页面:

url = "/"
==
function onStart()
{
    $this['hello'] = "Hello world!";
}
==
<h3>{{ hello }}</h3>

下一个例子更复杂。 它展示了如何从数据库加载博客文章集合,并显示在页面上(Acme\Blog 插件是虚构的):

url = "/blog"
==
use Acme\Blog\Classes\Post;

function onStart()
{
    $this['posts'] = Post::orderBy('created_at', 'desc')->get();
}
==
<h2>最新帖子</h2>
<ul>
    {% for post in posts %}
        <h3>{{ post.title }}</h3>
        {{ post.content }}
    {% endfor %}
</ul>

标记指南 中描述了 October 提供的默认变量和 Twig 扩展。 动态布局 文章描述了处理程序的执行顺序。

# 发送自定义响应

执行生命周期中定义的所有方法都能够停止进程并返回响应——只需从生命周期函数返回响应即可。 下面的示例不会加载任何页面内容,而是将字符串 Hello world! 返回给浏览器:

function onStart()
{
    return 'Hello world!';
}

一个更有用的例子是使用 Redirect 门面触发重定向:

public function onStart()
{
    return Redirect::to('http://google.com');
}

# 处理表单

您可以使用在页面或布局中定义的处理程序方法处理标准表单 PHP 部分(处理 AJAX 请求在 AJAX 框架 中有说明) 文章)。 使用 form_open() 函数定义引用事件处理程序的表单。 例子:

{{ form_open({ request: 'onHandleForm' }) }}
    请输入字符串: <input type="text" name="value"/>
    <input type="submit" value="Submit me!"/>
{{ form_close() }}
<p>Last submitted value: {{ lastValue }}</p>

onHandleForm 函数可以在页面或布局 PHP section 中定义,如下所示:

function onHandleForm()
{
    $this['lastValue'] = post('value');
}

处理程序使用 post 函数加载值并初始化页面的 lastValue 属性变量,该变量显示在第一个示例中的表单下方。

注意:如果在页面布局、页面和页面组件中定义了同名的处理程序,October将执行页面处理程序。 如果在组件和布局中定义了处理程序,则将执行布局处理程序。 处理程序优先级为:页面、布局、组件。

如果要引用在特定 组件 中定义的处理程序,请在处理程序引用中使用该组件的名称或别名:

{{ form_open({ request: 'myComponent::onHandleForm' }) }}

# 404 页面

如果主题包含一个 URL 为 /404 的页面,当系统找不到请求的页面时会显示它。

# 错误页面

默认情况下,任何错误都会显示一个详细的错误页面,其中包含文件内容、行号和发生错误的堆栈跟踪。 您可以通过在 config/app.php 脚本中将配置值 debug 设置为 false 并使用 URL /error 创建一个页面来显示自定义错误页面。

# 页面变量

可以在PHP代码部分组件中通过引用$this->page

function onEnd()
{
    $this->page->meta_title = '不同的页面标题';
}

也可以使用 this.page 变量 在标记中访问它们。 例如,要返回页面的标题:

<p>这个页面的标题是: {{ this.page.meta_title }}</p>

更多信息可以在 标记指南中的this.page 中找到。

# 以编程方式注入页面资产

如果需要,您可以使用控制器的 addCssaddJs 方法将资产(CSS 和 JavaScript 文件)注入页面。 它可以在页面的 PHP 部分布局 模板中定义的 onStart 函数中完成。 例子:

function onStart()
{
    $this->addCss('assets/css/hello.css');
    $this->addJs('assets/js/app.js');
}

如果 addCssaddJs 方法参数中指定的路径以斜杠 (/) 开头,则它将相对于网站根目录。 如果资产路径不以斜杠开头,则它是相对于主题的。

注入的资产可以通过将它们作为数组传递来组合:

function onStart()
{
    $this->addCss(['assets/css/hello.css', 'assets/css/goodbye.css']);
    $this->addJs(['assets/js/app.js', 'assets/js/nav.js']);
}

可以使用组合器注入和编译 LESS 和 SCSS 资产:

function onStart()
{
    $this->addCss(['assets/less/base.less']);
}

addCssaddJs 的第二个参数允许你为注入的资产提供额外的属性:

function onStart()
{
    $this->addJs(['assets/js/app.js', 'assets/js/nav.js'], ['defer' => true]);
}

为了在页面或 布局 上输出注入的资源,请使用 {% styles %}{% scripts %}标签。 例子:

<head>
    ...
    {% styles %}
</head>
<body>
    ...
    {% scripts %}
</body>