OctoberCms-Pages

介绍
所有网站都有页面。 在OctoberCms,页面用页面模板表示。 页面模板文件位于主题目录的/ pages子目录中。 页面文件名不会影响路由,但是最好根据页面的功能来命名页面。 文件应具有htm扩展名。 页面需要Configuration和Twig模板部分,而PHP部分是可选的。 在下面,您可以看到最简单的主页示例:

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

Page配置
页面配置在页面模板文件的“配置”部分中定义。 页面配置定义页面参数,这是路由和呈现页面及其组件所必需的,这将在另一篇文章中进行介绍。 页面支持以下配置参数:
参数说明

url 页面URL,必填。 URL语法如下所述。
title 标题,必填。
layout 可选。 如果指定,则应包含布局文件的名称,不带扩展名,例如:default。
description 后端接口的页面描述,可选。

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

url = "/blog"

带参数的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 / category的category_id参数将为10。

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

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

url = "/blog/:post_id|^[0-9]+$/comments" - 匹配 /blog/10/comments
...
url = "/blog/:post_id|^[0-9]+$" - 匹配  /blog/3
...
url = "/blog/:post_name?|^[a-z0-9\-]+$" - t匹配  /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提供的任何功能,过滤器和标签。 任何动态页面都需要变量。 在十月份,可以通过页面,布局PHP部分或组件来准备变量。 在本文中,我们将在PHP部分中介绍如何准备变量。

页面执行生命周期
在页面和布局的PHP部分中可以定义一些特殊功能:onInit,onStart和onEnd。 在初始化所有组件时以及在处理AJAX请求之前,将执行onInit函数。 onStart函数是在页面执行开始时执行的。 onEnd函数在呈现页面之前和执行页面组件之后执行。 在onStart和onEnd函数中,可以将变量注入到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>Latest posts</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 Framework文章中进行了说明)。 使用form_open()函数定义引用事件处理程序的表单。 例:

{{ form_open({ request: 'onHandleForm' }) }}
    Please enter a string: <input type="text" name="value"/>
    <input type="submit" value="Submit me!"/>
{{ form_close() }}
<p>Last submitted value: {{ lastValue }}</p>

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

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

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

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

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

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

404 页面
如果主题包含带有URL / 404的页面,则在系统找不到请求的页面时显示该主题。

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

Page 变量
页面的属性可以在PHP代码部分或“组件”中访问,方法是引用$ this-> page。

function onEnd()
{
    $this->page->title = 'A different page title';
}

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

<p>The title of this page is: {{ this.page.title }}</p>

有关更多信息,请参见“标记”指南中的this.page

以动态方式加入页面资源文件
如果需要,您可以使用控制器的addCss和addJs方法将资源(CSS和JavaScript文件)注入页面。 可以在页面或布局模板的PHP部分中定义的onStart函数中完成此操作。 例:

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

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

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

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']);
}

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

<head>
    ...
    {% styles %}
</head>
<body>
    ...
    {% scripts %}
</body>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容