内容管理系统页面
Introduction
所有网站都有页面。在 Winter 中,前端页面由页面模板呈现。页面模板文件位于/pages 主题目录的子目录。页面文件名不影响路由,但最好根据页面的功能命名页面。这些文件应该有htm 扩大。这Configuration 和Twig 页面需要模板部分,但是PHP 部分 是可选的。下面,您可以看到最简单的主页示例:
url = "/"
==
<h1>Hello, world!</h1>
页面配置
页面配置定义在配置部分 页面模板文件。页面配置定义页面参数,路由和呈现页面及其Components,这在另一篇文章中进行了解释。页面支持以下配置参数:
Parameter | Description |
---|---|
url |
页面 URL,必填。 URL 语法如下所述。 |
title |
页面标题,必填。 |
layout |
这一页layout, 选修的。如果指定,应包含布局文件的名称,不带扩展名,例如:default . |
description |
后端接口的页面描述,可选。 |
hidden |
隐藏页面只能由登录的后端用户访问,可选。 |
网址语法
页面 URL 定义为url 配置参数。 URL 应以正斜杠字符开头,并且可以包含参数。没有参数的 URL 是固定且严格的。在以下示例中,页面 URL 是/blog
.
url = "/blog"
NOTE: 默认情况下,页面 URL 不区分大小写。
带参数的 URL 更灵活。将针对任何地址显示具有以下示例中定义的 URL 模式的页面,例如/blog/post/something
. URL 参数可以通过 Winter 组件或从页面访问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 中。默认值不能包含任何星号、竖线符号或问号。默认值在之后指定问号.在下一个示例中,category_id
参数将是10
对于网址/blog/category
.
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?*"
例如,像这样的 URL/color/:color/make/:make*/edit
将匹配/color/brown/make/volkswagen/beetle/retro/edit
并提取以下参数值:
NOTE: 子目录不影响页面 URL - URL 仅使用url 范围。
动态页面
在 - 的里面树枝节 一个页面模板,你可以使用任何Winter 提供的函数、过滤器和标签.任何动态页面都需要variables.在Winter,变量可能由页面准备,布局PHP 部分, 或者通过Components.在本文中,我们将描述如何在 PHP 部分准备变量。
页面执行生命周期
可以在页面和布局的 PHP 部分中定义一些特殊函数:onInit
,onStart
, 和onEnd
.这onInit
函数在所有组件初始化后和处理 AJAX 请求之前执行。这onStart
函数在页面执行开始时执行。这onEnd
函数在页面呈现之前和页面呈现之后执行components 被执行。在里面onStart
和onEnd
函数,你可以将变量注入到 Twig 环境中。使用array notation
将变量传递给页面:
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>
Winter 提供的默认变量和 Twig 扩展在标记指南.处理程序执行的顺序由动态布局 文章。
发送自定义回复
执行生命周期中定义的所有方法都能够停止进程并返回响应 - 只需从生命周期函数返回响应即可。下面的示例不会加载任何页面内容,而是返回字符串你好世界! 到浏览器:
function onStart()
{
return 'Hello world!';
}
一个更有用的例子可能是使用Redirect
正面:
public function onStart()
{
return Redirect::to('http://google.com');
}
处理表格
您可以使用页面或布局中定义的处理程序方法处理标准表单PHP 部分 (处理 AJAX 请求在AJAX 架构 文章)。使用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>
这onHandleForm
功能可以在页面或布局中定义PHP 部分,像这样:
function onHandleForm()
{
$this['lastValue'] = post('value');
}
处理程序用post
函数并初始化页面的lastValue
在第一个示例中显示在表单下方的属性变量。
NOTE: 如果在页面布局、页面和页面中定义了同名的处理程序component, Winter 将执行页面处理程序。如果在组件和布局中定义了处理程序,则将执行布局处理程序。处理程序优先级为:页面、布局、组件。
如果你想引用一个定义在特定的处理程序component,在处理程序引用中使用组件的名称或别名:
{{ form_open({ request: 'myComponent::onHandleForm' }) }}
404页面
如果主题包含带有 URL 的页面/404
,当系统找不到请求的页面时显示。
错误页面
默认情况下,任何错误都将显示一个详细的错误页面,其中包含文件内容、行号和发生错误的堆栈跟踪。您可以通过设置配置值来显示自定义错误页面debug
到false 在里面config/app.php
脚本,并使用 URL 创建页面/error
.
页面变量
页面的属性可以在PHP代码部分, 或者Components 通过引用$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
在标记指南中.
以编程方式注入页面资产
如果需要,您可以将资产(CSS 和 JavaScript 文件)注入到带有控制器的页面中addCss
和addJs
方法。它可以在onStart
中定义的函数PHP 部分 一页或layout 模板。例子:
function onStart()
{
$this->addCss('assets/css/hello.css');
$this->addJs('assets/js/app.js');
}
见资产编译器 文档以获取更多信息。