- Grav 插件
- Grav - 插件基础
- Grav - 插件教程
- Grav - 事件钩子
- Grav 管理面板
- Grav - 管理员介绍
- Grav - 管理员控制面板
- Grav - 配置系统
- Grav - 站点配置
- Grav - 管理面板页面
- Grav - 页面编辑器选项
- Grav - 页面编辑器高级选项
- Grav 高级功能
- Grav - 蓝图
- Grav - 性能和缓存
- Grav - 调试和日志
- Grav - 命令行界面 (CLI)
- Grav - GPM (Grav 包管理器)
- Grav - 开发
- Grav - 生命周期
- Grav - YAML 语法
- Grav - 表单
- Grav 托管
- Grav - 虚拟主机
- Grav 故障排除
- Grav - 服务器错误
- Grav - 权限
- Grav 有用资源
- Grav - 面试问题
- Grav 快速指南
- Grav - 有用资源
- Grav - 讨论
Grav 快速指南
Grav - 概述
Grav 是一个基于平面文件的內容管理系统。该系统不使用数据库来存储内容,而是使用文本 (.txt) 文件或 Markdown (.md) 文件来存储内容。平面文件指的是可读的文本文件,它以一种简单易用的方式处理内容,对于开发者来说非常方便。
Grav 由Rocket Theme 团队开发。它运行在 PHP 上,是一个类似于 Joomla、WordPress 或 Drupal 的开源 CMS。
为什么选择 Grav?
Grav 现在是最快的平面文件内容管理系统。使用 Grav 发布和管理内容更容易。它允许开发者通过将内容存储在文件中(例如文本或 Markdown 文件),而不是数据库中,来非常轻松地处理内容。
Grav 帮助您构建简单、易于管理和快速的网站。它的成本低于数据库驱动的 CMS,并且在您没有足够资源的情况下,对于文件处理的 I/O 非常有用。
Grav 的特点
它是一个快速、简单且强大的平面文件 Web 平台。
它用于构建网站,无需额外的工具或 HTML 知识。
它使用文本文件或 Markdown 文件来存储内容。
它不使用数据库,因此可以减少瓶颈的发生。
它使用基于 PHP 的 Twig 模板,直接解析成 PHP,使其速度很快。
优点
它不是基于数据库的 CMS,因此非常易于安装,将文件上传到服务器后即可使用。
它使用 Markdown 文本文件,使操作更加简便。使用它,内容会动态转换为 HTML 并显示在浏览器中。
在安全性方面,Grav 没有管理区域和数据库。因此,没有机会入侵帐户或数据库来访问重要数据。
您可以轻松备份所有文件以保留网站的备份副本,因为没有数据库需要备份。
这是一个易于学习的软件。
缺点
您可能会遇到未经授权的用户可以直接访问您的文件内容的情况,因为没有数据库来保护文件。
使用 Grav CMS 构建复杂的网站比较困难。
Grav - 安装
在本章中,我们将了解 Grav 的安装。我们将讨论 Grav 的软件要求以及如何下载它。
Grav 的软件要求
现在让我们了解 Grav 的软件要求。
Web 服务器
- WAMP (Windows)
- LAMP (Linux)
- XAMP (跨平台)
- MAMP (Macintosh)
- Nginx
- Microsoft IIS
操作系统 - 跨平台
浏览器支持 - IE (Internet Explorer 8+), Firefox, Google Chrome, Safari, Opera
PHP 兼容性 - PHP 5.4 或更高版本
文本编辑器
- Sublime Text (Mac / Windows / Linux)
- Atom (Mac / Windows)
- Notepad++ (Windows)
- Bluefish (Mac / Windows / Linux)
下载 Grav
点击此链接 https://getgrav.org/downloads 并按照以下屏幕截图所示步骤下载 Grav。
将下载的 Grav 文件解压缩到您的 Web 服务器。
安装向导
Grav 的安装过程非常简单。请按照以下步骤进行 Grav 设置。
下载 zip 文件并将其解压缩到您的 Web 服务器或本地主机。将文件夹重命名为您要用来引用您的站点的名称。
打开浏览器并导航到localhost/<你的文件夹名称>,您将被重定向到一个显示您已成功安装 Grav 的屏幕,如下面的屏幕截图所示。
Grav 带有一个示例页面,可以帮助您入门。在上面的屏幕截图中,您可以看到主页链接显示了一个示例页面。
Grav - 页面
在本章中,让我们学习Grav 页面。页面可以定义为站点的构建块。页面结合了内容和导航;这使得即使对于没有经验的用户来说也能轻松完成工作。
首先,让我们了解如何创建一个简单的页面。所有用户内容都将存储在user/pages/文件夹下。只有一个名为01.home的文件夹。文件夹的数字部分是可选的;它表示页面的顺序(例如,01 在 02 之前),并明确告知 Grav 此页面应该在菜单中可见。
现在让我们看看如何创建一个新页面。
步骤 1 - 在/user/pages/下创建一个文件夹;例如,02.about,如下面的屏幕截图所示。
步骤 2 - 在新创建的02.about文件夹中创建一个名为default.md的文件,内容如下。
--- title: About Us --- # About Us Page! This is the body of **about us page**.
上面的代码使用了一些Markdown语法,下面简要解释一下。您可以在Markdown章节中详细学习Markdown。
--- 指示符之间的内容是页面标题。
# 或哈希语法在Markdown中表示标题,它将转换为 HTML 中的<h1>标题。
**标记表示粗体文本或 HTML 中的<b>。
步骤 3 - 重新加载浏览器,您可以在菜单中看到新页面,如下面的屏幕截图所示。
页面类型
Grav 页面支持 3 种类型的页面:
- 标准页面。
- 列表页面。
- 模块化页面。
标准页面
标准页面是最基本的页面类型,例如博客文章、联系表单、错误页面等。默认情况下,页面被视为标准页面。下载并安装 Grav 基本包后,您将看到一个标准页面。安装 Grav 基本包后,您将看到以下页面。
列表页面
列表页面是标准页面的扩展,它引用了一组页面。设置列表页面的最简单方法是在列表页面下创建子页面。博客列表页面就是一个很好的例子。
可以在Grav 下载中找到带有列表页面的示例博客框架。示例如下面的屏幕截图所示。
模块化页面
模块化页面是一种列表页面的形式,它从其子页面构建单个页面。这允许我们从较小的模块化内容页面构建非常复杂的单页布局。这可以通过从页面主文件夹中找到的多个模块化文件夹构建模块化页面来实现。
可以在Grav 下载中找到使用模块化页面的示例单页框架。示例如下面的屏幕截图所示。
文件夹
/user/pages文件夹将包含其相应页面的内容。/user/pages文件夹内的文件夹会被 Grav 自动视为菜单,并用于排序。例如,01.home文件夹将被视为主页。排序也需要保持,即 01.home 将在 02.about 之前。
您应该提供一个入口点,以便在您将浏览器指向站点根目录时指定浏览器跳转的位置。例如,如果您在浏览器中输入 http://mysite.com,Grav 默认情况下会期望一个别名home/,但是您可以通过更改 Grav 配置文件中的home.alias选项来覆盖主页位置。
文件夹名前的下划线 ( _ ) 被识别为模块化文件夹,这是一种特殊类型的文件夹,仅用于模块化内容。例如,对于pages/02.about之类的文件夹,slug 将默认为about,URL 将为 http://mysite.com/about。
如果文件夹名称没有数字前缀,则该页面被视为不可见,并且不会显示在导航中。例如,如果user/pages/具有/contact文件夹,则不会显示在导航中。这可以通过在页面本身的标题部分将 visible 设置为 true 来覆盖,如下所示,使其在导航中可见。
--- title: contact visible: true ---
如果周围的文件夹具有数字前缀,则页面默认情况下在导航中可见。设置可见性的有效值为true或false。
排序
有很多方法可以控制文件夹的排序,其中一种重要的方法是设置页面配置设置的content.order.by。选项如下所示。
默认 − 文件系统可用于排序,例如,01.home 在 02.about 之前。
标题 − 可使用每个页面中定义的标题进行排序。
日期 − 排序可以基于每个页面中定义的日期。
文件夹 − 将删除任何包含数字前缀(例如 01.)的文件夹名称。
基本名称 − 排序基于字母顺序的文件夹,不考虑数字顺序。
修改时间 − 也可以使用页面的修改时间戳。
header.x − 任何页面标题字段都可以用于排序。
手动 − 可以使用 order_manual 变量进行排序。
随机 − 也可以随机排序。
手动排序是通过向content.order.custom配置设置提供选项列表来专门定义的。您可以设置pages.order.dir和pages.order.by选项来覆盖Grav系统配置文件中的默认行为。
页面文件
页面文件夹内的页面应创建为.md文件,即Markdown格式的文件;它是带有YAML前端内容的Markdown。default将是主模板的标准名称,您可以随意命名。下面显示了一个简单页面的示例:
--- title: Title of the page taxonomy: category: blog page --- # Title of the page Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque porttitor eu felis sed ornare. Sed a mauris venenatis, pulvinar velit vel, dictum enim. Phasellus ac rutrum velit. **Nunc lorem** purus, hendrerit sit amet augue aliquet, iaculis ultricies nisl. Suspendisse tincidunt euismod risus. Nunc a accumsan purus.
---标记之间的内容称为YAML前端内容,此YAML前端内容包含基本的YAML设置。在上面的示例中,我们将标题和分类设置为博客页面。---标记对之后的部分是我们网站上实际看到的内容。
摘要大小和分隔符
摘要的默认大小可以在site.yaml中设置,通过page.summary()使用。这对于只需要摘要信息而不需要完整页面内容的博客很有用。您还可以使用手动摘要分隔符,也称为摘要分隔符:===,并确保将其放在内容中,上下各留空行,如下所示。
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. === Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
分隔符上面的文本将在page.summary()引用时使用,而完整内容将在page.content()引用时使用。
查找其他页面
Grav具有名为find()方法的功能,可以查找另一个页面并在该页面上执行操作。
例如,如果您想在特定页面上列出所有公司位置,请使用以下Markdown规则:
# Locations <ul> {% for loc in page.find('/locations').children if loc != page %} <li><a href="{{loc.url}}">{{ loc.title }}</a></li> {% endfor %} </ul>
Grav - Markdown 语法
Markdown语法定义为以易于阅读和易于编写的格式编写纯文本,之后将其转换为HTML代码。Markdown语法中使用诸如(*)或(`)之类的符号。这些符号用于加粗、创建标题和组织内容。
要使用Markdown语法,必须在user/pages/02.mypage文件夹中创建一个.md文件。在您的\user\config\system.yaml配置文件中启用Markdown语法。
使用Markdown语法有很多好处,其中一些如下所示。
易于学习,字符最少。
使用Markdown时,出错的可能性非常小。
有效的XHTML输出。
您的内容和视觉显示保持分离,因此不会影响网站的外观。
您可以使用任何文本编辑器或Markdown应用程序。
在以下部分中,我们将讨论Markdown中使用的HTML主要元素。
标题
每个标题标签都使用#创建,即从h1到h6,#的数量会增加,如下所示。
#my new Heading ##my new Heading ###my new Heading ####my new Heading #####my new Heading ######my new Heading
在浏览器中以localhost/Grav/mypage打开.md文件;您将收到以下结果:
注释
您可以使用以下格式编写注释。
<!— This is my new comment -->
在浏览器中以localhost/Grav/mypage打开.md文件;您将收到以下结果:
水平线
水平线用于在段落之间创建主题断开。您可以使用以下任何方法在段落之间创建断开。
___ − 三个下划线
--- − 三个短横线
*** − 三个星号
在浏览器中以localhost/Grav/mypage打开md文件;您将收到以下结果:
正文
正文可以定义为以Markdown语法中的普通格式编写文本,不使用(p)标签
示例
It is a way of writing your plain text in an easy to read and write format, which later gets converted into HTML code.
在浏览器中以localhost/Grav/mypage打开.md文件;您将收到以下结果:
强调
强调是Markdown语法中的编写格式,用于加粗、斜体或删除文本的一部分。让我们在下面讨论它们:
加粗
可以使用两侧的两个(**)符号将文本的一部分加粗。
示例
The newest articles from **Advance Online Publication (AOP)** and the current issue.
在此示例中,我们必须将“Advance Online Publication (AOP)”字词加粗。
在浏览器中以localhost/Grav/mypage打开.md文件,您将收到以下结果:
斜体
在单词的两侧使用“_”(下划线)符号来使文本斜体。
示例
The newest articles from _Advance Online Publication_ (AOP) and the current issues.
在此示例中,我们必须将“Advance Online Publication” (AOP)字词斜体。
在浏览器中以localhost/Grav/mypage打开.md文件。这将为您提供以下结果:
删除线
在单词的两侧使用两个"~~"(波浪号)来删除单词。
示例
The newest articles from ~~Advance Online Publication~~ (AOP) and the current issues.
在此示例中,我们必须删除“Advance Online Publication” (AOP)字词。
在浏览器中以localhost/Grav/mypage打开.md文件。这将为您提供以下结果:
块引用
要创建块引用,必须在句子或单词之前添加>符号。
示例
>The newest articles from Advance Online Publication (AOP) and the current issues.
在此示例中,我们在句子之前使用了>符号。
在浏览器中以localhost/Grav/mypage打开.md文件;您将收到以下结果:
块引用也可以以下列方式使用:
>The newest articles from Advance Online Publication (AOP) and the current issues. >>> The newest articles from Advance Online Publication (AOP) and the current issues.
在浏览器中以localhost/Grav/mypage打开.md文件;您将收到以下结果:
通知
通知可用于告知或通知重要事项。
共有四种类型的通知:黄色、红色、蓝色和绿色。
黄色
在描述!Info或信息的黄色通知类型之前,必须使用>>>符号。
示例
>>>Neurotransmitter-gated ion channels of the Cys-loop receptor family are essential mediators of fast neurotransmission throughout the nervous system and are implicated in many neurological disorders.
红色
在红色警告通知之前使用四个>>>>符号。
示例
>>>>Neurotransmitter-gated ion channels of the Cys-loop receptor family are essential mediators of fast neurotransmission throughout the nervous system and are implicated in many neurological disorders.
蓝色
对于蓝色通知类型,使用五个>>>>>符号,这描述了一个注释。
示例
>>>>>Neurotransmitter-gated ion channels of the Cys-loop receptor family are essential mediators of fast neurotransmission throughout the nervous system and are implicated in many neurological disorders.
绿色
在绿色提示类型通知之前使用六个>>>>>>符号。
示例
>>>>>>Neurotransmitter-gated ion channels of the Cys-loop receptor family are essential mediators of fast neurotransmission throughout the nervous system and are implicated in many neurological disorders.
在浏览器中以localhost/Grav/mypage打开md文件;您将收到以下结果:
列表
在本节中,我们将了解Grav中无序列表和有序列表的工作原理。
无序列表
在无序列表中,使用项目符号。使用*, - , +符号作为项目符号。在任何文本之前使用带空格的符号,项目符号将显示。
示例
+ Bullet + Bullet + Bullet -Bullet -Bullet -Bullet *Bullet
在浏览器中以localhost/Grav/mypage打开.md文件;您将收到以下结果:
有序列表
列出内容之前添加数字。
示例
1. Coffee 2. Tea 3. Green Tea
在浏览器中以localhost/Grav/mypage打开.md文件。这将为您提供以下结果:
代码
在本节中,我们将了解Grav中内联代码和代码块“围栏”的工作原理。
内联代码
使用(`)创建内联代码,以便在Markdown中使用代码。
示例
In the given example, '<section></section>' must be converted into code.
在浏览器中以localhost/Grav/mypage打开.md文件,您将收到以下结果:
代码块“围栏”
如果您想阻止多行代码,请使用(```)围栏。
示例
``` You’re Text Here ```
在浏览器中以localhost/Grav/mypage打开.md文件;您将收到以下结果:
表格
在Grav中,表格是通过在标题部分下使用管道和短横线创建的。管道不得垂直对齐。
示例
| Number | Points | | ------ | ----------- | | 1 | Eve Jackson 94 | | 2 | John Doe 80 | | 3 | Adam Johnson 67 |
在浏览器中以localhost/Grav/mypage打开.md文件;您将收到以下结果:
右对齐文本
要将表格内容放在右侧,必须在标题下方的短横线右侧添加冒号。
| Number | Points | | ------:| -----------: | | 1 | Eve Jackson 94 | | 2 | John Doe 80 | | 3 | Adam Johnson 67 |
在浏览器中以localhost/Grav/mypage打开.md文件;您将收到以下结果:
链接
在本节中,我们将了解链接在Grav中的工作原理。
基本链接
链接是借助方括号([])和圆括号(())创建的。在[]括号中,必须编写内容;在()中编写域名。
示例
[Follow the Given link](http://www.google.com)
在浏览器中以localhost/Grav/mypage打开.md文件;您将收到以下结果:
添加标题
在本节中,我们将了解如何在.md文件中添加标题。
示例
[Google](https://www.gogle.com/google/ "Visit Google!")
在浏览器中以localhost/Grav/mypage打开.md文件;您将收到以下结果:
图像
图像类似于链接,但在语法的开头有一个感叹号。
示例
![Nature] (/Grav/images/Grav-images.jpg)
在浏览器中以localhost/Grav/mypage打开.md文件,您将收到以下结果:
Grav - 页面链接
在本章中,我们将了解如何在Grav中链接页面。您可以简单地将一个页面链接到另一个页面,甚至可以链接远程页面。Grav有很多响应式链接选项。如果您之前使用过HTML链接文件,那么很容易理解Grav中的页面链接。
下面是一个Grav站点Pages目录的基本示例。我们将使用以下目录作为示例,如图所示。
下面是Grav链接的一些常见组件。
[Linked Content](../path/slug/page)
[] − 指定要写入链接的文本或替代内容。在HTML中,我们使用<a href="">和</a>来放置内容。
() − URL放置在这个括号中,直接放在方括号之后。
../ − 表示向上移动一个目录。
内容中使用了4种类型的链接,如下所示:
相对路径(Slug)
相对目录路径
绝对路径
远程路径
相对路径(Slug)
内部链接不限于文件/目录结构中的某些名称。Slug可以从标题和回退目录名称中提取,这之后可以帮助您轻松创建链接,因为无需记住任何特定的文件名,但可以记住相关的Slug。Grav的模板引擎使用文件名来知道要应用哪个模板。
[link](../dog)
上述代码为您获取以下结果:
在上面的示例中,您必须向上移动一个目录并加载位于pages/01.home/02.nature/item.md目录中的默认页面,该页面来自pages/01.home/02.dog/item.md。item.md文件没有分配Slug,因此Grav使用目录名称。
接下来,您会找到一个类似的示例,从pages/01.home/01.dog/item.md链接到pages/02.black/01.fish/item.md,但是当它加载item.md文件时,会为01.fish文件分配一个Slug。
[link](../../black/fish)
上述代码为您提供以下结果:
您现在将看到默认的Slug文件夹名称将被item.md标题中的black Slug替换。
相对目录路径
设置相对的目的地用于链接当前页面,该页面可以是图像文件或任何其他所需文件。文件的定位与目的地的定位一样重要。如果在更改路径时移动了文件,则链接可能会断开。只要文件保持一致,您就可以在具有不同域名的本地开发服务器和实时服务器之间轻松切换。链接应该没有任何问题地工作。
您将直接按名称指向文件链接,而不是其目录或Slug。您可以从pages/01.home/01.dog/item.md创建到pages/02.black/01.fish/item.md的链接,使用如下所示的命令。
[link](../../02.black/01.fish/item.md)
上述代码为您提供以下结果:
两个文件夹都向上移动,如../../所示,然后在底部两个文件夹中,直接指向item.md文件。
绝对链接
它类似于相对链接,基于Grav中的/user/pages/目录。此外,这可以通过两种方法完成。
相对路径(Slug)样式
相对目录路径样式
相对路径(Slug)样式
您可以像相对路径(Slug)类型一样操作。它在路径中使用目录名称。它消除了之后通过断开链接而导致的顺序和更改错误。它更改了开头导致链接断开的文件夹名称的数量。
下面是一个绝对链接的示例,该链接以/开头。它指定在Slug样式中为pages/01.home/01.dog/item.md创建了绝对链接。
[link](/home/nature)
上述代码为您提供以下结果:
相对目录路径样式与GitHub等服务一起使用时更一致。它们没有Grav灵活性的优势。下面您可以看到使用相对目录路径样式为pages/01.home/01.dog/item.md创建的绝对链接示例。
[link](/01.home/01.dog)
远程路径
远程链接允许您通过其URL直接链接到任何文件或文档。无需包含您自己网站的内容。
以下示例演示如何链接到TutorialsPoint页面。
[link](https://tutorialspoint.com)
上述代码为您提供以下结果:
您可以直接链接到任何URL,包括安全的HTTPS链接。
Grav - 图片链接
在本章中,我们将了解Grav中的图像链接。Grav允许您将图像从一个页面链接到另一个页面,甚至链接到远程页面。如果您使用HTML链接了文件,那么很容易理解Grav中的图像链接。
使用此结构,我们将看到如何使用不同类型的链接在页面中显示媒体文件。此结构下的每个文件夹都包含图像,并且/02.green/img01下有一个特殊目录,它充当页面,但仅包含媒体文件。
让我们了解一下 Grav 基于 Markdown 的图片标签的一些常用元素。
![Alt Text](../path/image.ext)
! − 当你把它放在 Markdown 链接标签的开头时,它表示一个图片标签。
[] − 它指定图片的可选 alt 文本。
() − 它紧跟在包含文件路径的方括号之后。
../ − 它表示向上移动一个目录。
Grav 使用以下五种类型的图片链接:
相对路径(Slug)
相对目录路径
绝对路径
远程路径
图片上的媒体操作
相对路径(Slug)
它将相对图片链接设置为当前页面,并在同一目录中链接另一个文件。使用相对链接时,源文件的位置与目标文件的位置一样重要。如果在移动文件时更改了文件路径,则链接可能会断开。使用这种图片链接结构的优点是,只要文件结构保持不变,你就可以在本地开发服务器和具有不同域名名的实时服务器之间切换。
示例
![link](../water/img01/img.jpg)
这里../ 表示你的链接向上移动一个文件夹,然后向下移动一个文件夹,img.jpg 是目标。
当你使用上述路径时,你将得到以下输出:
Grav 支持页面主 Markdown 文件标题中的 slug,此 slug 将代替给定页面的文件夹名称。
如果01.sky文件夹通过其.md文件设置了 slug,即/pages/01.blue/01.sky/text.md,则文件的标题将如下所示:
--- title: Sky slug: test-slug taxonomy: category: blog ---
在上面的代码中,我们设置了 slug test-slug,它是可选的。一旦你设置了 slug,你就可以链接到媒体文件,该文件将为链接设置相对 Slug 或绝对 URL。
相对目录路径
在这种类型的链接中,你可以将目录相对图片链接设置为当前页面。无需使用 URL slug,你可以通过目录相对图片链接中的完整路径及其文件夹名称进行引用。
示例
![My image](../../blue/img01/img.jpg)
当你使用上述路径时,它将显示如下所示的输出:
绝对路径
绝对链接与相对链接相同,唯一的区别在于它们相对于站点根目录,并且位于/user/pages/目录中。
你可以通过两种不同的方式使用绝对链接:
你可以使用包含 slug 或目录名称的相对 Slug 样式,这在绝对链接中常用。
你可以使用绝对链接,它将使用a/打开链接。
![My image](/blue/img01/img.jpg)
当你使用上述路径时,你将得到以下输出:
远程路径
远程图片链接允许直接通过其 URL 显示任何媒体文件。这些链接不包含你自己的网站内容。以下示例显示了如何使用远程 URL 显示图片:
![Remote Image 1](http://www.freedomwallpaper.com/nature-wallpaper/spring_nature-wide.jpg)
当你点击下图所示的链接时,它将显示来自给定 URL 的图片。
图片上的媒体操作
与页面关联的图片使我们能够利用Grav 的媒体操作的优势。在 Grav 中创建内容时,你可以显示一些媒体文件,例如图片、视频和其他文件。
示例
你可以使用以下格式加载图片:
![Styling Example](../img01/img.jpg?cropResize = 400, 200)
当你使用上述路径时,你将收到如下所示的输出:
Grav - 媒体
媒体文件包含不同类型的显示内容,例如图片、视频和许多其他文件。Grav 自动查找和处理这些文件,以便任何页面都可以使用。通过使用页面的内置功能,你可以访问元数据并动态修改媒体。
Grav 使用智能缓存,在必要时创建缓存生成的媒体。这样,所有人都可以使用缓存版本,而不是反复生成媒体。
支持的媒体文件
以下是 Grav 支持的媒体文件类型:
图片 − jpg、jpeg、png
动画图片 − gif
矢量化图片 − svg
视频 − mp4、mov、m4v、swf
数据/信息 − txt、doc、pdf、html、zip、gz
显示模式
以下是 Grav 中几种类型的显示模式:
源 − 图片、视频或文件的可视化显示。
文本 − 媒体文件的文本呈现。
缩略图 − 媒体文件的缩略图。
查找缩略图
你可以使用三个位置查找缩略图:
与你的媒体文件所在的文件夹相同 − [media-name].[media-extension].thumb.[thumb-extension]; 这里,media-name 和 media-extension 是实际媒体文件的名称和扩展名,thumb-extension 是图片媒体类型支持的扩展名。
用户文件夹 − user/images/media/thumb-[media-extension].png; 这里,media-extension 是实际媒体文件的扩展名。
系统文件夹 − system/images/media/thumb-[media-extension].png; 这里,media-extension 是实际媒体文件的扩展名。
图库和链接
Grav 输出一个锚标记,其中包含图库插件读取的一些元素。如果你想使用图库库(未包含在你的插件中),则可以使用以下属性创建你自己的插件。
rel − 指示图库链接。值为 lightbox。
href − 媒体对象的 URL。
data-width − 设置用户选择的图库宽度。
data-height − 设置用户选择的图库高度。
data-srcset − srcset 字符串用于图片媒体。
操作
Grav 中的构建器模式用于处理媒体,以执行多个操作。某些操作适用于所有媒体,而某些操作仅适用于特定媒体。
常规
有 6 种类型的常规操作可用于媒体类型。下面解释每个操作。
序号 | 操作和描述 |
---|---|
1 | url()
url() 返回媒体的原始 url 路径。 |
2 | html([title][, alt][, classes]
输出将包含媒体的有效 html 标签。 |
3 | display(mode) 它用于在不同的显示模式之间切换。当你切换到显示模式时,所有操作都将重置。 |
4 | link()
链接之前应用的操作将应用于链接的目标。 |
5 | lightbox([width, height])
图库类似于链接操作,但有一点区别在于它创建的链接有一些额外的属性。 |
6 | 缩略图
为任何类型的媒体文件选择页面和默认值之间,这可以手动完成。 |
图片操作
下表列出了一些应用于图片的操作。
序号 | 操作和描述 |
---|---|
1 | resize(width, height, [background])
通过调整大小更改图片的宽度和高度。 |
2 | forceResize(width, height)
根据需要拉伸图片,而不管原始比例如何。 |
3 | cropResize(width, height)
根据其宽度和高度将图片调整为更小或更大的尺寸。 |
4 | crop(x, y, width, height)
根据 x 和 y 位置的宽度和高度裁剪图片。 |
5 | cropZoom(width, height)
根据请求缩放和裁剪图片。 |
6 | quality(value)
设置图片质量的值,范围为 0 到 100。 |
7 | negate()
颜色在反转中反转。 |
8 | brightness(value)
使用-255到+255的值,将亮度滤镜添加到图片。 |
9 | contrast(value)
使用 -100 到 +100 的值将对比度滤镜应用于图片。 |
10 | grayscale()
使用灰度滤镜处理图片。 |
11 | emboss()
浮雕滤镜也用于处理图片。 |
12 | smooth(value)
通过设置 -10 到 +10 的值将平滑滤镜应用于图片。 |
13 | sharp()
将锐化滤镜添加到图片。 |
14 | edge()
将边缘查找滤镜添加到图片。 |
15 | colorize(red, green, blue)
通过调整红色、绿色和蓝色来为图片着色。 |
16 | sepia()
添加棕褐色滤镜以营造复古外观。 |
动画和矢量化图片和视频
对图片和视频进行动画和矢量化操作。以下是对图片和视频进行的操作。
序号 | 操作和描述 |
---|---|
1 | resize(width, height)
resize 操作将设置width、height、data-width和data-height属性。 |
组合
Grav 具有图片处理功能,使处理图片变得容易。
![My New Image](/images/maxresdefault.jpg?negate&cropZoom = 500, 500&lightbox & cropZoom = 600, 200&contrast = -100&sharp&sepia)
上面的代码将生成如下所示的输出:
响应式图片
下表列出了一些类型的响应式图片。
元文件
image1.jpg、archive.zip或任何其他引用都能够设置变量或被元文件覆盖。然后,这些文件采用<filename>.meta.yaml的格式。例如,如果你有一个名为image2.jpg的图片,那么你的元文件可以创建为image2.jpg.meta.yaml。内容必须使用 yaml 语法。你可以使用此方法添加任何你喜欢的文件或元数据。
Grav - 模块化页面
模块化页面起初难以理解,但一旦你了解了它,使用起来就会非常容易。它能够从其子页面创建一个单页。它能够从模块化内容页面构建复杂的单页布局。
模块化页面设置为不可路由的,因为无法通过 URL 直接访问它们。它们通过文件夹名称之前的 _(下划线)来标识。它是按顺序显示在上面的页面的集合,以获得单个页面。例如,user/pages/home/_header.。
文件夹结构
对于单页框架,你可以在01.home文件夹中找到此页面。在这里,你得到一个单一的模块化.md文件,该文件说明必须包含哪些页面以及要显示页面的顺序。modular.html.twig 可以在你的当前主题文件夹中找到。
在下图中,你可以看到为模块化页面创建的文件夹结构。
每个子文件夹都必须包含一个描述 Markdown 文件的.md文件。
首先,你必须在/users/pages/01.home文件夹中创建子文件夹。接下来,每个文件夹都必须包含一个.md文件和一个modular.md文件。
创建子文件夹时,图片和文件都必须位于同一文件夹中。
如何创建模块化页面
要创建模块化页面,你必须按照以下步骤操作。
步骤 1 − 在/user/pages/01.home/文件夹中创建一些页面。在下图中,你可以看到我们创建了两个文件夹以及一个 modular.md 文件。
步骤 2 − 要创建模块化页面,你必须在每个文件夹中创建一个文件,并将其命名为text.md。
步骤 3 − 接下来,在text.md文件中添加你的代码,保存并运行它。
示例
将所有四个页面保存为.md文件。这里我们创建了 4 个页面,并命名为 text.md、text1.md、text2.md 和 text3.md。
--- title: Bio-diversity --- ## Bio-diversity Biodiversity refers to the variety of life. It is seen in the number of species in an [ecosystem](https://simple.wikipedia.org/wiki/Ecosystem) or on the entire [Earth] (https://simple.wikipedia.org/wiki/Earth). Biodiversity gets used as a measure of the health of biological systems, and to see if there is a danger that too many species become[extinct](https://simple.wikipedia.org/wiki/Extinct).
现在,创建 4 个页面,将它们添加到\templates\modular文件夹中,如下所示。
接下来,转到主页并刷新,你可以看到更改。
在新导航栏中,你可以看到四个文件链接。
Grav - 多语言
多语言定义为在你的网站中使用不同的语言。我们将学习不同的步骤,这些步骤将帮助你在你的 Grav 站点中使用多语言。
多语言基础知识
基本上,Grav 需要一个 `.md` 文件来表示任何页面。启用多语言支持后,它将查找类似于 `default.en.md` 或 `default.fr.md` 的文件。
语言配置
首先,必须在你的 `user/config/system.yaml` 文件中设置一些基本的语言配置。
Language: Supported: - en - Fr
通过这样做,你就在 Grav 中启用了多语言支持。在上面的代码中,`en` 表示英语,`fr` 表示法语。这意味着你的网站将支持这两种语言。这里默认语言是 `en (英语)`。如果首先写 `fr (法语)`,那么它就成为你的默认语言。
多语言页面
如果你的默认语言设置为`英语`,Grav 将查找 `default.en.md` 文件。如果找不到该文件,Grav 将查找你设置的另一种语言。如果两种语言都找不到,则查找 `default.md` 文件。
示例
default.en.md 文件
--- title: Home --- # Grav is Running! ## You have installed **Grav** successfully
上面的代码将生成以下输出:
对于法语作为默认语言,`default.fr.md` 文件将是:
--- titre: Accueil --- # Grav est en marche! ## Vous avez installé ** ** Grav succès
上面的代码将生成以下输出:
通过 URL 激活语言
如果要使用语言代码更新网站的 URL,请按照以下步骤操作:
示例
如果希望你的网站显示英文,请在浏览器中输入以下内容:
http://www.mysite.com/en
如果希望你的网站显示法文,请在浏览器中输入以下内容:
http://www.mysite.com/fr
通过浏览器激活语言
Grav 能够获取 `http_accept_language` 值并将其与当前支持的语言进行比较。如果希望此功能生效,请在语言部分启用 `user/system.yaml` 文件,如下所示:
language : http_accept_language : true
基于语言的主页
要拥有基于语言的主页,必须在你的 `site.yaml` 文件中启用以下代码:
home: aliases: en: /homepage fr: /page-d-accueil
通过这种方式,Grav 将从活动语言中找出要使用的语言。
以下代码将强制 Grav 将你重定向到默认语言路由。`include_route` 选项强制在你的 URL 中添加语言代码,例如 `http://www.mysite.com/en/home`
languages: home_redirect: include_lang: true include_route: false
基于语言的 Twig 模板
如果你的文件是 `default.en.md`,Grav 将查找 `default.html.twig` 模板文件。当你需要特定语言的 Twig 文件时,必须将其上传到语言文件夹的根级别。如果当前主题在 `templates/default.html.twig` 中,则必须创建一个 `templates/en/` 文件夹,并将你的特定于英语的文件夹放在其中,如下所示:`templates/en/default.html.twig`
语言切换器
语言切换器插件可在 Grav 包管理器 (GPM) 获取。
通过 Twig 进行翻译
使用 Twig 过滤器和 `t()` 函数。这两个函数的功能类似。如果你有另一个 Twig 文件,它允许你从数组中进行翻译。
插件和主题语言翻译
通过在主题或插件的根目录中创建一个 `languages.yaml` 文件(例如 `/user/plugins/error/languages.yaml`)来提供插件和主题中的翻译,并且必须包含所有支持的语言。
翻译覆盖
如果要覆盖翻译,则必须将键值对放在 `user/languages/` 文件夹中的语言文件中。
高级
基于环境的语言处理
可以根据 URL 将用户路由到网站的正确版本。如果你的网站 URL 是 `http://english.yoursite.com`,这是你的标准 `http://www.yoursite.com` 的别名,那么你可以创建名为 `/user/english.yoursite.com/config/system.yaml` 的配置。
languages: supported: - fr - en
它使用反向语言顺序。在上面的代码中,`fr` 是默认语言。如果通过将 `en` 放在顶部,`fr` 放在底部来更改顺序,则 `en` 成为默认语言。
语言别名路由
在同一页面的不同语言版本之间切换非常困难,你可以在页面对象上使用 `Page.rawRoute()` 方法。它获取单个页面的不同语言翻译的相同原始路由。将语言代码放在前面以获取正确的路由。
如果你使用法语页面,自定义路由为:
/ma-page-francaise-personnalisee
英文页面具有以下自定义路由:
/my-custom-french-page
你获得法语页面的原始页面,可能是:
/blog/custom/my-page
然后只需添加你想要的语言,这将成为你的新 URL。
/en/blog/custom/my-page
翻译支持
Grav 提供了一个简单的机制,用于通过 PHP 在 Twig 中提供翻译,以便在主题和插件中使用。它默认启用,如果未定义特定语言,则使用 `en` 语言。要启用或禁用,请转到 system.yaml 文件并进行更改。
languages: translations: true
你可以通过多种方式和不同的位置提供翻译。第一个位置是 system/languages 文件夹。必须创建 `en.yaml`、`fr.yaml` 等格式的文件。每个 yaml 文件必须包含键值对的数组或嵌套数组。
SITE_NAME: My Blog Site HEADER: MAIN_TEXT: Welcome to my new blog site SUB_TEXT: Check back daily for the latest news
基于会话的活动语言
你可以激活基于会话的活动语言存储。要启用它,必须在 system.yaml 中设置 `session: enables: true` 并启用语言设置。
languages: session_store_active: true
语言切换器
从 GPM 安装语言切换插件。
使用特定语言的域进行设置
进行基于环境的语言处理配置以分配默认语言。将此选项添加到你的 system.yaml;它必须设置为 true。
pages.redirect_default_route: true
将以下内容添加到你的 `.htaccess` 文件中,并根据你的要求选择语言片段和域名。
# http://www.cheat-sheets.org/saved-copy/mod_rewrite_cheat_sheet.pdf # http://www.workingwith.me.uk/articles/scripting/mod_rewrite # handle top level e.g. http://Grav-site.com/de RewriteRule ^en/?$ "http://Grav-site.com" [R = 301, L] RewriteRule ^de/?$ "http://Grav-site.de" [R = 301, L] # handle sub pages, exclude admin path RewriteCond %{REQUEST_URI} !(admin) [NC] RewriteRule ^en/(.*)$ "http://Grav-site.com/$1" [R = 301, L] RewriteCond %{REQUEST_URI} !(admin) [NC] RewriteRule ^de/(.*)$ "http://Grav-site.de/$1" [R = 301, L]
Grav - 主题基础
主题控制 Grav 站点的外观。Grav 中的主题是使用强大的 Twig 模板引擎 构建的。
内容页面和 Twig 模板
你创建的页面通过名称或为页面设置模板标题变量来引用特定模板文件。建议使用页面名称,以便更轻松地维护。
安装 Grav 基础包后,你将在 `user/pages/01.home` 文件夹中找到 `defauld.md` 文件。文件名(即 `default`)告诉 Grav 此页面应使用位于 `themes/
例如,如果你有一个名为 `contact.md` 的文件,它将使用 Twig 模板 `themes/
主题组织
在以下部分,我们将讨论主题组织,即它的定义、配置等等。
定义和配置
有关主题的信息将在 `user/themes/antimatter/blueprints.yaml` 文件中定义,并且可选地提供要在管理面板中使用的表单定义。你将在 `user/themes/antimatter/blueprints.yaml` 文件中看到以下内容,用于`Antimatter` 主题。
name: Antimatter version: 1.6.0 description: "Antimatter is the default theme included with **Grav**" icon: empire author: name: Team Grav email: [email protected] url: http://getgrav.org homepage: https://github.com/getgrav/grav-theme-antimatter demo: http://demo.getgrav.org/blog-skeleton keywords: antimatter, theme, core, modern, fast, responsive, html5, css3 bugs: https://github.com/getgrav/grav-theme-antimatter/issues license: MIT form: validation: loose fields: dropdown.enabled: type: toggle label: Dropdown in navbar highlight: 1 default: 1 options: 1: Enabled 0: Disabled validate: type: bool
为了使用主题配置选项,你需要在一个名为 `user/themes/
示例
enable: true
主题和插件事件
主题通过插件架构与 Grav 交互的能力是 Grav 的另一个强大功能。为此,只需创建 `user/themes/
<?php namespace Grav\Theme; use Grav\Common\Theme; class MyTheme extends Theme { public static function getSubscribedEvents() { return [ 'onThemeInitialized' => ['onThemeInitialized', 0] ]; } public function onThemeInitialized() { if ($this->isAdmin()) { $this->active = false; return; } $this->enable([ 'onTwigSiteVariables' => ['onTwigSiteVariables', 0] ]); } public function onTwigSiteVariables() { $this->grav['assets'] ->addCss('plugin://css/mytheme-core.css') ->addCss('plugin://css/mytheme-custom.css'); $this->grav['assets'] ->add('jquery', 101) ->addJs('theme://js/jquery.myscript.min.js'); } }
模板
Grav 主题的结构没有设定规则,只是必须为每种页面类型的内容在 `templates/` 文件夹中关联 Twig 模板。
由于页面内容和 Twig 模板之间存在这种紧密耦合,因此最好根据 下载页面 中提供的 Skeleton 包创建通用主题。
假设你想在你的主题中支持模块化模板,你必须创建 `modular/` 文件夹并将 Twig 模板文件存储在其中。如果要支持表单,则应创建 `form/` 文件夹并将表单模板存储在其中。
蓝图
要为每个模板文件的选项和配置定义表单,可以使用 `blueprints/` 文件夹。这些将无法通过 `管理员面板` 进行编辑,并且是可选使用的。即使没有 `blueprints` 文件夹,主题也能完全正常运行。
SCSS/LESS/CSS
如果要使用 SASS 或 LESS 开发网站,则必须在 `user/themes/
对于从 SASS 或 LESS 编译生成的自动生成文件,将使用 `css-compiled/` 文件夹。在 Antimatter 主题中,使用 SASS 的 `scss` 变体。
请按照以下步骤在你的机器上安装 SASS。
在主题的根目录下,键入以下命令以执行 scss shell 脚本。
$ ./scss.sh
- 键入以下命令直接运行它。
$ scss --sourcemap --watch scss:css-compiled
`css-compiled/` 将包含所有编译的 scss 文件,并且 css 文件将生成在你的主题中。
其他文件夹
建议在你的 `user/themes/
主题示例
到目前为止我们讨论的 `Antimatter` 主题的整体文件夹结构如下所示。
Grav - 主题教程
在本章中,让我们创建一个 Grav 主题来理解这个概念。
Antimatter
安装 Grav 基础包时,将安装默认的 `Antimatter` 主题,该主题使用 `Nucleus`(一组简单的基本 CSS 样式)。Nucleus 是一个轻量级的 CSS 框架,包含基本的 CSS 样式和 HTML 标记,它提供了独特的外观和感觉。
Bootstrap
让我们创建一个使用流行的 Bootstrap 框架 的主题。Bootstrap 是一个开源且最流行的 HTML、CSS 和 JS 框架,它使前端 Web 开发更快更容易。
以下步骤描述了主题的创建:
步骤 1:基本主题设置
正如我们在 主题基础知识 一章中学习的那样,Grav 主题有一些关键元素,为了创建新主题,必须遵循这些元素。
安装 Grav 基础包后,在 `user/themes` 文件夹下创建一个名为 bootstrap 的文件夹,如下所示。
在 `user/themes/bootstrap` 文件夹内,创建 `css/`、`fonts/`、`images/`、`js/` 和 `templates/`,如下所示。
在你的 `user/themes/bootstrap` 文件夹中创建一个名为 `bootstrap.php` 的主题文件,并将以下内容粘贴到其中。
<?php namespace Grav\Theme; use Grav\Common\Theme; class Bootstrap extends Theme {}
现在,在 `themes/bootstrap` 文件夹中创建一个主题配置文件 `bootstrap.yaml`,并在其中写入以下内容。
enable: true
我们将跳过 `blueprints` 文件夹,因为我们没有配置选项,并将在此章中使用常规 CSS。
步骤 2:添加 Bootstrap
为了创建一个 Bootstrap 主题,你必须在你的主题中包含 Bootstrap。因此,你需要通过单击此 链接 下载最新的 Bootstrap 包,如下所示。
解压缩包,你将看到三个文件夹,即 css、fonts 和 js。现在,将这三个文件夹的内容复制到前面创建的 `user/themes/bootstrap` 中名称相似的文件夹中。
步骤 3:基本模板
正如我们在上一章中学习的那样,内容存储在 `default.md` 文件中,该文件指示 Grav 查找名为 `default.html.twig` 的渲染模板。此文件包含显示页面所需的一切。
有一个更好的解决方案,它利用 Twig 的 Extends 标签,允许你使用 blocks 定义基本布局。这将允许 Twig 模板扩展基本模板并为基本模板中定义的块提供定义。
请按照以下步骤创建一个简单的 Bootstrap 基本模板:
在 `user/themes/bootstrap/templates` 文件夹中创建一个名为 `partials` 的文件夹。这用于存储我们的基本模板。
在 `partials` 文件夹中,创建一个包含以下内容的 `base.html.twig` 文件。
<!DOCTYPE html> <html lang = "en"> <head> {% block head %} <meta charset = "utf-8"> <meta http-equiv = "X-UA-Compatible" content = "IE = edge"> <meta name = "viewport" content = "width = device-width, initial-scale = 1"> {% if header.description %} <meta name = "description" content = "{{ header.description }}"> {% else %} <meta name = "description" content = "{{ site.description }}"> {% endif %} {% if header.robots %} <meta name = "robots" content = "{{ header.robots }}"> {% endif %} <link rel = "icon" type = "image/png" href="{{ theme_url }}/images/favicon.png"> <title>{% if header.title %}{{ header.title }} | {% endif %}{{ site.title }}</title> {% block stylesheets %} {# Bootstrap core CSS #} {% do assets.add('theme://css/bootstrap.min.css',101) %} {# Custom styles for this theme #} {% do assets.add('theme://css/bootstrap-custom.css',100) %} {{ assets.css() }} {% endblock %} {% block javascripts %} {% do assets.add('https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js', 101) %} {% do assets.add('theme://js/bootstrap.min.js') %} {% if browser.getBrowser == 'msie' and browser.getVersion >= 8 and browser.getVersion <= 9 %} {% do assets.add('https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js') %} {% do assets.add('https://oss.maxcdn.com/respond/1.4.2/respond.min.js') %} {% endif %} {{ assets.js() }} {% endblock %} {% endblock head %} </head> <body> {# include the header + navigation #} {% include 'partials/header.html.twig' %} <div class = "container"> {% block content %}{% endblock %} </div> <div class = "footer"> <div class = "container"> <p class = "text-muted">Bootstrap Theme for <a href = "http://getgrav.org">Grav</a></p> </div> </div> </body> {% block bottom %}{% endblock %} </html>
步骤 4:分解它
让我们看看 `base.html.twig` 文件中的代码是如何工作的,如下所示。
{% block head %}{% endblock head %} 语法用于在基础 Twig 模板中定义一个区域。{% endblock head %} 内部的 head 是可选的。
if 语句测试页面标题中是否设置了元描述。如果未设置,则模板应使用user/config/site.yaml文件中定义的site.description进行渲染。
当前主题的路径由theme_url变量给出。
语法{% do assets.add('theme://css/bootstrap.min.css',101) %}用于使用资产管理器。theme://表示当前主题路径,101表示顺序,数值越大优先级越高。我们也可以显式提供CDN链接,例如:
{% do assets.addCss('http://fonts.googleapis.com/css?family = Open + Sans') %}
或者:
{% do assets.addJs(' https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js') %}
当调用{{ assets.css() }}或{{ assets.js() }}时,模板会分别渲染所有 JavaScript 标签和 CSS 链接标签。
语法{# ... #}用于在 Twig 中编写注释。
要包含另一个 Twig 模板,可以使用{% include 'partials/header.html.twig' %}标签。
模板的内容由{% block content %}{% endblock %}标签提供。
要添加自定义 JavaScript 初始化或分析代码,可以使用{% block bottom %}{% endblock %}标签作为模板的占位符。
步骤 5:页眉模板
当执行{% include 'partials/header.html.twig' %}时,Twig 渲染引擎会搜索 Twig 模板。因此,在user/themes/bootstrap/templates/partials文件夹内创建header.html.twig模板文件,内容如下。
<nav class = "navbar navbar-default navbar-inverse navbar-static-top" role = "navigation"> <div class = "container"> <div class = "navbar-header"> <button type = "button" class = "navbar-toggle" data-toggle = "collapse" data-target = ".navbar-collapse"> <span class = "sr-only">Toggle navigation</span> <span class = "icon-bar"></span> <span class = "icon-bar"></span> <span class = "icon-bar"></span> </button> <a class = "navbar-brand" href = "#">Grav</a> </div> <div class = "navbar-collapse collapse"> <ul class = "nav navbar-nav navbar-right"> {% for page in pages.children %} {% if page.visible %} {% set current_page = (page.active or page.activeChild) ? 'active' : '' %} <li class = "{{ current_page }}"><a href = "{{ page.url }}">{{ page.menu }}</a></li> {% endif %} {% endfor %} </ul> </div> </div> </nav>
以上代码创建了一个导航栏,并在user/pages文件夹中创建新页面时自动显示所有菜单项。
步骤 6 - 默认模板
每个内容项都有一个特定的文件名,例如default.md,它指示 Grav 搜索名为default.html.twig的模板文件。现在让我们在user/themes/bootstrap/templates/文件夹中创建default.html.twig文件,内容如下。
{% extends 'partials/base.html.twig' %} {% block content %} {{ page.content }} {% endblock %}
上面的default.html.twig文件扩展了partials/base.html.twig,并告诉基础模板对content块使用{{ page.content }}。
步骤 7:主题 CSS
在partials/base.html.twig文件中,我们使用assets.add('theme://css/bootstrap-custom.css',100)引用了自定义主题css,其中存储了站点中使用的任何自定义CSS。
现在让我们在user/themes/bootstrap/css文件夹中创建一个bootstrap-custom.css文件,内容如下:
/* Restrict the width */ .container { width: auto; max-width: 960px; padding: 0 12px; } /* Place footer text center */ .container .text-muted { margin: 18px 0; text-align: center; } /* Sticky footer styles -------------------------------------------------- */ html { position: relative; min-height: 80%; } body { /* Margin bottom by footer height */ margin-bottom: 60px; } .footer { position: absolute; bottom: 0; width: 100%; /* Set the fixed height of the footer here */ height: 50px; background-color: #dcdcdc; } /* Typography */ /* Tables */ table { width: 100%; border: 1px solid #f0f0f0; margin: 30px 0; } th { font-weight: bold; background: #f9f9f9; padding: 5px; } td { padding: 5px; border: 1px solid #f0f0f0; } /* Notice Styles */ blockquote { padding: 0 0 0 20px !important; font-size: 16px; color: #666; } blockquote > blockquote > blockquote { margin: 0; } blockquote > blockquote > blockquote p { padding: 15px; display: block; margin-top: 0rem; margin-bottom: 0rem; border: 1px solid #f0f0f0; } blockquote > blockquote > blockquote > p { /* Yellow */ margin-left: -75px; color: #8a6d3b; background-color: #fcf8e3; border-color: #faebcc; } blockquote > blockquote > blockquote > blockquote > p { /* Red */ margin-left: -100px; color: #a94442; background-color: #f2dede; border-color: #ebccd1; } blockquote > blockquote > blockquote > blockquote > blockquote > p { /* Blue */ margin-left: -125px; color: #31708f; background-color: #d9edf7; border-color: #bce8f1; } blockquote > blockquote > blockquote > blockquote > blockquote > blockquote > p { /* Green */ margin-left: -150px; color: #3c763d; background-color: #dff0d8; border-color: #d6e9c6; }
步骤 8:测试
将您的默认主题更改为新的bootstrap主题。打开user/config/system.yaml文件并编辑包含以下内容的行:
pages: themes: antimatter
并将以上代码更改为:
pages: theme: bootstrap
现在重新加载您的 Grav 站点,您将看到如下所示的新安装主题。
Grav - Twig 过滤器和函数
在本章中,让我们学习Twig 过滤器和函数。过滤器用于以所需输出的方式格式化数据。函数用于生成内容。
Twig 模板是包含表达式和变量的文本文件,这些表达式和变量由值替换。Twig 使用三种类型的标签。
输出标签 - 以下语法用于在此处显示已计算表达式的结果。
{{ Place Your Output Here }}
操作标签 - 以下语法用于在此处执行语句。
{% executable statements are placed here %}
注释标签 - 以下语法用于在 Twig 模板文件中编写注释。
{# write your comment here #}
Twig 过滤器
Twig 过滤器使用|字符将过滤器应用于 Twig 变量,后跟过滤器名称。参数可以像 Twig 函数一样在括号中传递。
下表显示了 Grav 中使用的 Twig 过滤器:
序号 | 过滤器 & 说明 | 示例 |
---|---|---|
1 | 绝对 URL 它接受相对路径并将其转换为绝对 URL。 |
'<img src="/some/path/img.jpg"/>' |absolute_url 转换为: <img src="http://learn.getGrav.org/some/path/img.jpg" /> |
2 | 骆驼命名法 它将字符串转换为驼峰式命名法。 |
'contact_us'| camelize 转换为: ContactUs |
3 | 包含 如果找到字符串。 |
'This is some string' | contains('some') 输出为: 1 |
4 | 已定义 您可以检查某些变量是否已定义。如果变量未定义,您可以提供默认值。 |
set header_image_width = page.header.header_image_width|defined(900) 如果未定义,它将header_image_width设置为值 900。 |
5 | 以…结尾 您可以使用 Ends-With 过滤器确定字符串是否以给定字符串结尾。 |
'this is an example for ends-with filter' | ends_with('filter') 显示为: True |
6 | 字段名 它通过将点更改为数组表示法来过滤字段名。 |
'field.name'|fieldName 显示为: field[name] |
7 | 人性化 它用于将字符串转换为人类可读的格式。 |
'some_text_to_read'|humanize 显示为: Some text to read |
8 | Ksort 它使用键对数组映射进行排序。 |
{% set ritems = {'orange':1, 'apple':2, 'peach':3}|ksort %} {% for key, value in ritems %}{{ key }}:{{ value }}, {% endfor %} 显示为: apple:2, orange:1, peach:3, |
9 | 左修剪 它用于删除字符串开头的空格,并从字符串的左侧删除给定的匹配字符。 |
'/strip/leading/slash/'|ltrim('/') 显示为: strip/leading/slash/ |
10 | Markdown 它用于使用 Grav 的 markdown 解析器将包含 markdown 的字符串转换为 HTML。 |
'## some text with markdown'|markdown 显示为:
|
11 | MD5 可以使用此过滤器创建字符串的 md5 哈希。 |
'something'|md5 显示为: 437b930db84b8079c2dd804a71936b5f |
12 | 月化 使用 Monthize 过滤器,我们可以将整数天数转换为月数。 |
'61'|monthize 显示为: 2 |
13 | 漂亮的时间 使用 Nice Time 过滤器,我们可以获得人类可读的漂亮日期时间格式输出。 |
page.date|nicetime(false) 显示为: 3 hrs ago |
14 | 序数化 可以使用 Ordinalize 过滤器为整数提供序数(如 1st、2nd、3rd)。 |
'78'| ordinalize 显示为: 78th |
15 | 复数化 可以使用 Pluralize 过滤器将字符串转换为其英语复数形式。 |
'child'|pluralize 显示为: children |
16 | 随机化 此过滤器有助于随机化提供的列表。如果参数包含任何值,则这些值将跳过随机化。 |
{% set ritems = ['one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten']|randomize(3) %} {% for ritem in ritems %}{{ ritem }}, {% endfor %} 显示为: one, two, three, eight, six, five, nine, seven, ten, four, |
17 | 右修剪 它与左修剪非常相似,只是它从字符串的右侧删除空格和匹配的字符。 |
'/strip/leading/slash/'|rtrim('/') 显示为: /strip/leading/slash |
18 | 单数化 可以使用 Singular 过滤器将字符串转换为英语单数形式。 |
'vehicles'|singularize 显示为: vehicle |
19 | 安全邮箱 安全邮箱过滤器用于将电子邮件地址转换为 ASCII 字符,从而使电子邮件更难以被垃圾邮件。 |
"[email protected]"|safe_email 输出为: [email protected] |
20 | 按键排序 它用于使用键对数组映射进行排序。 |
{% set people = [{'email':'[email protected]', 'id':3}, {'email':'[email protected]', 'id':1}, {'email':'[email protected]', 'id':7}]|sort_by_key('id') %} {% for person in people %}{{ person.email }}:{{ person.id }}, {% endfor %} 显示: [email protected]:1, [email protected]:3, [email protected]:7, |
21 | 以…开头 您可以使用 Starts-With 过滤器确定字符串是否以给定字符串开头。 |
'this is an example for starts-with filter' |starts_with('this') 输出为: true |
22 | 翻译 更多详细信息。 |
MY_LANGUAGE_KEY_STRING 显示: 'Some text in English' |
23 | 翻译管理 它将字符串翻译成user.yaml文件中设置的当前语言。 |
|
24 | 标题化 使用 Titleize 将字符串转换为标题大小写格式。 |
'welcome page'|titleize 显示为: Welcome Page |
25 | 下划线化 使用 UnderScoreize 过滤器格式化。 |
'ContactUs'|underscorize 转换为: contact_us |
26 | 截断字符串 您可以使用 Truncate 截断字符串或缩短字符串,您必须指定字符数。 |
'one sentence. two sentences'|truncate(5) 截断为: one s... 如果您不想在给定字符数后将字符串截断到最接近的句子结尾,则可以使用true作为参数。 'one sentence. two sentences'|truncate(5, true) 截断为: one sentence您还可以去除 HTML 文本,但在truncate过滤器之前,应使用striptags过滤器。 '<p>one <strong>sentence<strong>. two sentences</p>'|striptags|truncate(5) 显示为: one s |
Twig 函数
Twig 函数通过传递参数直接调用。下表列出了这些函数:
序号 | 函数 & 说明 | 示例 |
---|---|---|
1 | 数组 此函数将值转换为数组。 |
array(value) |
2 | 授权 此函数使经过身份验证的用户有权查看资源,并接受权限字符串或权限字符串数组。 |
authorize(['admin.statistics', 'admin.super']) |
3 | 转储 它接受一个有效的 twig 变量并将其转储到 Grav 调试器面板中。但是,应启用调试器才能查看消息选项卡的值。 |
dump(page.header) |
4 | 调试 这与 dump() 函数的作用相同。 |
|
5 | Gist 此函数根据 Github Gist ID 创建 Gist 嵌入代码。 |
|
6 | 随机字符串生成 此函数将创建具有指定字符数的随机字符串。这些字符串可以用作唯一 ID 或密钥。 |
generate_random_string(10) |
7 | 重复 此函数将重复给定时间量的字符串。 |
repeat('Grav ', 10) will repeat Grav 10 times. |
8 | 字符串 生成指定字符长度的随机字符串。 |
ta (23) |
9 | 翻译数组 它是一个与|ta过滤器连接的函数。 |
|
10 | 网址 此过滤器将创建一个 URL,它还将 PHP URL 流转换为有效的 HTML 资源。如果无法解析 URL,则可以传递默认值。 |
url('theme://images/logo.png') | default('http://www.placehold.it/150x100/f4f4f4') |
11 | 翻译 使用 Translate 过滤器,字符串被翻译为|t过滤器。 |
t('SITE_NAME') 翻译为: Site Name |
Grav - 主题变量
在本章中,让我们了解 Grav 中的主题变量。在设计主题时,从 twig 模板访问对象和变量,这些对象和变量由 Twig 模板框架读取和操作。
核心对象
Twig 模板有很多核心对象;每个对象都有一组变量和函数。
下表显示了带有简要说明的变量。
序号 | 变量 & 说明 |
---|---|
1 | {{ base_dir }} 我们可以使用此变量获取 Grav 安装的基础文件目录。 |
2 | {{ base_url }} 可以使用此变量访问 Grav 站点的基本 URL。 |
3 | {{ base_url_relative }} 它返回 Grav 站点基本 URL 的相对路径。 |
4 | {{ base_url_absolute }} 它返回 Grav 站点基本 URL 的绝对路径。 |
5 | {{ theme_dir }} 它用于返回当前主题的文件目录文件夹。 |
6 | {{ theme_url }} 它用于返回当前主题的相对 URL。 |
config 对象
在configuration.yaml文件中,config 对象被设置为访问任何 Grav 配置设置。
{{ config.pages.theme }}
它将返回当前配置的主题。
site 对象
提供对config.site对象的别名,表示在site.yaml文件中设置的配置。
stylesheets 对象
这些对象提供了一个用于存储 CSS 样式表资产的数组,可以循环添加 CSS 到模板。
scripts 对象
这些对象提供一个包含 JavaScript 资产的数组,该数组被循环遍历并将 JavaScript 添加到模板。
page 对象
由于 Grav 的结构在pages/文件夹中定义,因此page 对象负责表示每个页面。page 对象包含有关您当前正在处理的页面的所有信息。
下表显示了 page 对象的方法。
序号 | 方法 & 说明 | 示例 |
---|---|---|
1 | summary([size]) 它提供页面内容的摘要,并指定大小作为参数。 如果未指定大小,则该值将从system/config/site.yaml文件中的summary.size变量中获取。 您也可以在内容中使用分隔符===。分隔符之前的内容将用于摘要。 |
{{ page.summary }} 或者 {{ page.summary(80) }} |
2 | content() 它用于获取页面的完整 HTML 内容。 |
{{ page.content }} |
3 | headers() 它返回在页面 YAML 前端内容中定义的页面标题。 |
title: About Us author: Johnson上述标题可以按如下方式访问 The author of this page is: {{ page.header.author }} |
4 | media() 它用于访问所有媒体文件,例如图像、视频和其他文件。它将返回一个包含与页面关联的所有媒体的数组。 |
{% set first_image = page.media|first %} {% set my_pdf = page.media['myfile.pdf'] %} {% for image in page.media.images %} {{ image.html }} {% endfor %} |
5 | title() 它设置为返回页面的标题,该标题在页面的 YAML 标题中定义。 |
title: My Page |
6 | menu() 返回在页面 YAML 标题中指定的menu变量的值。如果未设置title变量,则默认为title。 |
title: My Blog menu: my blog page |
7 | visible() 它用于设置页面的可见性。通常,后面跟着句点的数字值(即 01.foldername)的页面会显示在菜单中,而没有数字值的文件夹名称(即 foldername)则不可见。我们可以在页面标题中覆盖它。 |
title: About Us visible: true |
8 | routable() 通过使用它,我们可以确定页面是否可路由或不可路由,这意味着当您将浏览器指向页面时是否可以接收回内容。不可路由的页面可用于插件、模板等,这些页面无法直接访问。这在页面标题中设置。 |
title: My Page routable: true |
9 | slug() 使用此变量,我们可以获取页面 URL 中显示的直接名称。 |
my-page |
10 | url([include_host = false]) 它用于返回页面的 URL。 |
{{ page.url }} { # could return /myfolder/mypage #} 或者 {{ page.url(true) }} {# could return http: //mysite.com/ myfolder/mypage #} |
11 | route() 它用于返回页面的内部路由。 |
|
12 | home() 使用此变量,您可以确定页面是否配置为主页。页面配置为主页时返回 true,未配置时返回 false。您可以在system.yaml文件中找到此设置。 |
|
13 | root() 它确定当前页面是否是层次结构的根页面。如果它是根页面,则返回true;如果不是根页面,则返回false。 |
|
14 | active() 您可以使用此变量确定浏览器是否正在访问当前页面。如果浏览器正在访问此页面,则返回true;否则返回false。 |
|
15 | modular() 使用此变量,我们可以确定此页面是否为模块化页面。如果是模块化页面,则返回true;否则返回false。 |
|
16 | activeChild() 此变量可以确定此 URI 的 URL 是否包含活动页面的 URL;或者,简单来说,就是当前 URL 中此页面的 URL。当您处理导航并想知道页面是否正在迭代同一父页面时,这非常有用。 |
|
17 | find(url) 根据路由 URL 指定,此变量将返回页面对象。 |
{% include 'modular/author-detail.html.twig' with {'page': page.find('/authors/ john-bloggs')} %} |
18 | collection() 此变量用于根据集合页面标题返回上下文中的一组页面。 |
{% for child in page.collection %} {% include 'partials /blog_item.html.twig' with {'page':child, 'truncate':true} %} {% endfor %} |
19 | isFirst() 如果当前页面是其同级页面的第一个,则返回true,否则返回false。 |
|
20 | isLast() 如果当前页面是其同级页面的最后一个,则返回true,否则返回false。 |
|
21 | nextSibling() 参考当前位置,它从数组中返回下一个同级页面。 |
|
22 | prevSibling() 参考当前位置,它从数组中返回上一个同级页面。 |
|
23 | children() 根据页面内容结构定义,此变量将返回子页面的数组。 |
|
24 | orderBy() 此方法返回排序后的子项的排序类型。可能包含的值为default、title、date和folder,这些值在页面标题中配置。 |
|
25 | orderDir() 此方法返回排序后的子页面的排序方向。值可以是asc(升序)或desc(降序)。通常这些值在页面标题中配置。 |
|
26 | orderManual() 此方法返回一个包含手动页面排序的数组,此排序将适用于页面的任何子项。此值通常在页面标题中设置。 |
|
27 | maxCount() 此变量指示最多允许返回多少个子页面。值通常在页面标题中指定。 |
|
28 | children.count() 此变量返回页面有多少个子页面。 |
|
29 | children.current() 此变量将返回当前子项。 |
|
30 | children.next() 这将从子页面数组中返回下一个子项。 |
|
31 | children.prev() 这将从子页面数组中返回上一个子项。 |
|
32 | children.nth(position) 这将返回子项在子项数组中的位置。 |
|
33 | parent() 在嵌套树结构中,当您想要向上导航到父页面时,可以使用此变量。它将返回当前页面的父页面对象。 |
|
34 | isPage() 使用此变量,您可以确定此页面是否具有实际的.md文件,或者它只是一个用于路由的文件夹。 |
|
35 | isDir() 使用此变量,您可以确定当前页面是否仅用于路由的文件夹。根据情况返回true或false。 |
|
36 | id() 这将返回页面的唯一 ID。 |
|
37 | modified() 它返回上次修改页面的时间戳。 |
|
38 | date() 此方法返回页面的日期时间戳。通常在标题中配置,表示页面或帖子的日期。如果没有提供值,则默认使用修改时间戳。 |
|
39 | filePath() 使用它,您可以获取页面的完整文件路径。 |
/Users/yourname/sites/ Grav/user/pages/ 01.home/default.md |
40 | filePathClean() 这将返回相对路径。 |
user/pages/ 01.home/default.md |
41 | path() 这将返回当前页面所在的目录的完整路径。 |
/Users/yourname /sites/ Grav/user/pages /01.home |
42 | folder() 这将返回页面的文件夹名称。 |
|
43 | taxonomy() 这将返回与页面连接的分类法数组。 |
pages 对象
Pages 对象表示为页面对象的嵌套树。此嵌套树在创建导航、站点地图或查找特定页面时非常有用。
children 方法
这返回一个由子页面组成的页面对象数组。具有树状结构的页面对象可以迭代文件夹中的每个页面。
要获取菜单的顶级页面,请使用以下代码。
<ul class = "navigation"> {% for page in pages.children %} {% if page.visible %} <li><a href = "{{ page.url }}">{{ page.menu }}</a></li> {% endif %} {% endfor %} </ul>
uri 对象
可以使用 Uri 对象的几种方法访问当前 URI 的部分。
http://mysite.com/Grav/section/category/page.json/param1:foo/param2:bar/?query1 = baz&query2 = qux:
下表显示了 Uri 对象的方法。
序号 | 方法 & 说明 | 示例 |
---|---|---|
1 | path() 可以使用此方法访问当前 url 的部分。 |
uri.path = /section/category/page |
2 | paths() 使用此方法返回路径元素数组。 |
uri.paths = [section, category, page]) |
3 | route([absolute = false][, domain = false]) 此方法返回具有绝对或相对 URL 的路由。 |
uri.route(true) = http://mysite.com/Grav/ section/category/page 或者, uri.route() = /section/category/page) |
4 | params() 这将返回 URL 中的参数部分。 |
uri.params = /param1:foo/param2:bar |
5 | param(id) 这将返回参数的值。 |
uri.param('param1') = foo |
6 | query() 可以使用此方法访问 URL 的查询部分。 |
uri.query = query1=bar&query2=qux |
7 | query(id) 使用它可以访问特定的查询项。 |
uri.query('query1') = bar |
8 | url([include_host = true]) 这将返回完整的 URL,可能包含或不包含主机。 |
uri.url(false) = Grav/section/ category/page/param:foo?query = bar |
9 | extension() 这将返回扩展名,如果没有提供,则返回 html。 |
uri.extension = json) |
10 | host() 这将返回 URL 的主机。 |
uri.host = mysite.com |
11 | base() 这将返回 URL 的基础部分。 |
uri.base = http://mysite.com |
12 | rootUrl([include_host = true]) 这将返回 Grav 实例的根 URL。 |
uri.rootUrl() = http://mysite.com/Grav |
13 | referrer() 此方法返回页面的推荐者信息。 |
header 对象
它是原始页面的page.header()的替代方法。当您遍历子页面时,最好使用原始页面标题。
content 对象
它是原始页面的page.content()的替代方法。
taxonomy 对象
站点的所有分类法信息都包含在全局 taxonomy 对象中。
browser 对象
Grav 使用内置支持以编程方式确定用户的平台、浏览器和版本。
{{ browser.platform}} # windows {{ browser.browser}} # chrome {{ browser.version}} # 24
添加自定义变量
自定义变量可以通过多种方式添加。如果您使用的是站点范围的变量,则将其放在user/config/site.yaml文件中,您可以按如下所示访问它。
{{ site.my_variable }}
如果变量仅适用于特定页面,则可以将其添加到 YAML 前端内容中,并使用page.header对象访问它。
例如 -
title: My Page author: John
作者姓名可以访问为 -
The author of this page is: {{ page.header.author }}
添加自定义对象
使用插件,您可以向 Twig 对象添加自定义对象。这是一个高级主题,我们将在插件章节中看到更多信息。
Grav - 资源管理器
在本节中,让我们学习资产管理器。资产管理器在 Grav 0.9.0 中引入,用于统一添加和管理JavaScript和CSS等资产的界面。从主题和插件添加这些资产将提供高级功能,例如排序和资产管道。资产管道用于缩小和压缩资产,从而减少浏览器的需求并减小资产的大小。
资产管理器是一个类,可以通过插件事件钩子在 Grav 中使用。您也可以通过使用 Twig 调用在主题中直接使用资产管理器类。
配置
资产管理器包含一组配置选项。system.yaml文件包含默认值;您可以在您的user/config/system.yaml文件中覆盖这些值。
assets: # Configuration for Assets Manager (JS, CSS) css_pipeline: false # The CSS pipeline is the unification of multiple CSS resources into one file css_minify: true # Minify the CSS during pipelining css_rewrite: true # Rewrite any CSS relative URLs during pipelining js_pipeline: false # The JS pipeline is the unification of multiple JS resources into one file js_minify: true # Minify the JS during pipelining
主题中的资产
安装 Grav 时,Antimatter 主题作为默认主题提供。它显示了如何在位于此主题中的base.html.twig文件中添加 CSS 文件的示例。
{% block stylesheets %} {% do assets.addCss('theme://css/pure-0.5.0/grids-min.css', 103) %} {% do assets.addCss('theme://css-compiled/nucleus.css',102) %} {% do assets.addCss('theme://css-compiled/template.css',101) %} {% do assets.addCss('theme://css/custom.css',100) %} {% do assets.addCss('theme://css/font-awesome.min.css',100) %} {% do assets.addCss('theme://css/slidebars.min.css') %} {% if browser.getBrowser == 'msie' and browser.getVersion == 10 %} {% do assets.addCss('theme://css/nucleus-ie10.css') %} {% endif %} {% if browser.getBrowser == 'msie' and browser.getVersion >= 8 and browser.getVersion <= 9 %} {% do assets.addCss('theme://css/nucleus-ie9.css') %} {% do assets.addJs('theme://js/html5shiv-printshiv.min.js') %} {% endif %} {% endblock %} {{ assets.css() }}
以上代码简要说明如下。
在block twig 标记中定义的区域可以在扩展该区域的模板中替换或追加,您可以看到此块内do assets.addCss()调用的数量。
{% do %}标记允许您处理没有任何输出的变量,该变量内置于 Twig 本身。
可以使用addCss()方法将 CSS 资产添加到资产管理器。您可以通过传递数值作为第二个参数来设置样式表的优先级。对addCss()方法的调用将从 CSS 资产呈现 HTML 标记。
JavaScript 资产的使用方式与 CSS 资产相同。JavaScript 资产位于如下所示的 `block` Twig 标签内。
{% block javascripts %} {% do assets.addJs('jquery',101) %} {% do assets.addJs('theme://js/modernizr.custom.71422.js',100) %} {% do assets.addJs('theme://js/antimatter.js') %} {% do assets.addJs('theme://js/slidebars.min.js') %} {% do assets.addInineJs('alert(\'This is inline!\')') %} {% endblock %} {{ assets.js() }}
添加资产
下表列出了不同的添加方法:
序号 | 方法 & 说明 |
---|---|
1 | add(asset, [options]) 根据文件扩展名,`add` 方法匹配相应的资产。这是调用 CSS 或 JS 直接方法的正确方法。您可以使用 `options` 设置优先级。`pipeline` 属性控制资产是否应包含在组合/压缩流程中。 |
2 | addCss(asset, [options]) 使用此方法,您可以将资产添加到 CSS 资产中。根据第二个参数中设置的优先级,资产在列表中的顺序排列。如果未设置优先级,则默认为 10。`pipeline` 属性控制资产是否应包含在组合/压缩流程中。 |
3 | addDirCss(directory) 使用此方法,您可以添加包含 CSS 资产的实体目录,这些资产将按字母顺序排列。 |
4 | addInlineCss(css, [options]) 您可以使用此方法在内联样式标签内提供 CSS 字符串。 |
5 | addJs(asset, [options]) 使用此方法,您可以将资产添加到 JS 资产中。如果未设置优先级,则将其默认优先级设置为 10。`pipeline` 属性决定资产是否应包含在组合/压缩流程中。 |
6 | addInlineJs(javascript, [options]) 此方法允许您在内联脚本标签内添加 JS 字符串。 |
7 | addDirJs(directory) 使用此方法,您可以添加包含 JS 资产的实体目录,这些资产将按字母顺序排列。 |
8 | registerCollection(name, array) 此方法允许您使用名称注册包含 CSS 或 JS 资产的数组,以便稍后可以使用 `add()` 方法使用它。如果您使用多个主题或插件,则此方法非常有用。 |
选项
有很多选项可以传递资产数组,解释如下:
对于 CSS
`priority` - 它接受整数值,默认值为 100。
`pipeline` - 当资产不包含在流程中时,将其设置为 `false` 值。默认值为 `true`。
对于 JS
`priority` - 接受整数值,默认值为 100。
`pipeline` - 当资产不包含在流程中时,设置为 `false`。默认值为 `true`。
`loading` - 此选项支持三个值:`empty`、`async` 和 `defer`。
`group` - 它包含一个字符串,指定组的唯一名称。默认值为 `true`。
示例
{% do assets.addJs('theme://js/example.js', {'priority':101, 'pipeline':true, 'loading':'async', 'group':'top'}) %}
渲染资产
可以使用以下方法渲染 CSS 和 JS 资产的当前状态:
css()
`css()` 方法根据已添加到资产管理器的所有 CSS 资产,渲染一个包含 HTML CSS 链接标签的列表。根据 `pipeline` 属性,列表可以包含压缩文件和单个/组合资产。
js()
`js()` 方法根据已添加到资产管理器的所有 JS 资产,渲染一个包含 HTML JS 链接标签的列表。根据 `pipeline` 属性,列表可以包含压缩文件和单个/组合资产。
命名资产
Grav 允许您使用名称注册 CSS 和 JS 资产的集合,以便您可以使用注册的名称将 `add` 资产添加到资产管理器。这可以通过 Grav 的 `命名资产` 功能实现。这些自定义集合在 `system.yaml` 中定义;任何主题或插件都可以使用这些集合。
assets: collections: jquery: system://assets/jquery/jquery-2.1.3.min.js bootstrap: - https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css - https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap-theme.min.css - https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js
`registerCollection()` 方法可以用以下代码以编程方式使用:
$assets = $this->Grav['assets']; $bootstrapper_bits = [https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css, https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap-theme.min.css, https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js]; $assets->registerCollection('bootstrap', $bootstrap_bits); $assets->add('bootstrap', 100);
分组资产
Grav 0.9.43 引入了一项名为 `分组资产` 的新功能,允许您在添加资产时传递包含可选 `group` 的选项数组。当您需要页面特定部分的一些 JS 文件或内联 JS 时,此功能非常有用。
使用选项语法,您必须在添加资产时指定组,如下所示。
{% do assets.addJs('theme://js/example.js', {'priority':102, 'group':'bottom'}) %}
如果未为资产设置组,则默认为 `head` 组。如果您希望这些资产在底部组中渲染,则必须在您的主题中添加以下内容。
{{ assets.js('bottom') }}
静态资产
当您想在不使用资产管理器的情况下引用资产时,可以使用 `url()` 辅助方法。例如,当您想从主题引用图像时,可以使用以下语法。
<img src = "{{ url("theme://" ~ widget.image) }}" alt = "{{ widget.text|e }}" />
`url()` 辅助方法可以选择第二个参数,使用 `true` 或 `false` 值使 URL 包含域和模式。默认值为 `false`,仅显示相对 URL。
示例
url("theme://somepath/mycss.css", true)
Grav - 主题定制
本章,我们将学习 `主题定制`。定制主题的方法有很多。Grav 提供了许多功能和一些易于定制主题的功能。
自定义 CSS
您可以提供您自己的 `custom.css` 文件来定制您的主题。Antimatter 主题通过使用 `资产管理器` 来引用 `css/custom.css` 文件。如果找不到对 CSS 文件的引用,则 `资产管理器` 将不会添加对 HTML 的引用。在 Antimatter 的 `css/` 文件夹中创建 CSS 文件将覆盖默认 CSS。例如:
custom.css
body a { color: #FFFF00; }
默认链接颜色被覆盖并设置为黄色。
自定义 SCSS/LESS
提供自定义 CSS 文件的另一种方法是使用 `custom.scss` 文件。`SCSS(Syntactically Awesome Style Sheets)` 是一种 CSS 预处理器,允许您通过使用运算符、变量、嵌套结构、导入、部分和混合来高效地构建 CSS。Antimatter 使用 SCSS 编写的。
要使用 SCSS,您需要 SCSS 编译器。您可以使用命令行工具和 GUI 应用程序在任何平台上安装 SCSS 编译器。Antimatter 使用 `scss/` 文件夹来放置所有 `.scss` 文件。编译后的文件存储在 `css-compiled/` 文件夹中。
应监视 `SCSS` 文件的任何更新,这可以通过使用以下命令完成:
scss --watch scss:css-compiled
上述命令告诉 SCSS 编译器监视名为 scss 的目录,并且每当 `css-compiled` 文件夹更新时,SCSS 编译器都应对其进行编译。
您可以将自定义 SCSS 代码保存在 `scss/template/_custom.scss` 文件中。将代码保存在此文件中有很多优点。
SCSS 文件和其他 CSS 文件的任何更新都将编译到 `css-compiled/template.css` 文件中。
您可以访问主题中使用的任何 SCSS,并利用其中可用的所有变量和混合。
为了更轻松地进行开发,您可以访问标准 SCSS 的所有功能。
`_custom.scss` 文件示例如下:
body { a { color: darken($core-accent, 20%); } }
升级主题时,所有自定义 css 都会被覆盖。这是选择这种方式定制主题的主要缺点。这可以通过主题继承来解决。
主题继承
`主题继承` 是修改或定制主题的最佳方法,可以通过一些设置来实现。基本思想是将主题定义为您继承的基主题,并且只能修改一些部分,其余部分由基主题处理。使用主题继承的优点是,每当更新基主题时,自定义的继承主题都不会直接受到影响。要实现此目的,您需要按照以下步骤操作。
要存储您的新主题,请在 `/user/themes/` 文件夹内创建一个名为 `mytheme/` 的新文件夹。
接下来,您需要在新建的 `/user/themes/mytheme/` 文件夹下创建一个名为 `mytheme.yaml` 的新主题 YAML 文件,内容如下。
streams: schemes: theme: type: ReadOnlyStream prefixes: '': - user/themes/mytheme - user/themes/antimatter
在 `/user/themes/mytheme/` 文件夹下创建一个名为 `blueprints.yaml` 的 YAML 文件,内容如下。
name: MyTheme version: 1.0.0 description: "Extending Antimatter" icon: crosshairs author: name: Team Grav email: [email protected] url: http://getgrav.org
现在我们将了解如何定义包含基本元素的主题 `blueprints.yaml`。可以为表单定义提供更多详细信息以控制您的表单功能。可以检查 `blueprints.yaml` 文件以获取有关此方面的更多详细信息。
在您的 `user/config/system.yaml` 文件中,编辑 `pages: theme:` 选项以将您的默认主题更改为新主题,如下所示。
pages: theme: mytheme
现在创建了新的主题,Antimatter 将成为此新 `mytheme` 主题的基主题。如果您想修改特定的 SCSS,我们需要配置 SCSS 编译器,以便它首先查找您的 `mytheme` 主题,其次查找 Antimatter 主题。
它使用以下设置:
首先复制位于 `antimatter/scss/` 文件夹中的 `template.scss` 文件,并将其粘贴到 `mytheme/scss/` 文件夹中。此文件将包含对各种文件(如 `template/_custom.scss` 和子文件)的所有 `@import` 调用。
`load-path` 指向包含大量 SCSS 文件的 `antimatter/scss/` 文件夹。要运行 SCSS 编译器,您需要向其提供 `load-path`,如下所示。
scss --load-path ../antimatter/scss --watch scss:css-compiled
现在,在 `mytheme/scss/template/` 下创建一个名为 `_custom.scss` 的文件。此文件将包含您所有的修改。
更改自定义 SCSS 文件后,所有 SCSS 文件都将自动重新编译到位于 `mytheme/css-compiled/` 文件夹下的 `template.css` 中,然后 Grav 将准确引用它。
Grav - 插件基础
本章,我们将了解插件如何在 Grav 中作为附加功能工作。插件是一段软件,它提供 Grav 核心功能最初未完成的附加功能。
Grav 插件可以上传以扩展网站的功能。插件用于简化您的工作。依赖注入容器有助于访问 Grav 中的关键对象。在整个生命周期中,借助Grav 的事件钩子,我们可以根据需要操作 Grav,也可以访问 Grav 已知的一切。我们将在第 Grav - 事件钩子 章中详细学习 Grav 事件钩子。
依赖注入是一种软件设计模式,其中组件被赋予它们的依赖项,而不是在组件内硬编码它们。
Grav 有许多可用的免费插件,用于显示博客归档、站点地图、搜索引擎、表单、轻量级滑块等等。您可以从 这里 下载插件。您可以在 Plugin 文件夹中存储具有唯一名称的插件;名称应与插件的功能相关,并且不应包含任何大写字母、下划线或空格。我们将在第 Grav - 插件教程 章中学习如何使用插件。
强大
插件易于编写、灵活且强大。共有 46 个插件,其功能包括显示站点地图、提供面包屑、显示博客存档等。
基本要素
当 Grav 安装在您的系统上时,您可以在<your_folder_name>/user/plugins 文件夹中看到两个插件。
错误插件
问题插件
错误插件 - 用于显示HTTP 错误,即当给定 URI 没有可用的请求页面时显示404 页面未找到。
问题插件 - 用于检测权限、托管设置和缺少文件夹方面的问题。在安装新的 Grav 时,它有助于识别此类问题。
Grav - 插件教程
在本节中,我们将深入探讨如何设置和配置插件。此外,我们还将了解插件的结构以及如何显示随机页面。插件是一段软件,它提供了 Grav 的核心功能最初未完成的附加功能。
在本文中,我们将使用随机插件显示随机页面。在使用此插件之前,我们将了解随机插件的一些重要要点。
您可以使用此插件通过使用 URI 为/random 来显示随机页面。
创建过滤器以使用页面中指定的分类法。您可以创建为category: blog。
您可以使用过滤器选项显示随机页面;这会通知 Grav 使用要在随机页面中显示的相同内容。
插件设置
在使用实际插件之前,请按照以下步骤创建插件的基本设置。
在user/plugins文件夹下创建一个名为random的文件夹。
在user/plugins/random文件夹下,创建两个文件:
random.php 用于插件代码
random.yaml 用于配置
插件配置
要使用随机插件,我们需要一些配置选项。我们将在random.yaml文件中写入以下几行。
enabled:true route:/random filters: category:blog
Random 创建您定义的路由。基于分类法过滤器,它会选择一个随机项目。过滤器的默认值为'category: blog',用于随机选择。
插件结构
以下代码可用于插件结构。
<?php namespace Grav\Plugin; use Grav\Common\Page\Collection; use Grav\Common\Plugin; use Grav\Common\Uri; use Grav\Common\Taxonomy; class RandomPlugin extends Plugin { } ?>
我们使用use语句在插件中使用一堆类,这使得它更易于阅读,并且节省了空间。必须在 PHP 文件的顶部编写namespace Grav\Plugin。插件名称应以首字母大写的方式编写,并应使用Plugin扩展。
您可以将函数getSubscribedEvents()订阅到onPluginsInitialized事件;这决定了插件订阅了哪些事件。这样,您可以使用该事件订阅其他事件。
public static function getSubscribedEvents() { return [ 'onPluginsInitialized' => ['onPluginsInitialized', 0], ]; }
现在让我们使用RandomPlugin类下的onPluginInitialized事件来路由在random.yaml文件中配置的页面。
onPluginInitialized()方法包含以下代码:
public function onPluginsInitialized() { $uri = $this->grav['uri']; $route = $this->config->get('plugins.random.route'); if ($route && $route == $uri->path()) { $this->enable([ 'onPageInitialized' => ['onPageInitialized', 0] ]); } }
Uri对象包含当前uri、关于路由的信息。config对象指定随机插件路由的配置值,并将其存储在route对象中。
现在我们将比较配置的路由与当前 URI 路径,这会通知插件监听onPageInitialized事件。
显示随机页面
您可以使用以下方法的代码显示随机页面:
public function onPageInitialized() { $taxonomy_map = $this->grav['taxonomy']; $filters = (array) $this->config->get('plugins.random.filters'); $operator = $this->config->get('plugins.random.filter_combinator', 'and'); if (count($filters)) { $collection = new Collection(); $collection->append($taxonomy_map->findTaxonomy($filters, $operator)->toArray()); if (count($collection)) { unset($this->grav['page']); $this->grav['page'] = $collection->random()->current(); } } }
如代码所示:
将分类法对象赋值给变量$taxonomy_map。
获取使用插件配置中配置的分类法的过滤器数组,使用config对象。我们使用项目category: blog。
我们使用collection将随机页面存储在$collection中。将匹配过滤器的页面附加到$collection变量。
取消设置当前页面对象,并将当前页面设置为在集合中显示为随机页面。
最后,我们将看到显示随机页面的插件的完整代码,如下所示:
<?php namespace Grav\Plugin; use Grav\Common\Page\Collection; use Grav\Common\Plugin; use Grav\Common\Uri; use Grav\Common\Taxonomy; class RandomPlugin extends Plugin { public static function getSubscribedEvents() { return [ 'onPluginsInitialized' => ['onPluginsInitialized', 0], ]; } public function onPluginsInitialized() { $uri = $this->grav['uri']; $route = $this->config->get('plugins.random.route'); if ($route && $route == $uri->path()) { $this->enable([ 'onPageInitialized' => ['onPageInitialized', 0] ]); } } public function onPageInitialized() { $taxonomy_map = $this->grav['taxonomy']; $filters = (array) $this->config->get('plugins.random.filters'); $operator = $this->config->get('plugins.random.filter_combinator', 'and'); if (count($filters)) { $collection = new Collection(); $collection->append($taxonomy_map->findTaxonomy($filters, $operator)->toArray()); if (count($collection)) { unset($this->grav['page']); $this->grav['page'] = $collection->random()->current(); } } } }
打开您的浏览器并输入localhost/folder_name/random以查看随机页面,如下面的屏幕截图所示:
Grav - 事件钩子
在本节中,我们将学习 Grav 中的事件钩子。在插件章节中,您将看到插件的逻辑包含在两种方法中。这些方法是onPluginsInitialized和onPageInitialized;这些方法类似于事件钩子。要了解和控制 Grav 插件的功能,您需要检查事件钩子的可用性。事件钩子与 Grav 从头到尾都有直接的关系。您必须了解钩子的调用顺序以及在这些调用时可以使用什么。
下表列出了在页面处理期间激活的核心 Grav事件钩子。
序号 | 事件和描述 |
---|---|
1 | onFatalException 如果PHP给出致命异常,您可以随时触发此事件。问题插件使用此功能来管理显示完整解释列表,解释 Grav 为什么会提供致命错误。 |
2 | onPluginsInitialized 这是 Grav 中可用的第一个插件事件。以下对象已按如下所述引入:
|
3 | onAssetsInitialized 这指定资源管理器已加载并准备使用和管理。 |
4 | onPageNotFound 如果您发现意外页面,您可以忽略此事件。目前,错误插件用于指定404 错误页面。 |
5 | onPageInitialized 这指定了由URL请求的页面,该页面已加载到 Page 对象中。 |
6 | onOutputGenerated 这指定了Twig 模板引擎的输出过程。目前,它只是一个HTML字符串。 |
7 | onOutputRendered 这是一个输出过程,它被发送到显示器。 |
8 | onShutdown 这是一个新的且非常强大的事件,允许您执行操作。这是在 Grav 完成处理并且与客户端的连接关闭后完成的。此单独的操作不需要与用户进行任何交互,因此可能会影响性能。它包括用户跟踪和作业处理。 |
9 | onBeforeDownload 这是一个新事件,它传递到包含文件的事件对象中。它允许用户执行日志记录,授予和忽略下载所提及文件的权限。 |
Twig 事件钩子
Twig 有自己的一组事件钩子可以使用,如下所示。
序号 | 事件和描述 |
---|---|
1 | onTwigTemplatePaths 模板路径的基本位置设置在Twig 对象上。此事件用于添加 Twig 将在其中搜索模板路径的其他位置。 |
2 | onTwiglnitialized 它初始化Twig 模板引擎。 |
3 | onTwigExtensions 它指定核心 twig 扩展程序已准备好使用。此事件钩子允许您添加自己的 Twig 扩展程序。 |
4 | onTwigPageVariables 此 Twig 过程允许您直接访问页面,即您可以在 YAML 页眉的页面中找到process:twig:tru。在这里,您可以向 Twig 添加任何变量,并且在该过程中应可供 twig 访问。 |
5 | onTwigSiteVariables 在此过程中,您将按顺序看到 Twig 方法中的完整站点模板。此外,您可以在此过程中向 Twig 添加任何变量。 |
集合事件钩子
下表列出了一个集合事件钩子。
序号 | 事件和描述 |
---|---|
1 | onCollectionProcessed 在本节中,一旦过程完成,您可以控制集合。 |
页面事件钩子
下表列出了页面事件钩子的集合。
序号 | 事件和描述 |
---|---|
1 | onBuildPagesInitialized 此事件可用于插件控制内容和缓存结果。一旦激活此事件,页面将被回收。当缓存过期或需要刷新时,就会发生这种情况。 |
2 | onBlueprintCreated 此事件有助于处理和管理表单。 |
3 | onPageContentRaw 在此过程中,当找到页面时,页眉已固定,但内容未固定。您将看到 Grav 系统中每个页面的触发情况。如果您已清除缓存或正在清除缓存,则会发生此事件。 |
4 | onPageProcessed 一旦页面被测试和修复,Grav 系统中的每个页面都会被忽略。在这种情况下,性能无关紧要,因为它不会在缓存页面上播放。 |
5 | onPageContentProcessed 一旦页面的 content() 技术修复了页面内容,您就可以看到此事件被忽略了。如果您想对后固定内容执行操作,此事件很有用,但请确保结果已缓存。 |
6 | onFolderProcessed 一旦文件夹被测试和修复,Grav 系统中的每个文件夹都会被忽略。在这种情况下,性能无关紧要,因为它不会在缓存页面上播放。 |
Grav - 管理员介绍
Grav 管理面板插件是 Grav 的 Web 图形用户界面 (GUI)。它可以轻松创建和修改页面。这是一个可选插件,为了有效工作,Grav 并不会完全依赖于它。管理员提供了有限的视图,以便轻松使用 Grav。
功能
以下是管理面板的功能:
启用或禁用插件管理器列表中存在的插件。
您可以轻松创建、编辑、复制和删除页面。
最新的页面更新列表显示在仪表板上。
只需单击一下即可轻松查看最新的可用更新。
使用搜索框从列表中查找特定页面。
它具有忘记密码的功能。
可以使用拖放方法上传媒体文件。
允许在普通模式和专家模式下通过 yaml 或表单进行编辑。
仪表板包含网站活动、最新的页面更新和维护状态。
它包含基于 Ajax 的备份和清除缓存功能。
它包含站点和系统配置管理。
由 GPM 提供支持的新插件和主题安装。
在用户登录期间提供自动密码加密功能。
它提供代码编辑器,该编辑器使用即时的 Grav 提供的预览功能突出显示强大的语法。
可以使用主题管理器完成已安装主题的列表和配置。
它还管理已登录的用户。
安装
要访问管理员插件,我们需要运行**最新版本的 Grav**。您可以在 CLI(命令行界面)中运行以下命令。
$ bin/gpm selfupgrade -f
**selfupgrade** 用于将 Grav 更新到最新可用版本。**-f** 用于刷新 GPM(Grav 包管理器)索引。
我们需要安装**admin**、**form**、**email** 和**login** 插件才能使您的管理员插件正常运行。由于所有插件都有依赖项,因此在安装管理员插件时,您需要同意安装其他插件的提示;这些插件可通过 GPM(Grav 包管理器)获得。我们将在章节Grav - GPM中详细了解 GPM。
以下命令用于使用命令提示符安装管理员插件。
$ bin/gpm install admin
手动安装
我们可以通过分别下载以下插件来手动安装管理面板:
下载所有插件后,解压缩所有 zip 文件并存储在**<your_folder_name>/user/plugins** 文件夹中。在 Plugin 文件夹中,您可以使用唯一名称存储插件;名称应与插件的功能相关。文件夹可以重命名为**admin/**、**email/**、**form/** 和**login/**。必须将所有四个插件一起存储在 Plugin 文件夹中;否则,管理面板将无法正常工作。
创建用户
我们可以使用命令行界面创建用户帐户。使用以下命令创建用户帐户。
$bin/grav newuser
或者,您也可以通过编写以下代码行来手动创建用户帐户:
email: [email protected] access: admin: login: true super: true site: login: true fullname: 'Tutorials Point' title: tp password: 'Password'
将上述代码行保存到**<your_folder_name>/user/account/admin.yaml** 文件中。您用来保存上述代码的名称将是您的登录名**用户名**,即 admin。您可以根据您的要求编辑**email**、**fullname**、**title** 和**password**。
使用
您可以通过将浏览器指向**localhost/<your_folder_name>/admin** 来访问管理面板,您将看到如下所示的屏幕。您可以在 yaml 文件中设置**用户名**和**密码**,如**创建用户**部分所述。
Grav - 管理员控制面板
在本节中,我们将学习 Grav 中的**管理面板仪表盘**。仪表盘充当 Grav 管理面板插件信息的中枢神经系统。您可以检查**流量统计**、**创建新备份**、**Grav 更新**、**维护信息**,查看最新的页面更新,并可以使用此单个页面清除 Grav 的缓存。
**步骤 1** - 您可以为用户指定权限并根据需要更改**仪表盘**的内容。仪表盘的屏幕将类似于以下屏幕截图。
**步骤 2** - 您现在将在仪表盘中看到**缓存和更新检查**的功能。
您将在仪表盘菜单顶部看到两个选项卡。
- 清除缓存
- 检查更新
清除缓存
它指定删除所有缓存内容,包括图像和资源的缓存。
您可以在下拉菜单中看到更多功能,如下所示。
**所有缓存** - 它指定删除所有缓存
**仅限资源** - 它指定仅删除资源的缓存。
**仅限图像** - 它指定仅删除图像的缓存。
**仅限缓存** - 它定义为仅删除缓存。
检查更新
此选项卡指定检查站点的更新。如果可用新更新,您将在仪表盘上收到通知。您将收到受支持的插件、主题甚至 Grav 的更新。
维护和统计
此部分允许您了解有关您站点的重要的信息。
维护
此部分为您提供 Grav 功能完全最新的百分比图表。您将在“维护和统计”部分上方看到所需更新的通知。
**更新** - 一旦有新更新可用,将出现“更新”按钮。接下来,您可以点击它并更新您的插件和主题。您会在通知栏中看到**立即更新 Grav** 按钮,该按钮会更新 Grav 的核心部分。
**备份** - 在此部分,您可以看到显示您多久没有备份站点的图表。这可以通过生成和下载 zip 文件来执行,将其保存为站点的备份数据。
统计
它显示了过去一天、一周和一个月内接收到的站点访问者流量的简单快速查看图表。它显示按星期几分开的条形图。
**步骤 3** - 接下来,您将看到如下所示的最新页面更新的详细信息。
此部分允许您了解有关 Grav 站点中最新修改的页面内容的更多信息。接下来,每次刷新页面时,它都会为您生成最近更新的列表。
您可以点击列表中页面的**标题**;这将引导您跳转到管理部分的页面编辑器。
**管理页面**按钮将引导您跳转到管理面板的页面。
Grav - 配置系统
在本节中,我们将学习 Grav 管理面板中的**配置系统**。您可以使用配置页面直接配置站点系统的设置。此外,您将看到服务器属性的简要说明,包括 PHP、服务器环境以及其他几个组件,这些组件会调节站点的性能。
“系统”选项卡允许您修改** /user/config/system.yaml** 文件中的设置。这会影响 Grav 操作的许多主要系统相关功能。设置可以分为不同的部分,向您显示 Grav 性能的不同功能。
以下是系统选项卡中显示的**配置部分**的详细列表:
内容
在本节中,您可以修复站点的**内容**处理的基本属性,如下所示。
**主页** - 指定要为您的站点显示的主页。
**默认主题** - 显示站点的默认主题。
**处理** - 控制页面的处理方式。可以按页面设置,而不是全局设置。
**时区** - 设置服务器中的默认时区。
**短日期格式** - 显示短日期格式。
**长日期格式** - 显示长日期格式。
**默认排序** - 使用此顺序在列表中显示页面。
**默认排序方向** - 指定列表中页面的方向。
**默认页面计数** - 定义列表中的最大默认页面计数。
**基于日期的发布** - 它会根据日期自动发布文章。
**事件** - 它指定启用或禁用事件。禁用将损坏插件。
**重定向默认路由** - 它定义默认路由并自动重定向到页面。
语言
您可以在此区域设置**多语言功能**,如下所示。
**支持的语言** - 它指定用逗号分隔的两个字母的语言代码列表,例如:en、fr、de。
**启用翻译** - 在 Grav、插件和扩展中启用翻译。
**翻译回退** - 如果不存在活动语言,它指定替代支持的翻译。
**部分中的活动语言** - 您可以在该区域存储活动语言。
**主页重定向包含语言** - 根据需要,它在主页重定向(/en)中包含语言。
**主页重定向包含路由** - 它指定重定向管理员主页根目录。
**从浏览器设置语言** - 它指定浏览器的语言。
**覆盖区域设置** - 它指定覆盖区域设置。
HTTP 标头
此部分用于设置**HTTP 标头**选项。此设置有助于基于浏览器的缓存和优化。
**过期时间** - 定义过期时间并以秒为单位设置值。
**上次修改时间** - 设置上次修改标头,这有助于优化代理和浏览器缓存。
**ETag** - 定义**e 标记标头**以识别已修改的页面。
**Vary Accept Encoding** - 您应将 Vary: HTTP 标头排列为 Accept。这将有利于代理上的缓存。
Markdown
在本节中,我们将学习 Grav 如何管理**Markdown**及其功能以启用 Markdown Extra。它帮助用户并构成 Grav 页面内容的大部分。
**Markdown Extra** - 它指定对 Markdown Extra 的默认支持。
**自动换行** - 它指定 Markdown 中的换行符。
**自动 URL 链接** - 它指定将 URL 转换为 HTML 超链接。
**转义标记** - 它指定将标记标签转换为 HTML 对象。
缓存
在本节中,您可以配置站点的缓存功能。Grav 结合了缓存功能,帮助为用户构建最快的平面文件 CMS 选项。
**缓存** - 这指定全局切换**开启/关闭**以**启用/禁用** Grav 缓存。
**缓存检查方法** - 这定义了文件、文件夹和无的缓存检查方法。
**缓存驱动程序** - 这指定为用户选择缓存驱动程序。 *自动检测* 缓存驱动程序被认为是最佳的。
**缓存前缀** - 这指定 Grav 密钥一部分的标识符。仅在需要时才更改它,否则不要更改它。
**生存期** - 这定义了缓存生存期(以秒为单位),**0=无限**。
**Gzip 压缩** - 为提高性能,启用 Grav 页面的 Gzip 压缩。
Twig 模板
在本节中,Grav 突出显示其**Twig 模板**功能。您可以在此处配置 Twig 缓存、调试和修改跟踪设置。
**Twig 缓存** - 这指定控制 Twig 缓存系统。启用时性能最佳。
**Twig 调试** - 这定义了不加载 Twig 调试器扩展的选项。
**检测更改** - 对 Twig 模板所做的任何更改都将自动重新编译 Twig 缓存。
**自动转义变量** - 所有变量都会**自动转义**;这可能会损坏您的站点。
资源
此部分用于处理资源,包括 CSS 和 JavaScript 资源,如下所示。
**CSS 管道** - 将多个 CSS 资源集成到单个文件中。
**CSS 压缩** - 在管道处理过程中,CSS 会被压缩。
**CSS 压缩 Windows 覆盖** - 默认情况下设置为 False,它定义 Windows 平台的压缩覆盖。
**CSS 重写** - 在管道处理过程中重写 CSS 相对 URL。
**JavaScript 管道** - 将多个 JavaScript 资源集成到单个文件中。
**JavaScript 压缩** - 在管道处理过程中,JS 会被压缩。
**启用资源上的时间戳** - 启用资源上的时间戳。
**集合** - 资源集合被单独添加。
错误处理程序
在站点开发期间,此部分对于管理 Grav 错误报告非常有用。
**显示错误** - 显示完整的回溯式错误页面。
**记录错误** - 错误日志将显示到** /logs** 文件夹中。
Debugger
这类似于错误处理,调试工具集成在 Grav 中以查找和排除错误。
**调试器** - 启用调试器及其设置。
**调试 Twig** - 启用 Twig 模板调试器。
**关闭连接** - 在调用**onShutdown()**之前,需要关闭连接。
媒体
此部分用于管理 Grav 的**媒体**内容。您可以在此处配置图像质量、文件上传大小和许多媒体处理选项。
**默认图像质量** - 在缓存或重新采样图像时使用默认图像质量。
缓存所有图片 − 所有图片都将通过 Grav 的缓存系统处理,即使不包含媒体操作。
图片调试水印 − 您可以在显示图像叠加层的同时指示图像的像素深度,例如,处理视网膜屏。
文件上传限制 − 定义最大上传大小(以字节为单位)(0 为无限大)。
启用媒体时间戳 − 根据最后修改日期为每个媒体项目添加时间戳。
会话
以下功能可帮助您启用会话支持。
启用 − 指定 Grav 中的会话支持。
超时 − 指定会话超时时间(以秒为单位)。
名称 − 指定会话cookie的名称,由标识符开发和应用。
高级
在本节中,您将看到高级系统选项。
绝对 URL − 指定base_url的绝对或相对 URL。
参数分隔符 − 您可以在参数分隔符的帮助下更改 Windows 上的 Apache。
Grav - 站点配置
本章将学习如何在 Grav 的管理面板中配置站点。您可以直接使用“配置”页面配置站点系统的设置。“站点”选项卡允许您修改/user/config/system.yaml 文件中的设置。此选项卡允许您修改影响站点相关功能(例如站点名称、默认作者等)的选项和字段。
以下是您在“站点”选项卡中可以看到的不同配置设置。
默认
在此区域,您可以设置基本属性来管理站点的內容。在这里,您可以设置多个内容显示选项,例如主页、默认主题等等。
站点标题 − 指定站点的标题。
默认作者 − 指定在主题或页面内容中使用的默认作者姓名。
默认邮箱 − 指定主题或页面中的默认电子邮件地址。
分类法类型 − 指定您在页面中使用的分类法类型。
页面摘要
页面摘要能够向您展示页面内容的小预览。您可以使用分隔符定义页面中摘要内容的“截止”点。
启用 − 指定是否启用页面摘要。
摘要大小 − 定义用作页面内容摘要的字符数。
格式 − 短使用分隔符的第一次出现,长忽略摘要分隔符。
分隔符 − 指定摘要分隔符。默认值为“===”。您可以在页面摘要中使用它,并在段落开头之后添加它。
元数据
元数据在页面中起着重要作用,并可以改善您的搜索引擎优化 (SEO)。您可以在此处设置多个元数据属性,以便您的链接可以根据需求出现在多个搜索引擎和社交媒体信息流中。
这指定了默认的元数据值,稍后您可以进行修改。
重定向和路由
这允许您设置到站点的其他页面的重定向和路由。
自定义重定向 − 定义指向其他页面的路由。标准正则表达式的替换是有效的。
自定义路由 − 指向其他页面的别名路由。标准正则表达式的替换是有效的。
Grav - 管理面板页面
本章将了解 Grav 中的管理面板页面的工作原理。页面提供了一种轻松创建、编辑或删除站点内容的方法。在管理面板页面中,您可以查看为您的站点创建的页面列表,还可以为您的站点创建新的模块化或非模块化页面。
添加新页面
您会看到在页面管理面板顶部有三个按钮,如下面的屏幕截图所示。
返回 − 返回管理页面的仪表板。
添加页面 − 创建新的非模块化内容。
添加模块 − 创建新的模块化内容。
添加页面
它为您的站点创建非模块化页面,其中包含各种字段,例如标题、文件夹名称、父根等。
单击添加页面按钮后,将出现一个弹出窗口,如下所示:
它包含以下字段:
页面标题 − 在此处输入页面的标题。
文件夹名称 − 用于输入页面的文件夹名称,或者在您输入标题后会自动生成名称。
父页面 − 为您新创建的页面设置父页面。
页面文件 − 将选定的主题模板显示到页面。
可见 − 通过将其设置为自动、是或否,使页面在导航栏中可见。
在字段中填写所有信息后,单击继续按钮。它将重定向您到页面编辑器。
添加模块化页面
模块化页面能够从其子页面创建单个页面。它能够从模块化内容页面构建复杂的单页面布局。
单击添加模块按钮后,将出现一个弹出窗口,如下所示:
窗口包含以下字段:
页面标题 − 在此处输入模块化页面的标题。
文件夹名称 − 用于输入页面的文件夹名称,或者在您输入标题后会自动生成名称。
页面 − 为您新创建的模块化子页面设置父页面。
模块化模板 − 选择要为模块化页面显示的特定模板。
在字段中填写所有信息后,单击继续按钮。它将重定向您到页面编辑器。
页面列表
此列表显示为站点创建的页面。
在这里,您可以轻松访问您创建的页面并进行编辑。
单击任何页面的标题,它将重定向您到页面编辑器进行编辑。
页面右侧的 X 图标用于删除页面。
过滤器框用于查找您要搜索的页面。它根据类型过滤页面,以便仅显示模块化、可见和/或可路由的页面。
搜索框用于在您知道页面确切名称时查找页面。
当您直接将鼠标悬停在页面左侧的图标上时,它将显示当前状态,即页面 . 可路由 . 可见 . 已发布,这意味着该页面可以通过 URL 查看,并将显示在导航菜单中。
单击列表中显示的页面后,您将看到以下屏幕。
在上面的屏幕中,您可以选择编辑页面、添加内容或向页面添加图像。“选项”选项卡包含发布、分类法和站点地图选项,我们将在页面编辑器选项章节中学习。“高级”选项卡包含页面的高级选项,例如设置、排序和覆盖,这些将在页面编辑器高级章节中介绍。
Grav - 页面编辑器选项
本章将学习 Grav 管理面板中的页面编辑器选项。这是一个动态文本编辑器,允许您创建页面内容。此外,您还可以向页面添加媒体文件。您可以看到下面显示的选项选项卡的功能。
选项选项卡包含两个部分:
- 发布
- 分类法
发布
此部分用于设置发布和取消发布页面的日期和时间。您可以完全控制要发布或取消发布的内容,并且可以为特定页面创建元数据值。
发布部分包含以下字段:
已发布 − 默认情况下,页面设置为是,即已发布。通过选择否,您可以取消发布页面。
日期 − 设置页面的日期和时间。
发布时间 − 设置自动发布页面的日期和时间。
取消发布时间 − 设置自动取消发布页面的日期和时间。
元数据 − 设置将在所有页面上显示的元数据值。
分类法
在此部分,您可以显示页面上的类别并配置页面及其结构属性。
分类法部分包含以下字段。
类别 − 设置页面的类别。它有助于对内容进行排序和过滤。
标签 − 提供有关页面内容的信息。它有助于组织和过滤内容。
Grav - 页面编辑器高级选项
页面编辑器是一个文本编辑器,也管理页面;这允许您创建内容,包括媒体文件、发布和分类法选项、设置和主题特定选项。以下屏幕截图显示了编辑器页面的“高级”选项卡。
“高级”选项卡包含三个部分:
设置
排序
覆盖
设置
设置部分处理页面的各种选项。在这里,您可以设置页面的模板,设置页面的父页面,更改页面所在的文件夹名称。
设置部分包含以下字段:
文件夹数字前缀 − 设置数字以提供手动排序。
文件夹名称 − 输入页面所在的文件夹名称。
父级 − 为您的页面设置根目录,或者一些页面显示为子页面。
页面文件 − 将主题模板设置为要显示的页面。
主体类 − 输入应用于页面主体的类名。
排序
此部分用于按特定顺序设置非编号文件夹。
按住四叉箭头并将其移动到所需位置以重新排列页面的特定顺序。
覆盖
覆盖选项为页面提供额外功能,例如缓存、导航可见性、将slug设置为与基于文件夹名称设置的默认slug不同的值。
覆盖部分包含以下字段。
菜单 − 设置用作菜单的名称。如果没有设置,则将使用标题。
Slug − 可以通过此 slug 变量设置页面的 URL 部分。
页面重定向 − 设置页面 URL 以将其重定向到不同的 URL。
处理 − 您希望在页面内容中使用的处理。
默认子类型 − 为子页面设置页面类型为默认。
可路由 (Routable) − 设置页面以检查其是否可以通过 URL 访问。
缓存 (Caching) − 设置页面的缓存。
可见性 (Visible) − 指定页面是否在导航中可见。
显示模板 (Display Template) − 为要显示的页面设置模板。
Grav - 蓝图
蓝图 (Blueprints) 是关于资源(信息来源)的元数据信息。它有两个用途:
- 首先是资源标识本身。
- 其次是关于表单。
这些完整的信息保存在每个插件或主题中存在的blueprints.yaml文件中。
资源标识 (Resource Identity)
在blueprints.yaml文件中,为每个主题和插件定义了标识。除非蓝图完美格式化和编译,否则资源不会添加到 Grav 存储库中。
蓝图示例 (Blueprints Example)
name: plugin name version: 0.6.0 description: Adds an advanced plugin to manage your site icon: empire author: name: Team Grav email: [email protected] url: http://getGrav.org homepage: https://github.com/getGrav/Grav-plugin-assets keywords: assets, plugin, manager, panel bugs: https://github.com/getGrav/Grav-plugin-assets/issues readme: https://github.com/getGrav/Grav-plugin-assets/blob/develop/README.md license: MIT dependencies: - form - email - login form: validation: loose fields: Basics: type: section title: Basics underline: false enabled: type: hidden label: Plugin status highlight: 1 default: 0 options: 1: Enabled 0: Disabled validate: type: bool
以下一些属性是可选的,有些用于提供您的标识和资源。
序号 | 属性和说明 (Properties & Description) |
---|---|
1 | name* 提及资源的名称。 |
2 | version* 指定资源的版本。 |
3 | description* 简要描述资源。字数不应超过 200 个字符。 |
4 | icon* 指定用于开发新主题或插件的图标库。 |
5 | author.name* 指定开发者的姓名。 |
6 | author.email(可选) 指定开发者的电子邮件地址。 |
7 | author.url(可选) 指定开发者的主页 URL。 |
8 | homepage(可选) 指定为您的资源分配的主页 URL。 |
9 | docs(可选) 指定您为资源编写的文档链接。 |
10 | demo(可选) 指定演示资源的链接。 |
11 | guide(可选) 指定您的资源的操作指南或教程链接。 |
12 | keywords(可选) 指定与您的资源相关的关键字列表。 |
13 | bugs(可选) 指定可以报告问题或错误的 URL。 |
14 | license(可选) 指定您的资源许可证,例如 MIT、GPL 等。 |
15 | dependencies(可选) 指定插件或主题所需的依赖项名称。 |
以下是登录插件蓝图示例:
name: Login version: 0.3.3 description: Enables user authentication and login screen. icon: sign-in author: name: Team Grav email: [email protected] url: http://getGrav.org keywords: admin, plugin, login homepage: https://github.com/getGrav/Grav-plugin-login keywords: login, authentication, admin, security bugs: https://github.com/Getgrav/Grav-plugin-login/issues license: MIT
表单 (Forms)
如果您希望主题或插件可以直接从管理界面配置选项,则可以使用表单填充blueprints.yaml文件。此资源的一部分可以通过管理插件 (Admin Plugin) 配置,该插件由表单 (Forms) 元数据定义。
以下是 Archives 插件的archives.yaml文件示例。
enabled: true built_in_css: true date_display_format: 'F Y' show_count: true limit: 12 order: by: date dir: desc filter_combinator: and filters: category: blog
这些是插件的默认设置。要无需使用管理插件即可配置它们,用户必须将此文件复制到/user/config/plugins/archives.yaml文件夹并进行更改。您可以正确提供archives.yaml文件;您可以选择从用户界面更改管理界面中的设置。
保存更改后,它将自动写入<your_folder_name>/user/config/plugins/archives.yaml。
Archives 插件的blueprint.yaml文件包含如下所示的结构:
name: Archives version: 1.3.0 description: The **Archives** plugin creates links for pages grouped by month/year icon: university author: name: Team Grav email: [email protected] url: http://getGrav.org homepage: https://github.com/getGrav/Grav-plugin-archives demo: http://demo.getGrav.org/blog-skeleton keywords: archives, plugin, blog, month, year, date, navigation, history bugs: https://github.com/getGrav/Grav-plugin-archives/issues license: MIT form: validation: strict fields: enabled: type: toggle label: Plugin status highlight: 1 default: 1 options: 1: Enabled 0: Disabled validate: type: bool date_display_format: type: select size: medium classes: fancy label: Date Format default: 'jS M Y' options: 'F jS Y': "January 1st 2014" 'l jS of F': "Monday 1st of January" 'D, m M Y': "Mon, 01 Jan 2014" 'd-m-y': "01-01-14" 'jS M Y': "10th Feb 2014" limit: type: text size: x-small label: Count Limit validate: type: number min: 1 order.dir: type: toggle label: Order Direction highlight: asc default: desc options: asc: Ascending desc: Descending
以下是archive.yaml中存在的表单元素。
开关 (Toggle)
enabled: type: toggle label: Plugin status highlight: 1 default: 1 options: 1: Enabled 0: Disabled validate: type: bool
选择 (Select)
date_display_format: type: select size: medium classes: fancy label: Date Format default: 'jS M Y' options: 'F jS Y': "January 1st 2014" 'l jS of F': "Monday 1st of January" 'D, m M Y': "Mon, 01 Jan 2014" 'd-m-y': "01-01-14" 'jS M Y': "10th Feb 2014"
文本 (Text)
limit: type: text size: x-small label: Count Limit validate: type: number min: 1
根元素Enabled、date_display_format和limit是选项。此根元素中存在的字段决定了类型、大小、标签、默认值和选项。根据字段类型,其他字段可能会改变;例如,选择字段需要选项列表。
排序方向 (Order direction)
order.dir: type: toggle label: Order Direction highlight: asc default: desc options: asc: Ascending desc: Descending
此字段包含嵌套选项。在plugins/admin/themes/Grav/templates/forms/fields中可以使用许多字段类型。正如我们在archive.yaml文件中看到的,表单验证设置为严格模式。当验证设置为严格模式时,您必须为所有选项添加蓝图表单,否则在保存时会弹出错误。当您只想自定义两个字段到管理界面时,可以将form.validation设置为宽松模式。
下表简要解释了与上述表单元素相关的字段。
序号 | 字段和说明 (Field & Description) |
---|---|
1 | 类型 (Type) 指示字段类型。 |
2 | 大小 (Size) 指定字段的大小。 |
3 | 标签 (Label) 为字段指定标签。 |
4 | 验证 (Validate) 它验证字段的类型和字段中输入的最小长度。 |
5 | 默认 设置默认字段。 |
6 | 选项 指定选项列表。 |
7 | 类 (Classes) 指定字段的类。 |
管理界面中可用的表单字段 (Form Fields available in the admin)
有很多内置的表单字段可供插件和主题使用,也可以创建自己的表单字段。下表列出了可用的表单字段:
常用表单字段 (Common form fields)
序号 | 字段和说明 (Field & Description) |
---|---|
1 | 复选框 (Checkbox) 显示单个复选框。 |
2 | 复选框列表 (Checkboxes) 显示复选框列表。 |
3 | 日期 (Date) 包含日期字段。 |
4 | 日期时间 (Datetime) 包含日期和时间字段。 |
5 | 电子邮件 (Email) 包含带验证的电子邮件地址字段。 |
6 | 密码 (Password) 包含密码字段,以点格式显示。 |
7 | 隐藏 (Hidden) 包含隐藏输入字段。 |
8 | 单选按钮 (Radio) 允许从列表中选择一个选项。 |
9 | 选择 (Select) 此字段包含一些选项。 |
10 | 间隔符 (Spacer) 向表单添加标题、文本或水平线。 |
11 | 文本 (Text) 包含普通文本字段。 |
12 | 文本区域 (Textarea) 包含多行文本输入。 |
特殊表单字段 (Special form fields)
序号 | 字段和说明 (Field & Description) |
---|---|
1 | 数组 添加多个键值行。 |
2 | 忽略 (Ignore) 删除未使用的字段。 |
3 | 列 (Columns) 将表单分成多列。 |
4 | 列 (Column) 显示单个列。 |
5 | 日期格式 (Dateformat) 设置日期和时间格式。 |
6 | 显示 (Display) 显示文本值,没有任何输入值。 |
7 | 前置内容 (Frontmatter) 页面以原始格式显示。 |
8 | 列表 (List) 显示项目列表,没有键。 |
9 | Markdown 显示 Markdown 编辑器。 |
10 | 页面 (Pages) 显示页面列表。 |
11 | 部分 (Section) 设置页面被分成多个部分,每个部分都有一个标题。 |
12 | Selectize 用于选择框。 |
13 | 标签 (Tabs) 设置被分成标签列表。 |
14 | 标签 (Tab) 标签字段用于提供标签。 |
15 | 分类法 (Taxonomy) 这是一个预先配置的选择,用于选择分类法。 |
16 | 开关 (Toggle) 它表示开关效果,指定开或关类型的输入。 |
Grav - 性能和缓存
在本章中,我们将了解 Grav 中性能和缓存的概念。
性能 (Performance)
性能是指系统性能,例如它是否可以处理系统上的较高负载以及修改系统以处理较高负载。
考虑以下与 Grav 性能相关的几点:
为了获得更好的 Grav 性能,您可以使用 PHP opcache 和 usercache。opcache 与 PHP 5.4 配合良好,usercache 与 PHP 5.5、PHP 5.6 和 Zend opcache 配合得更快。
SSD(固态硬盘)使用闪存,没有移动部件。有时缓存将存储在用户缓存中或存储为文件。因此,SSD 硬盘可以提供更好的性能。
虚拟机是在云计算技术下托管提供商的最佳方式。您可以指定资源而无需与物理设备交互。原生托管 (Native hosting) 比虚拟机更快。Grav 在虚拟机上运行得更好,但为了获得最佳性能,您可以使用原生托管选项。
Grav 具有更快的内存,其中其缓存使用大量内存,可在您的服务器上提供更好的性能。与其他平台相比,它使用的内存更少。
Grav 在共享服务器上使用共享托管 (shared hosting) 来共享资源。共享托管成本低廉,有时可能会导致服务器上的速度变慢。
多核处理器用于更快地处理多个任务。高级处理器比这些处理器更好,可以帮助用户完成任务。
缓存
通常,缓存是存储在缓存内存中的数据。缓存机制使 Grav 更快,浏览器可以从缓存中获取文件而不是原始服务器,从而节省时间和额外的网络流量。
Grav 使用 Doctrine Cache 库,它支持以下内容:
自动 (Auto)(默认)− 它自动使用默认选项。
文件 (File) − 它指定cache/文件夹中存在的缓存文件。
APC
XCache
Memcache
Redis
WinCache
默认情况下,Grav 使用自动设置。它将首先尝试 APC,然后尝试 WinCache、XCache,最后使用文件。
缓存类型 (Caching Types)
有 5 种类型的缓存:
将 YAML 配置缓存到 PHP 中。
页面对象的 Grav 核心缓存。
将模板文件作为 PHP 类进行 Twig 缓存。
媒体资源的图像缓存。
使用管道处理 CSS 和 jQuery 的资产缓存。
存储在/cache文件夹中的 YAML 配置的缓存。图像缓存将其图像存储在/images文件夹中。Grav 核心缓存的配置选项存储在user/config/system.yml文件中,如下所示:
cache: enabled: true check: method: file driver: auto prefix: 'g'
enabled选项通过将其设置为 true 来启用缓存。
method选项检查页面(例如文件或文件夹)中的更新。
driver选项指定不同类型的缓存选项,例如 Auto、File、APC、XCache、Memcache、Redis 或 WinCache。
prefix选项定义缓存前缀字符串。
Memcache 选项 (Memcache Options)
如果您使用的是memcached 服务器,则需要通过在user/config/system.yml 文件中使用memcache驱动程序添加一些额外的配置选项。这些选项可以在cache:组下定义。
cache: ... ... memcache: server:localhost port: 8080
Redis 选项 (Redis Options)
如果您使用的是redis,则需要通过在user/config/system.yml 文件中使用redis驱动程序添加一些额外的配置选项。这些选项可以在cache:组下定义。
cache: ... ... redis: server:localhost port: 8080
Twig 模板通过在user/config/system.yml文件中使用 twig 驱动程序使用其自身的缓存机制。
twig: cache: true debug: true auto_reload: true autoescape: false
它有一些选项,例如:
cache选项通过将其设置为 true 来启用 twig 缓存。
debug选项启用 twig 调试。
auto_reload选项用于通过将其设置为 true 来重新加载更改。
autoescape 选项用于自动转义 Twig 变量。
缓存和事件
启用缓存后可以使用事件。除OnPageContentRaw、OnPageProcessed、OnPageContentProcessed、OnTwigPageVariables 和 OnFolderProcessed 事件外,所有事件都可以启用缓存。这些事件可用于所有页面和文件夹,并且只能在事件处理时运行。这些事件无法在页面缓存后运行。
Grav - 调试和日志
在开发主题和插件时,调试和日志信息非常必要。Grav 使用如下所述的一些功能来使用调试信息。
PHP 调试栏
Grav 带有一个名为调试栏的工具来显示调试信息。默认情况下,此功能处于禁用状态。您可以全局启用它,也可以使用system.yaml文件在开发环境中启用。
debugger: enabled: true twig: true shutdown: close_connection: true
启用调试器设置为true后,您可以查看如下所示的调试栏。单击位于左上角的 G 符号。
在调试栏中,您可以查看右上角的整体内存使用情况和处理时间。它还包含多个选项卡,提供详细信息。
在“消息”选项卡中,您可以查看有助于调试 Grav 开发过程的消息,这些信息将通过$Grav['debugger']→addMessage($my_var)从代码发布到此选项卡。
在“时间线”选项卡中,您可以查看 Grav 定时的细分。
错误显示
它显示运行时有关块或页面的错误消息。在 Grav 中,您可以轻松识别错误并快速解决错误。以下是将在屏幕上显示的错误消息,如下面的屏幕截图所示。
在user/config/system.yaml文件中,您可以通过将其设置为 false 来禁用错误页面。
errors: display: false log: true
日志记录
日志记录用于报告来自库和应用程序的错误和状态信息。在 Grav 中,有一些重要的日志记录功能,如下所述。
$Grav['log']->info('My informational message'); $Grav['log']->notice('My notice message'); $Grav['log']->debug('My debug message'); $Grav['log']->warning('My warning message'); $Grav['log']->error('My error message'); $Grav['log']->critical('My critical message'); $Grav['log']->alert('My alert message'); $Grav['log']->emergency('Emergency, emergency, there is an emergency here!');
所有日志消息都将显示在Grav.log文件中,该文件位于<your_folder_name>/logs/Grav.log文件夹下。
Grav - 命令行界面 (CLI)
在本章中,我们将了解 CLI 在 Grav 中的工作方式。CLI 代表命令行界面,存储在bin/Grav中。它执行一些任务,例如清除缓存、创建备份副本等。
在不同平台上访问 CLI 的方式不同。在 Windows 上,您可以通过cmd访问;在 Mac 上,您可以通过Terminal访问;在 Linux 上,您可以使用 shell。在 Windows 上,您无法使用 UNIX 风格的命令。要使用这些命令,只需安装msysgit包,它提供 GIT 和 GIT BASH,并在 Windows 上提供 UNIX 风格的命令。
您可以使用以下命令列出 Grav 中可用的命令:
$ bin/Grav list
您可以看到如下屏幕截图中显示的可用命令:
创建新项目
使用 Grav 创建新项目非常简单。您可以使用 Grav 实例创建一个新项目。
打开您的终端或控制台,并导航到您的 Grav 文件夹。
$ cd ../ProjectFolder/grav
您的 Grav 将安装在 Web 服务器的根目录中。如果您想在 Grav 的根文件夹中创建一个名为 contact 的文件夹,则使用以下命令:
$ bin/Grav project-name ../webroot/ contact
它将下载所有必需的依赖项并创建一个新的 Grav 实例。
安装 Grav 依赖项
在安装依赖项时,Grav 会自动安装名为error插件、problems插件和antimatter主题的插件。您可以使用终端或控制台中的以下命令安装这些插件:
$ cd ../webroot/myproject $ bin/Grav install
您现在将在各自的文件夹中看到下载的插件,如下所示:
../webroot/ myproject/user/plugins/error
../webroot/ myproject/user/plugins/problems
../webroot/ myproject/user/themes/antimatter
清除 Grav 缓存
您可以删除存储在cache/文件夹中的文件和文件夹以清除缓存。要清除缓存,您可以使用以下命令:
$ cd ../webroot/myproject $ bin/Grav clear-cache
创建备份
在 Grav 中,您可以备份存储在根文件夹下的项目。因为它不使用数据库,所以备份没有难度。如果您想创建名为 myproject(../webroot/myproject)的项目的备份,请使用以下命令:
$ cd ../webroot/myproject $ bin/Grav backup
您将在backup/文件夹下看到创建的备份 zip 文件。
更新 Composer
您可以更新通过 Github 安装并使用基于 composer 的供应商包手动安装的 Grav composer。命令是:
$ bin/Grav composer
Grav - GPM (Grav 包管理器)
GPM 代表 Grav 包管理器,用于安装、更新、卸载和列出 Grav 存储库中可用的插件。GPM 使用命令行界面(如终端或 cmd)执行命令。
您可以非常轻松地访问 CLI。在 Windows 上,您可以通过cmd访问;在 Mac 上,您可以通过Terminal访问;在 Linux 上,您可以使用shell。在 Windows 上,您无法使用 UNIX 风格的命令。要使用这些命令,只需安装msysgit包,它提供 GIT 和 GIT BASH,并在 Windows 上提供 UNIX 风格的命令。
要列出 Grav 存储库中可用的命令,请键入以下命令:
$ bin/gpm list
您将收到以下信息:
您可以通过在命令行添加 help 来获取帮助,如下所示:
$ bin/gpm help install
您可以使用以下命令在命令行界面上查找 PHP 的版本:
$ php -v
它是如何工作的?
当您在命令行界面上运行命令时,GPM 会自动从GetGrav.org站点下载所需数据。它包括所有可用包的详细信息,并确定需要安装哪些包以及需要更新哪些包。
当您从存储库下载包时,Grav 存储库会在本地缓存,缓存生成后,将无法联系GetGrav.org服务器。
某些命令带有--force (-f)选项,该选项强制重新获取存储库。使用此选项,无需等待 24 小时周期才能清除缓存。
命令
您可以使用一些命令从 Grav 存储库下载可用的包。要使用该命令,请打开您的终端并导航到 Grav 文件夹的根目录,然后键入bin/gpm <command>。
索引
index 命令用于列出 Grav 存储库中可用的插件和主题。在您的终端中使用以下命令列出可用的资源。
$ bin/gpm index
每一行都定义了插件或主题的名称、slug、版本,并显示它是否已安装。
信息
info 命令用于显示有关包的信息,例如作者、版本、上次更新的日期和时间、包的存储库、包的下载链接、许可证信息等。
安装
顾名思义,install 命令从 Grav 存储库安装包所需的资源。
您可以使用以下命令安装所需的包。
$ bin/gpm install package_name
如果您尝试安装已安装的包,它会告知您下一步该怎么做。
如果您键入Y,它将覆盖已安装的包;如果您键入N,它将中止安装过程。
更新
update 命令会告知需要更新的包。如果所有包都是最新的,它将显示无需更新。
$ bin/gpm update
自我升级
self-upgrade 命令用于将 Grav 升级到最新版本。使用以下命令升级 Grav。
$ bin/gpm self-upgrade
如果您使用的是最新版本的 Grav,它将显示一条消息,提示“您已经在运行 Grav 的最新版本”,以及发布日期和时间,如下面的屏幕截图所示。
Grav - 开发
您可以使用不同的开发类型构建 Grav,例如Grav Core、Grav 插件、Grav 骨架和Grav 主题。
Grav Core
Grav 是一款现代化的 CMS,在其中编写内容很简单,构建页面更友好、更直观。Grav core 特别谈到了控制 Grav 所有内容的系统文件夹,它代表了 Grav 工作流和生命周期的特性。它主要关注可以以良好方式编写的页面。它关注您的内容,并将您的内容转换为可导航的网站。
Grav 插件
插件是一段软件,它提供了 Grav 核心功能最初未完成的增强功能。Grav 存储库中提供了许多插件,这些插件显示了网站上的功能。
考虑以下与 Grav 插件相关的几点:
Grav 本身是超级精简的,它只为您的网站添加必要的插件。
无需等待添加您想要的功能。要实现这一点,只需创建一个插件来扩展 Grav。
插件非常灵活和强大,可以显示站点地图、博客存档、搜索引擎,提供面包屑等。
Grav 骨架
Grav 骨架描述了一个示例网站,它包含 Grav Core、插件、页面、主题等所有内容。Grav 背后的最初想法是使网站的构建非常容易。开发网站所需的一切都放在user文件夹中。Grav 的骨架附带各种依赖项,例如插件、主题等,并存储在一个可以解压缩的包中。
Grav 主题
Grav 支持不同类型的主题,它们构成了 Grav 网站的组成部分。当您在系统上安装 Grav 时,它带有Antimatter主题。大多数主题都带有骨架包或示例页面。您可以在user/pages文件夹下看到示例页面,它提供了与骨架包类似的体验。
已安装的主题需要您的页面具有合适的Twig 模板。主题是主题和内容的组合,等于整个网站设计。您可以根据自己的设计创建自己的 Twig 模板引擎。
主题/插件发布流程
您可以注意添加到 Grav 存储库中已创建主题或插件的一些要点。
这是一个开源项目,由MIT许可。
它有README.md文件,其中指定了项目的安装过程和配置。
它包含一个**blueprints.yaml**文件,其中包含资源信息,可以在每个插件和主题的根目录中找到。
包含**CHANGELOG.md**文件,其中包含主题或插件的版本,并在每次更改文件时显示信息。
创建发行版是将已完成的主题或插件发布到**GitHub**的更好方法。如果没有发行版,则找不到您的插件或主题。
添加关于您的插件或主题的详细信息,并进行测试以确保其工作功能。
变更日志格式
**变更日志格式**使用Markdown语法编写,使内容和视觉显示分离。它使用简单的CSS,显示格式如下。
# vX.Y.Z ## 01/01/2015 1. [](#new) * New features added * Another new feature 2. [](#improved) * Improvement made * Another improvement 3. [](#bugfix) * Bugfix implemented * Another bugfix ...repeat...
GitHub 设置
**GitHub** 是一个最大的开放社区,它与用户共享您的项目,获取反馈并贡献托管在 GitHub 上的代码库。
将外部代码库的 URL 克隆到本地系统上的单个项目文件夹中。您可以将外部 Git 代码库克隆到新的代码库,如下面的步骤所示。
打开命令行并创建一个名为**“my_project”**的文件夹。
$ mkdir my_project $ cd my_project $ mkdir Grav $ cd Grav $ git clone https://github.com/getGrav/Grav.git $ git clone https://github.com/Grav_project/Grav-plugin-error.git $ git clone https://github.com/ Grav_project /Grav-plugin-problems.git $ git clone https://github.com/ Grav_project /Grav-theme-antimatter.git
这里**Grav_project**是一个代码库,您将在这里获得所有与该代码库相关的文件和文件夹,这些文件和文件夹将保存在** /my_project/Grav** 文件夹中。Grav 包含依赖项,例如**error** 插件、**problems** 插件和**Antimatter** 主题。
您可以使用**bin/Grav new-project**命令设置 Grav 的测试站点。我们需要从 Web 根目录开发克隆的代码。因此,我们必须使用**-s**标志对**bin/Grav new-project**命令进行符号链接相关部分。
在一个名为**.Grav/**的新文件夹中创建一个配置文件,以便使用该命令查找代码库,您需要在根目录下创建它。
$ cd $ mkdir .Grav $ vi .Grav/config
导航到您的 Grav 文件夹,并使用**-s**标志设置符号链接站点。
$ cd ~/Projects/Grav/Grav $ bin/Grav my-project -s ~/www/Grav
这里,**www**是根文件夹,**Grav**是您将创建测试站点的目录。
Grav - 生命周期
在本章中,我们将了解 Grav 的生命周期。Grav 生命周期决定了 Grav 的处理方式,以便通过插件扩展 Grav。下图显示了 Grav 生命周期过程的流程。
Grav 生命周期中的以下四个步骤:
PHP 版本
加载器类初始化
获取 Grav 实例
调用 Grav 进程
PHP 版本
它检查 PHP 的版本,以确保我们运行的 PHP 版本高于 5.4.0。
加载器类初始化
在第二步中,类加载器初始化。
获取 Grav 实例
如果不存在实例,则它调用`load()`方法并添加 Grav。
它初始化调试器值并添加到调试器。
它注册日志和错误处理程序。
它添加 uri、task、events、cache、session、plugins、themes、twig、taxonomy、language、pages、assets 和 base url。
它注册流和配置处理程序。
调用 Grav 进程
它初始化配置、Uri 对象、错误处理程序、调试器和会话。
初始化后,它开始缓冲输出。
它初始化时区和插件,并触发`onPluginsInitialized`事件。
接下来,它初始化主题并触发`onThemeInitialized`和`onTask[TASK]`事件。
它初始化资源并触发`onAssetsInitialized`事件。
它使用以下操作初始化 twig:
根据配置,它设置 twig 模板路径。
处理可用的语言模板。
接下来,它触发`onTwigTemplatePaths`事件。
加载程序链和 twig 配置已加载。
触发`onTwigInitialized`事件。
它加载 twig 扩展并触发`onTwigExtensions`事件。
它设置标准的 twig 变量。
接下来,它初始化页面。
它调用`buildPages()`方法。
如果缓存良好,则它从缓存加载页面。如果缓存不好,则调用`recurse()`方法。
在`recurse()`方法中触发`onBuildPagesInitialized`事件。
如果找到`.md`文件,则执行以下操作:
要加载文件详细信息,将调用`init()`方法。
它设置 filePath、modified 和 id。
调用`header()`方法初始化 header 变量。
调用`slug()`方法设置 URL slug。
调用`visible()`方法设置可见状态。
根据以 _(下划线) 开头的文件夹,设置`modularTwig()`。
稍后它将触发`onPageProcessed`事件。
如果找到文件夹,则递归`recurse()`其子项。
它触发`onFolderProcessed`事件。
调用`buildRoutes()`方法。
为所有页面初始化`taxonomy`
构建`route`表以进行快速查找。
触发`onPagesInitialized`和`onPageInitialized`事件。
将调试器 CSS/JS 添加到资源。
使用 Twig 的`processSite()`方法,我们得到输出。
触发`onTwigSiteVariables`事件。
获取页面的输出。
如果找不到页面或页面不可路由,则触发`onPageNotFound`事件。
所有 Twig 变量都设置在 twig 对象上。
根据文件/header/扩展信息设置模板名称。
调用`render()`方法。
返回 HTML 格式的文件。
它触发`onOutputGenerated`事件。
设置 HTTP 头。
显示输出
输出缓冲区被刷新到页面。
将触发`onOutputRendered`事件。
关闭与客户端的连接。
最后,它触发`onShutDown`事件。
当在页面上调用`content()`方法时,将发生以下生命周期。
将触发`onPageContentRaw`事件。
根据 Markdown 和 Twig 设置,它处理页面。
它触发`onPageContentProcessed`事件。
Grav - YAML 语法
**YAML** 代表**YAML Ain't Markup Language**,它包含人类可读的内容,通常用于配置文件、蓝图(资源的元数据信息)和页面设置。
功能
以下是 YAML 的特性:
与 XML 或 JSON 相比,YAML 较不复杂,并提供相同的特性。
它提供配置设置,而无需学习复杂的代码类型,如 CSS、JavaScript 或 PHP。
YAML 描述 YAML 文件的数据和内容,可以轻松翻译成多种语言类型。
YAML 的基本规则
YAML 有些基本规则用于减少多种语言和可编辑程序中的歧义。
YAML 文件必须以**.yaml**扩展名结尾。
YAML 必须区分大小写。
YAML 不支持使用制表符。它使用空格代替制表符,而空格并非在所有情况下都受支持。
YAML 的基本数据类型
YAML 支持一些基本数据类型,可以与编程语言一起使用,例如:
**标量** - 字符串或数字。
**序列** - 数组或列表。
**映射** - 散列或字典。
标量
标量是基本数据类型,在页面上使用字符串或数字来处理数据。它可以是**布尔属性**(是或否)、**整数值**(例如 2) 或**字符串**(例如单词、句子或网站标题)。
例如:
string: "Grav" integer: 10 float: 10.5 boolean: true
有时标量带有未加引号的值,如整数、浮点数或布尔值。字符串值使用标点符号,带有单引号或双引号,使用转义符来指定 ASCII 和 Unicode 字符。
序列
YAML 以数组或列表的形式表示序列。它使用列表中开头的破折号 (-) 定义每个项目,如下所示。
例如:
- Apple - Orange - Grapes
假设您想使用子项目定义嵌套序列,然后在子项目中的每个破折号前放置一个空格。
例如:
- - Apple - Orange - Grapes
如果您想要嵌套列表中的嵌套序列,则添加一些级别,如下所示:
例如:
- - - Apple - Orange - Grapes
映射
这是一种定义键及其值的方法。
例如,您可以为特定元素分配某个值,如下所示:
Sports: cricket
这里的 value 是“cricket”,它与名为“Sports”的键映射。您可以将此映射与序列一起使用来指定板球的项目列表;例如,我们将为 value “cricket” 定义一些玩家姓名,将姓名作为子项,并将**Sports: cricket**作为父项。
Sports: cricket - Sachin Tendulkar - Rahul Dravid - M S Dhoni
Grav - 表单
您可以使用此链接中提供的**form**插件创建一个表单。搜索表单插件并将其安装到您的 Grav 文件夹中。
您还可以使用命令**$ bin/gpm install Form**安装此插件。导航到 Grav 的根文件夹并输入此命令。它将自动下载表单插件并安装必要的依赖项。
创建简单的表单
您可以创建一个简单的表单,可以在页面 YAML 前端定义。以下是一个表单示例:
--- title: Contact Form form: name: contact fields: - name: name label: Name placeholder: Enter your name autofocus: on autocomplete: on type: text validate: required: true - name: email label: Email placeholder: Enter your email address type: email validate: required: true - name: message label: Message placeholder: Enter your message type: textarea validate: required: true - name: g-recaptcha-response label: Captcha type: captcha recatpcha_site_key: 6LelOg4TAAAAALAt1CjjjVMxFLKY8rrnednYVbr8 recaptcha_not_validated: 'Captcha not valid!' validate: required: true buttons: - type: submit value: Submit - type: reset value: Reset process: - email: subject: "[Site Contact Form] {{ form.value.name|e }}" body: "{% include 'forms/data.html.twig' %}" - save: fileprefix: contact- dateformat: Ymd-His-u extension: txt body: "{% include 'forms/data.txt.twig' %}" - message: Thank you for getting in touch! - display: thankyou ---
以上代码显示了一个带有姓名、电子邮件、消息和验证码字段的简单表单页面。填写表单后提交信息时,表单将通过向 YAML 前端添加**process**字段来进行处理,如代码所示。
**process**字段使用以下信息:
**email**选项使用两个字段,例如**from**字段指定电子邮件的发件人,**to**字段指定邮件的接收者。
**subject**使用**[feedback][entered mail]**选项,其中电子邮件发送到输入的电子邮件。
电子邮件的主体在主题文件夹中的**forms/data.html.twig**文件中指定。
表单输入数据存储在**user/data**文件夹下。模板在主题文件夹中的**forms/data.txt.twig**文件中定义。
在**thankyou/**子文件夹下创建一个子页面,当用户提交表单时,将重定向到该页面。
您可以使用表单插件的一些字段,如下表所示:
序号 | 字段和说明 (Field & Description) |
---|---|
1 | 验证码 这是一个反垃圾邮件字段,用于在计算中确定用户是否是人类。 |
2 | 复选框 (Checkbox) 它显示一个简单的复选框。 |
3 | 复选框列表 (Checkboxes) 它显示多个复选框。 |
4 | 日期和日期时间 这两个字段分别用于显示日期和日期及时间。 |
5 | 电子邮件 (Email) 这是一个带有验证的电子邮件字段。 |
6 | 隐藏 (Hidden) 它指定隐藏字段。 |
7 | 密码 (Password) 它指定密码字段。 |
8 | 单选按钮 (Radio) 它显示简单的单选按钮。 |
9 | 选择 (Select) 它提供选择字段。 |
10 | 间隔符 (Spacer) 它允许向表单添加标题、文本或水平线。 |
11 | 文本 (Text) 它显示简单的文本字段。 |
12 | 文本区域 (Textarea) 它显示简单的文本区域字段。 |
13 | 显示 (Display) 它显示文本或说明字段,而不是输入字段。 |
字段参数
每个字段都接受以下参数,这些参数可用于自定义表单中的外观。
序号 | 参数 & 描述 |
---|---|
1 | label(标签) 它定义标签字段。 |
2 | validate.required(验证.必填) 它使元素成为必填项。 |
3 | validate.pattern(验证.模式) 它指定验证模式。 |
4 | validate.message(验证.消息) 验证失败时显示此消息。 |
5 | type(类型) 它定义字段类型。 |
6 | default(默认值) 它定义默认字段类型。 |
7 | size(大小) 它显示字段大小,例如 large、x-small、medium、long、small。 |
8 | name(名称) 它定义字段名称。 |
9 | classes(类) 它使用带有 CSS 类的字符串。 |
10 | id(ID) 它定义字段 ID。 |
11 | style(样式) 它指定字段的样式。 |
12 | title(标题) 它定义字段的标题。 |
13 | disabled(禁用) 它确定字段是否处于禁用状态。 |
14 | placeholder(占位符) 这是一个简短的提示,在用户输入值之前显示在输入字段中。 |
15 | autofocus(自动聚焦) 它指定页面加载时输入元素应自动获得焦点。 |
16 | novalidate(不验证) 它指定提交表单时不应验证表单数据。 |
17 | readonly(只读) 它将字段确定为只读状态。 |
18 | autocomplete(自动完成) 当用户开始在字段中输入时,它会显示字段中的选项,并根据先前输入的值显示值。 |
某些字段包含特定参数,例如:
序号 | 参数 & 描述 |
---|---|
1 | 日期和日期时间 这些字段使用validate.min和validate.max设置最小值和最大值。 |
2 | spacer(间隔符) 它使用underline添加<hr>标签,使用text添加文本值,并使用title作为<h3>标签。 |
3 | select(选择) 它使用multiple参数添加多个值。 |
4 | select 和 checkboxes(选择框和复选框) 它使用options字段设置可用选项。 |
5 | display(显示) 它使用content参数显示内容。它将markdown设置为 true 以显示内容。 |
6 | captcha(验证码) 它使用recatpcha_site_key和recaptcha_not_validated参数。 |
关于验证码的说明
我们在名为g-recaptcha-response的字段下有验证码信息的代码,如下所示:
- name: g-recaptcha-response label: Captcha type: captcha recatpcha_site_key: 6LelOg4TAAAAALAt1CjjjVMxFLKY8rrnednYVbr8 recaptcha_not_validated: 'Captcha not valid!' validate: required: true
reCaptcha 用于保护您的网站免受垃圾邮件和滥用。它使用recatpcha_site_key选项并在您的网站上显示小部件。要使用 reCaptcha,只需参考reCaptcha 文档。如果 reCaptcha 不正确,则它将使用recaptcha_not_validated选项显示消息。
表单操作
电子邮件 (Email)
您可以在process字段下使用特定选项发送电子邮件,如下所示:
- email: from: "{{ config.plugins.email.from }}" to: "{{ config.plugins.email.to }}" subject: "Contact by {{ form.value.name|e }}" body: "{% include 'forms/data.html.twig' %}"
它使用电子邮件选项,该选项包括两个字段;from字段指定发件人的电子邮件地址,to字段使用电子邮件插件配置指定收件人的电子邮件地址。电子邮件字段还使用subject选项,其中发送到输入的电子邮件的主题为“[Contact by][输入的姓名]”,电子邮件正文在主题的forms/data.html.twig文件中定义。
重定向到其他页面
您可以使用process字段下定义的message和display选项重定向到另一个页面。
process: - message: Thank you for getting in touch! - display: thankyou
message选项设置单击提交按钮时应显示的消息。当用户提交表单时,它应重定向到另一个页面。在存储form.md文件的thankyou子文件夹下创建一个子页面。提交表单后,它将重定向到该页面并显示上述消息。
名为thankyou/formdata.md的子页面将具有以下内容。
--- title: Email sent cache_enable: false process: twig: true --- ## Your email has been sent!
提交表单后,插件会向用户发送电子邮件,数据将保存在data/folder下。
保存
它用于将数据保存到保存在user/data文件夹下的文件中。
例如:
process: - save: fileprefix: contact- dateformat: Ymd-His-u extension: txt body: "{% include 'forms/data.txt.twig' %}"
数据将以文本格式存储,扩展名为 txt。正文取自主题的templates/forms/data.html.twig文件。
以下屏幕显示了一个简单的表单:
Grav - 网络托管
托管,也称为网站托管,是维护和组织网站的过程,并通过万维网提供对网站的访问。简单来说,它是在互联网上为网站提供服务的平台。
Grav 支持不同类型的托管服务:
Rochen 网络托管
WireNine
Crucial 网络托管
Arvixe
SiteGround
Dreamhost
Rochen 网络托管
它可用于GetGrav.org和RocketTheme.com作为长期托管提供商。它使用 SSD 驱动器、Litespeed Web 服务器以及 Intel XEON 处理器来增强 Grav 的性能。它提供两种类型的选项;一个是共享托管,另一个是突发托管。
有关 Rochen 网络托管的更多信息,请单击此链接。
WireNine
WireNine 为 665 多个国家的客户提供可靠的网络托管服务。它使用 Intel Xeon E5 v3 CPU、DDR4 ECC RAM 和冗余 RAID SSD 存储来增强服务器的功能。它提供最大的可靠性和稳定性,以确保 100% 的正常运行时间。它包括优化的软件,例如 CloudLinux、Litespeed、MariaDB、PHP、Ruby、Python、Perl 等。
访问此链接以获取有关 WireNine 托管的信息。
Crucial 网络托管
这是另一种网络托管类型,它更注重速度和支持。它使用 SSD 驱动器、Litespeed Web 服务器以及 Intel XEON 处理器来增强 Grav 的性能。
您可以在此链接中获取有关 Crucial 网络托管的更多信息。
Arvixe
Arvixe 是一种网络托管类型,它以无与伦比的可靠性、质量和经济性相结合的方式提供网络托管。它因在网络托管领域提供良好的功能而赢得了众多网络托管奖项。
有关 Arvixe 网络托管的更多信息,请单击此链接。
SiteGround
它为 Joomla、WordPress、Magento 和其他 Web 应用程序提供托管解决方案。它的标语是精心打造的网络托管,它精心处理网络托管计划,并提供使您的网站运行速度更快的全新技术。
只需访问此链接即可获取有关 SiteGround 托管的信息。
Dreamhost
它通过为您的个人或业务相关的网络托管需求提供更多功能来提供一系列功能。它拥有超快的 SSD 和高达 64GB RAM 的全新专用服务器。
有关 Dreamhost 网络托管的更多信息,请单击此链接。
Grav - 服务器错误
服务器错误是由于 Grav 配置错误造成的。当服务器遇到内部错误或发生意外情况时,Grav 将无法提供服务并恢复页面。
如果服务器在生产模式下运行,为了向用户隐藏信息,会发生服务器错误消息。所有错误消息都记录在<您的文件夹名称>/logs/Grav.log文件夹下的Grav.log文件中。
以下是一些可能导致服务器错误的原因:
- 过时的配置
- 文件权限不正确
- 格式错误的配置文件
- Grav 未知的的文件系统更改
过时的配置
您可以刷新缓存以检查配置是否为最新。使用以下命令刷新缓存。
bin/Grav clear-cache
安装和配置问题
安装和配置问题包括:
- 配置问题
- 安装问题
- 系统要求
- 文件权限
Grav - 权限
一般来说,权限是在您的托管环境中允许执行某些操作的过程。权限包括对服务器上的文件的读取或写入访问权限,或编辑文件系统上的文件。Grav 是一个基于平面文件的 CMS,需要写入文件系统才能创建缓存和日志文件。
Grav 包含三种主要场景:
PHP/Web 服务器与编辑文件的用户使用相同的用户
此场景非常适合大多数共享托管设置以及本地开发。在专用 Web 主机上,我们不能认为这种方法足够安全。
PHP/Web 服务器使用不同的帐户,但使用相同的组
使用775和664权限使用用户和 PHP/Web 服务器帐户之间的共享组,您可以确保两个不同的帐户将对文件具有读/写访问权限。我们可以通过在根目录上设置umask 0002并设置正确的权限来创建新文件。
不同的帐户,手动修复权限
这种方法将具有不同的帐户,并更新文件的拥有权和权限,以确保 PHP/Web 服务器用户将对文件具有读/写访问权限。
以下是permissions-fixing shell 脚本的简单代码。您可以根据适用于设置的组编辑此文件。
#!/bin/sh chown joeblow:staff . chown -R joeblow:staff * find . -type f ! -path "./bin/" | xargs chmod 664 find . -type f -path "./bin/" | xargs chmod 775 find . -type d | xargs chmod 775 find . -type d | xargs chmod +s umask 0002
chown joeblow:staff用于将目录的组和用户更改为 joeblow 和 staff。
chown -R joeblow:staff *行将文件和子文件夹的所有权更改为 joeblow 和 staff。
find . -type f ! -path "./bin/" | xargs chmod 664行将所有文件的权限从目录设置为对其他人读取,对组和用户读取/写入。
find . -type f -path "./bin/" | xargs chmod 775行将所有文件的权限从目录设置为对其他人RX,对组和用户RWX。
umask 0002用于使用 664 和 775 权限创建新文件。