目录

Grav - 快速指南

Grav - Overview

Grav是一个基于平面文件的内容管理系统。 此系统不使用数据库来存储内容,而是使用文本(.txt)文件或markdown(.md)文件来存储内容。 平面文件部分指的是可读文本,它以简单的方式处理内容,这对开发人员来说很简单。

Grav由Rocket Theme团队开发。 它运行在PHP上,是一个开源的CMS,如Joomla,Wordpress或Drupal。

为什么格拉夫?

Grav现在是最快的平面文件内容管理系统。 使用Grav发布和管理内容更容易。 它允许开发人员通过将内容存储在文件(例如文本或降价文件)而不是数据库中来非常容易地处理内容。

Grav可以帮助您构建一个简单,易于管理和快速的站点。 它的成本低于数据库驱动的CMS,当您没有足够的资源时,它可用于文件处理的I/O.

Grav的特点

  • 它是一个快速,简单和强大的平面文件Web平台。

  • 它用于构建没有额外工具或HTML知识的网站。

  • 它使用文本文件或markdown文件来存储内容。

  • 它不使用数据库,因此这减轻了瓶颈的实例。

  • 它使用由Twig提供的基于PHP的模板,该模板直接解析为PHP,使其快速。

优势 (Advantages)

  • 它不是基于数据库CMS,因此它非常易于安装,并且可以在将文件上载到服务器时使用。

  • 它使用Markdown文本文件使事情变得简单。 使用此功能,内容将动态转换为HTML并显示在浏览器中。

  • 在安全性方面,Grav没有管理区域和数据库。 因此,没有机会将黑客入侵或在数据库中访问重要数据。

  • 您可以轻松备份所有文件以保留网站的备份副本,因为没有要备份的数据库。

  • 它是一个不需要更多时间学习的软件。

缺点 (Disadvantages)

  • 您可能遇到未经授权的用户可能直接从文件访问您的内容的实例,因为没有文件的数据库。

  • 使用Grav CMS构建复杂的网站很困难。

Grav - Installation

在本章中,我们将了解Grav的安装。 我们将讨论Grav的软件需求以及如何下载它。

Grav的软件要求

现在让我们了解Grav的软件需求。

Web Server

  • WAMP(Windows)
  • LAMP(Linux)
  • XAMP(多平台)
  • MAMP(Macintosh)
  • Nginx
  • Microsoft IIS

Operating System - 跨平台

Browser Support - IE(Internet Explorer 8+),Firefox,谷歌浏览器,Safari,Opera

PHP Compatibility - PHP 5.4或更高版本

Text Editors

  • Sublime Text(Mac/Windows/Linux)
  • Atom(Mac/Windows)
  • Notepad ++(Windows)
  • 蓝鱼(Mac/Windows/Linux)

下载Grav

单击此链接https://getgrav.org/downloads并按照下面给出的屏幕截图所示的步骤下载Grav。

Grav安装

将下载的Grav文件解压缩到您的Web服务器中。

安装向导

Grav的安装是一个非常简单的过程。 按照下面给出的Grav设置步骤。

  • 下载zip文件并将其解压缩到Web服务器或本地主机。 从要用于引用站点的当前名称重命名该文件夹。

  • 打开浏览器并导航到localhost/《your_folder_name》 ,您将被重定向到一个屏幕,显示you have installed Grav successfully如下面的屏幕截图所示。

Grav安装
  • Grav附带了一个示例页面,可帮助您入门。 在上面的屏幕截图中,您可以看到显示示例页面的主页链接。

Grav - Pages

在本章中,让我们研究一下Grav Pages 。 页面可以定义为站点的构建块。 页面结合了内容和导航; 这使得即使是没有经验的用户也能轻松完成工作。

首先,让我们知道如何创建一个简单的页面。 所有用户内容都将存储在user/pages/文件夹下。 将只有一个名为01.home文件夹。 文件夹的数字部分是可选的; 它表示页面的顺序(例如,01将在02之前出现),并明确告知Grav该页面应该在菜单中可见。

现在让我们看看如何创建一个新页面。

Step 1 - 在/user/pages/;下创建一个文件夹/user/pages/; 例如, 02.about 。关于以下屏幕截图所示。

Grav Pages

Step 2 - 在新创建的02.about文件夹中创建一个名为default.md的文件,其中包含以下内容。

---
title: About Us
---
# About Us Page!
This is the body of **about us page**.

上面的代码使用了下面简要介绍的一些Markdown语法。 您可以在Markdown章节中详细了解Markdown

  • ---指标之间的内容是Page Headers

  • Markdown #hashes语法表示将在HTML中转换为《h1》标题的标题。

  • **标记表示粗体文本或HTML中的《b》

Step 3 - 重新加载浏览器,您可以在菜单中看到新页面,如以下屏幕截图所示。

Grav Pages

页面类型

Grav Pages支持3种类型的页面 -

  • 标准页面。
  • 清单页面。
  • 模块化页面。

标准页面

标准页面是最基本的页面类型,例如博客文章,联系表单,错误页面等。默认情况下,页面被视为标准页面。 下载并安装Base Grav软件包后,您将受到标准页面的欢迎。 安装Base Grav包时,您将看到以下页面。

Grav Pages

清单页面

列表页面是标准页面的扩展,它具有对页面集合的引用。 设置列表页面的最简单方法是在列表页面下创建子页面。 博客列表页面就是一个很好的例子。

可以在Grav Downloads中找到包含列表页面的博客框架示例。 下面的屏幕截图显示了一个示例。

Grav Pages

模块化页面

模块化页面是列表页面的一种形式,它从其子页面构建单个页面。 这允许我们从较小的模块化内容页面构建非常复杂的单页面布局。 这可以通过从页面主文件夹中的多个模块文件夹构建模块化页面来实现。

使用模块化页面的单页骨架样本可以在Grav Downloads中找到。 下面的屏幕截图显示了一个示例。

Grav Pages

Folders

/user/pages文件夹将包含各自页面的内容。 /user/pages文件夹中的文件夹被Grav自动视为菜单,用于排序。 例如, 01.home文件夹将被视为主页。 订购也要保持,即01.home将在02.about之前。

您应该提供一个入口点,以便在您将浏览器指向站点的根目录时指定浏览器的去向。 例如,如果您在浏览器中输入http: home.alias默认需要别名为home/ ,但您可以通过更改home.alias配置文件中的home.alias选项来覆盖主位置。

文件夹名称前的下划线(_)被标识为Modular folders ,这是一种特殊的文件夹类型,仅用于模块化内容。 例如,对于诸如pages/02.about类的文件夹,slug将默认为about ,URL将为http://mysite.com/about。

如果文件夹名称没有数字前缀,则该页面被视为不可见,并且不会显示在导航中。 例如,if user/pages/ has /contact文件夹将不会显示在导航中。 通过将visible设置为true,可以在标题部分内的页面本身中覆盖它,如下所示,使其在导航中可见。

---
title: contact
visible: true
---

默认情况下,如果周围文件夹具有数字前缀,则导航中将显示页面。设置可见性的有效值为truefalse

Ordering

有很多方法可以控制文件夹的排序,其中一个重要的方法是设置页面配置设置的content.order.by 。 选项如下所示。

  • default - 文件系统可用于排序,即02.out之前的01.home。

  • title - 标题可用于在每页中定义的排序。

  • date - 订购可以基于每页定义的日期。

  • folder - 将删除由任何数字前缀(例如01.)组成的folder夹名称。

  • basename - Ordering基于没有数字顺序的字母文件夹。

  • modified - 也可以使用页面的修改时间戳。

  • header.x - 任何页眉字段都可用于排序。

  • manual - 可以使用order_manual变量排序。

  • random - 也可以random化您的订单。

通过提供content.order.custom配置设置的选项列表来明确定义手动订单。 您可以设置pages.order.dirpages.order.by选项以覆盖pages.order.by系统配置文件中的默认行为。

页面文件

页面文件夹内的页面应创建为.md文件,即Markdown格式文件; 这与YAML前面的事情有关。 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设置组成。 在上面的示例中,我们将标题和分类设置为博客页面。 这对---标记之后的部分是我们在网站上看到的实际内容。

摘要大小和分隔符

可以在page.summary()使用的page.summary()设置摘要的默认大小。 这对于只需要摘要信息而不是整页内容的博客非常有用。 您可以使用manual summary separator也称为summary delimiter :===并确保将其放在内容中,其上方和下方有空行,如下所示。

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.summary()引用时,将使用完整内容。

寻找其他页面

Grav具有名为find()功能,可以在该页面上查找另一个页面并执行操作。

例如,如果要列出特定页面上的所有公司位置,请使用以下降价规则 -

# 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 Syntax

Markdown语法定义为以易于阅读和易于编写的格式编写纯文本,后来将其转换为HTML代码。 标记语法中使用(*)或(`)等符号。 这些符号用于加粗,创建标题和组织您的内容。

要使用Markdown语法,必须在user/pages/02.mypage文件夹中创建.md文件。 在\user\config\system.yaml配置文件中启用Markdown语法。

Grav Markdown语法

使用Markdown语法有很多好处,其中一些如下。

  • 它易于学习,并且具有最少的字符。

  • 使用markdown时,出现错误的可能性很小。

  • 有效的XHTML输出。

  • 您的内容和视觉显示是分开的,因此不会影响您网站的外观。

  • 您可以使用任何文本编辑器或降价应用程序。

在以下部分中,我们将讨论在markdown中使用的HTML的主要元素。

Headings

对于每个标题,每个标题标签用#创建,即,从h1到h6,#的数量增加,如图所示。

	#my new Heading
	##my new Heading
	###my new Heading
	####my new Heading
	#####my new Heading
	######my new Heading

在浏览器中以localhost/Grav/mypage;打开.md文件localhost/Grav/mypage; 您将收到以下结果 -

Grav Markdown语法

注释 (Comments)

您可以使用以下格式编写注释。

<!—
   This is my new comment
-->

在浏览器中以localhost/Grav/mypage;打开.md文件localhost/Grav/mypage; 您将收到以下结果 -

Grav Markdown语法

横向规则

水平规则用于在段落之间创建主题中断。 您可以使用以下任何方法在段落之间创建中断。

  • ___ - 三个下划线

  • --- - 三个破折号

  • *** - 三个星号

在浏览器中以localhost/Grav/mypage;打开md文件localhost/Grav/mypage; 您将收到以下结果 -

Grav Markdown语法

正文复印件

正文Body copy可以定义为在标记语法中以正常格式编写文本,使用no (p)标记

例子 (Example)

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文件localhost/Grav/mypage; 您将收到以下结果 -

Grav Markdown语法

Emphasis

Emphasis是markdown语法中的书写格式,用于粗体,斜体或删除部分文本。 我们在下面讨论它们 -

Bold

可以使用两侧的两个(**)标志使一部分文本变为粗体。

Example

The newest articles from **Advance Online Publication (AOP)** and the current issue.

在这个例子中,我们必须将'Advance Online Publication (AOP)'这个词显示为粗体。

在浏览器中打开.md文件作为localhost/Grav/mypage ,您将收到以下结果 -

Grav Markdown语法

Italics

在单词的任一侧使用“_” (下划线)标记以使文本为斜体。

Example

The newest articles from _Advance Online Publication_ (AOP) and the current issues.

在这个例子中,我们必须用斜体“Advance Online Publication” (AOP)这个词。

在浏览器中以localhost/Grav/mypage打开.md文件。 这将给你以下结果 -

Grav Markdown语法

删除线(Strikethrough)

在单词的两边使用两个"~~" (波浪形)来删除单词。

Example

The newest articles from ~~Advance Online Publication~~ (AOP) and the current issues.

在这个例子中,我们必须打击“高级在线出版物”(AOP)这个词。

在浏览器中以localhost/Grav/mypage打开.md文件。 这将给你以下结果 -

Grav Markdown语法

Blockquote (Blockquote)

要创建块引用,您必须在句子或单词之前添加>符号>

Example

>The newest articles from Advance Online Publication (AOP) and the current issues.

在这个例子中,我们在句子前面使用了一个>符号。

在浏览器中以localhost/Grav/mypage;打开.md文件localhost/Grav/mypage; 您将收到以下结果 -

Grav Markdown语法

Blockquote也可以通过以下方式使用 -

>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文件localhost/Grav/mypage; 您将收到以下结果 -

Grav Markdown语法

Notices

通知可用于通知或通知重要事项。

通知有四种类型 - 黄色,红色,蓝色和绿色。

Yellow

您必须在描述!Info或信息的黄色通知类型之前使用》》》符号。

Example

>>>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.

Red

在红色通知之前使用四个》》》》符号表示警告。

Example

>>>>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.

Blue

对于蓝色通知类型使用五个》》》》》符号,这描述了一个注释。

Example

>>>>>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.

Green

在绿色通知类型之前使用六个》》》》》》符号,这描述了一个提示。

Example

>>>>>>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文件localhost/Grav/mypage; 您将收到以下结果 -

Grav Markdown语法

Lists

在本节中,我们将了解无序和有序列表如何在Grav中工作。

无序(Unordered)

在无序列表中,使用项目符号。 使用*, - , + 。 子弹的符号。 在任何文本之前使用带空格的符号,将显示项目符号。

Example

+ Bullet
+ Bullet
+ Bullet
   -Bullet
   -Bullet
   -Bullet
   *Bullet

在浏览器中以localhost/Grav/mypage;打开.md文件localhost/Grav/mypage; 您将收到以下结果 -

Grav Markdown语法

Ordered

在列出内容之前添加数字。

Example

1. Coffee
2. Tea
3. Green Tea

在浏览器中以localhost/Grav/mypage打开.md文件。 这将给你以下结果 -

Grav Markdown语法

Code

在本节中,我们将了解内联和块代码“围栏”如何在Grav中工作。

内联代码

使用(`)内联代码以在markdown中使用代码。

Example

In the given example, '<section></section>' must be converted into code.

在浏览器中打开.md文件作为localhost/Grav/mypage您将收到以下结果 -

Grav Markdown语法

区号“围栏”

如果要阻止多行代码,请使用(```)

Example

```
You’re Text Here
```

在浏览器中以localhost/Grav/mypage;打开.md文件localhost/Grav/mypage; 您将收到以下结果 -

Grav Markdown语法

Tables

在Grav中,通过在标题部分下使用管道和短划线创建表。 管道不得垂直对齐。

例子 (Example)

| Number  |    Points       |
| ------  | -----------     |
|   1     | Eve Jackson 94  |
|   2     | John Doe 80     |
|   3     | Adam Johnson 67 |

在浏览器中以localhost/Grav/mypage;打开.md文件localhost/Grav/mypage; 您将收到以下结果 -

Grav Markdown语法

右对齐文本

要获取右侧的表格内容,您必须在标题下方的破折号右侧添加冒号。

| Number |     Points      |
| ------:| -----------:    |
|   1    | Eve Jackson 94  |
|   2    | John Doe 80     |
|   3    | Adam Johnson 67 |

在浏览器中以localhost/Grav/mypage;打开.md文件localhost/Grav/mypage; 您将收到以下结果 -

Grav Markdown语法

Links

在本节中,我们将了解链接在Grav中的工作原理。

基本链接

链接是在([])方括号和(())括号的帮助下完成的。 在[]括号中,您必须编写内容并在()写入域名。

Example

[Follow the Given link](http://www.google.com)

在浏览器中以localhost/Grav/mypage;打开.md文件localhost/Grav/mypage; 您将收到以下结果 -

Grav Markdown语法

添加标题

在本节中,我们将了解如何在.md文件中添加标题。

Example

[Google](https://www.gogle.com/google/ "Visit Google!")

在浏览器中以localhost/Grav/mypage;打开.md文件localhost/Grav/mypage; 您将收到以下结果 -

Grav Markdown语法

Images

图像类似于链接,但在语法的开头有一个感叹号。

Example

![Nature] (/Grav/images/Grav-images.jpg)

在浏览器中打开.md文件作为localhost/Grav/mypage您将收到以下结果 -

Grav Markdown语法

Grav - Page Linking

在本章中,我们将了解如何在Grav中链接页面。 您可以通过简单的方式将一个页面链接到另一个页面,甚至可以将页面链接链接到远程页面。 Grav有许多响应式链接选项。 如果您以前使用HTML链接文件,那么在Grav中理解页面链接非常容易。

下面给出了Grav站点的Pages目录的基本示例。 我们将使用以下目录作为示例,如图所示。

Grav页面链接

下面给出了Grav链接的一些常见组件。

[Linked Content](../path/slug/page)
  • [] - 指定写入链接的文本或备用内容。 在HTML中,我们使用“a href =”“”和“/ a”来放置内容。

  • () - URL放在此括号中,该括号直接放在方括号后面。

  • ../ - 表示向上移动一个目录。

内容中使用了4种类型的链接,如下所示 -

  • Slug Relative

  • Directory Relative

  • Absolute

  • Remote

Slug Relative

内部链接不限于文件/目录结构中的某些名称。 Slugs可以从头部和后备目录名称中提取,后来可以帮助您轻松创建链接,因为不需要记住任何特定的文件名但可以记住相关的slug。 Grav的模板引擎使用文件名来知道要应用的模板。

[link](../dog)

上面的代码提取您以下结果 -

Grav图像链接

在上面的示例中,您必须向上移动目录并从pages/01.home/02.dog/item.md加载位于pages/01.home/02.nature/item.md目录中的默认页面。 文件item.md没有已分配的slug,因此Grav使用目录名称。

接下来,您会找到一个类似的示例,从pages/01.home/01.dog/item.mdpages/02.black/01.fish/item.md ,但是当它加载item.md文件时,一个slug将被分配到01.fish的文件。

[link](../../black/fish)

上面的代码给出了以下结果 -

Grav页面链接

您现在将看到默认的slug文件夹名称将替换为item.md标题中的black slug。

目录相对

目标设置相对用于链接当前页面,该页面可以是图像文件或任何其他文件。 文件的位置与目标的位置一样重要。 如果在更改路径时移动文件,则链接可能会中断。 只要文件保持一致,您就可以在本地开发服务器和具有不同域名的实时服务器之间轻松切换。 链接应该没有任何问题。

您将直接通过名称指向文件的链接,而不是其目录或slug。 您可以创建从pages/01.home/01.dog/item.md to pages/02.black/01.fish/item.md使用如下所示的命令。

[link](../../02.black/01.fish/item.md)

上面的代码给出了以下结果 -

Grav页面链接

两个文件夹都向上移动,如../../ ,然后在底部两个文件夹,直接指向item.md文件。

绝对链接

它类似于相对链接,基于Grav中的/user/pages/目录。 此外,这可以通过两种方法完成。

  • Slug Relative style

  • Directory Relative style

Slug相对风格

你可以像slug相对类型那样做。 它使用路径中的目录名称。 它通过断开链接消除了订单错误和更改。 它会在开头导致链接断开时更改文件夹名称的编号。

下面给出了绝对链接的示例,链接打开/。 它指定在Slug样式的pages/01.home/01.dog/item.mdpages/01.home/01.dog/item.md绝对链接。

[link](/home/nature)

上面的代码给出了以下结果 -

Grav页面链接

与GitHub等服务一起使用时, Directory relative style更加一致。 他们没有Grav灵活性的好处。 下面您可以看到使用目录相对样式对pages/01.home/01.dog/item.md进行绝对链接的示例。

[link](/01.home/01.dog)

Remote

远程链接允许您通过其URL直接链接到任何文件或文档。 您无需包含自己网站的内容。

以下示例显示如何链接到IoWiki页面。

[link](http://www.iowiki.com)

上面的代码给出了以下结果 -

Grav页面链接

您可以直接链接到任何URL,包括安全的HTTPS链接。

Grav - Image Linking

在本章中,我们将了解Grav中的图像链接。 Grav允许您将图像从一个页面链接到另一个页面,甚至链接到远程页面。 如果您使用HTML链接文件,那么在Grav中很容易理解图像链接。

Grav图像链接

使用此结构,我们将了解如何使用不同类型的链接在页面中显示媒体文件。 此结构下的每个文件夹都包含图像,并且/02.green/img01下有一个特殊目录,它充当页面但仅包含媒体文件。

让我们看一下基于Grav markdown的图像标记的一些常见元素。

![Alt Text](../path/image.ext)
  • ! - 当您将其放在降价链接标记的开头时,它表示图像标记。

  • [] - 它为图像指定可选的alt文本。

  • () - 它直接放在包含文件路径的方括号之后。

  • ../ - 表示向上移动目录。

Grav使用以下列出的五种图像链接 -

  • Slug Relative

  • Directory Relative

  • Absolute

  • Remote

  • Media Actions on Images

Slug Relative

它将相对图像链接设置为当前页面,并链接同一目录中的另一个文件。 使用相对链接时,源文件的位置与目标的位置一样重要。 如果在移动时更改文件中的路径,则链接可能会中断。 使用此图像链接结构的优点是,只要文件结构保持不变,您就可以在本地开发服务器和具有不同域名的实时服务器之间切换。

例子 (Example)

![link](../water/img01/img.jpg)

这里../表示你的链接向上移动一个文件夹,然后向下移动一个文件夹,img.jpg是目的地。

使用上述路径时,您将收到以下输出 -

Grav图像链接

Grav支持页面主要降价文件标题中的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 RelativeAbsolute URL。

目录相对

在此类链接中,您可以将目录相对图像链接设置为当前页面。 您可以在目录相对图像链接中通过完整路径引用其文件夹名称,而不是使用URL slugs。

例子 (Example)

![My image](../../blue/img01/img.jpg)

当您使用上述路径时,它将显示如下所示的输出 -

Grav图像链接

Absolute

绝对链接与相对链接相同,但唯一的区别是它们相对于站点的根目录并出现在/user/pages/目录中。

您可以通过两种不同的方式使用绝对链接 -

  • 您可以使用Slug Relative样式,其中包含路径中的slug或目录名称,并且常用于绝对链接。

  • 您可以使用Absolute Link打开带有a/的链接。

![My image](/blue/img01/img.jpg)

使用上述路径时,您将收到以下输出 -

Grav图像链接

Remote

远程图像链接允许通过其URL直接显示任何媒体文件。 这些链接不包含您自己网站的内容。 以下示例显示如何使用远程URL显示图像 -

![Remote Image 1](http://www.freedomwallpaper.com/nature-wallpaper/spring_nature-wide.jpg)

当您单击下图中显示的链接时,它将显示给定URL中的图像。

Grav图像链接

媒体对图像的行为

与页面关联的图像使我们能够利用Grav的媒体操作的优势。 在Grav中创建内容时,您可以显示一些媒体文件,如图像,视频和其他文件。

例子 (Example)

您可以使用下面给出的格式加载图像 -

![Styling Example](../img01/img.jpg?cropResize = 400, 200)

当您使用上述路径时,您将收到如下所示的输出 -

Grav图像链接

Grav - Media

媒体文件包含不同类型的显示内容,例如图像,视频和许多其他文件。 Grav自动查找并处理这些文件以供任何页面使用。 通过使用页面的内置功能,您可以访问元数据并动态修改媒体。

Grav使用Smart-caching ,在必要时创建缓存生成的媒体。 这样,所有人都可以使用缓存版本而不是一次又一次地生成媒体。

支持的媒体文件

以下是Grav支持的媒体文件类型 -

  • Image - jpg,jpeg,png

  • Animated Image - gif

  • vectorized Image - svg

  • Video - mp4,mov,m4v,swf

  • Data/information - txt,doc,pdf,html,zip,gz

显示模式

以下是Grav中的几种显示模式 -

  • Source - 它是图像,视频或文件的可视化显示。

  • text - 媒体文件的文本显示。

  • thumbnail - 媒体文件的缩略图图像。

找到缩略图

您可以使用三个位置找到缩略图 -

  • In the same folder where your media files exists - [media-name].[media-extension].thumb.[thumb-extension]; 这里,媒体名称和媒体扩展名是实际媒体文件的名称和扩展名,拇指扩展名是图像媒体类型支持的扩展名。

  • User Folder − user/images/media/thumb-[media-extension].png; 这里,media-extension是实际媒体文件的扩展。

  • System folder - system/images/media/thumb-[media-extension].png; 这里,media-extension是实际媒体文件的扩展。

灯箱和链接

Grav给出了一个锚标记的输出,其中包含了一些要读取的lightbox插件的元素。 如果要使用插件中未包含的灯箱库,则可以使用以下属性创建自己的插件。

  • rel - 表示灯箱链接。 值是灯箱。

  • href - 它是媒体对象的URL。

  • data-width - 设置用户选择的灯箱宽度。

  • data-height - 设置用户选择的灯箱高度。

  • data-srcset - srcset字符串用于图像媒体。

Actions

Grav中的Builder模式用于处理媒体,以执行多个操作。 所有媒体都支持某些类型的操作,而有些操作仅适用于特定媒体。

General

有六种类型的常规操作可用于媒体类型。 每个动作都在下面解释。

Sr.No. 行动和描述
1 url()

url()返回媒体的raw url path

2 html([title][, alt][, classes]

输出将具有有效的媒体html标签。

3

display(mode)

它用于在不同的显示模式之间切换。 切换到显示模式时,将重置所有操作。

4 link()

链接之前应用的操作将应用于链接的目标。

5 lightbox([width, height])

Lightbox与链接操作类似,但它与一些额外属性创建链接有一点不同。

6 Thumbnail

对于任何类型的媒体文件,在页面和默认值之间选择,这可以手动完成。

对图像的行动

下表列出了一些应用于图像的操作。

Sr.No. 行动和描述
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)

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()

添加了棕褐色滤镜,带来复古外观。

动画和矢量化图像和视频

动画和矢量化动作在图像和视频上完成。 以下是对图像和视频进行的操作。

Sr.No. 行动和描述
1 resize(width, height)

调整大小操作将设置width, height, data-widthdata-height属性。

组合(Combinations)

Grav具有图像处理功能,可以轻松处理图像。

![My New Image](/images/maxresdefault.jpg?negate&cropZoom = 500, 500&lightbox & cropZoom = 600,
200&contrast = -100&sharp&sepia)

上面的代码将生成如下所示的输出 -

格拉夫媒体

响应式图像

下表列出了几种类型的响应图像。

Sr.No. 行动和描述
1 密度更高的显示器

在文件名中添加后缀,您可以向页面添加更高密度的图像。

2 媒体查询的大小

在文件名中添加后缀,您可以向页面添加更高密度的图像。

图元文件(Metafiles)

image1.jpg, archive.zip或任何其他引用都能够设置变量或者可以被元文件覆盖。 然后这些文件采用《filename》.meta.yaml的格式。 例如,如果您有一个image2.jpg图像,那么您的图元文件可以创建为image2.jpg.meta.yaml 。 内容必须采用yaml语法。 您可以使用此方法添加任何您喜欢的文件或元数据。

Grav - Modular Pages

模块化页面一开始很难理解,但一旦你了解它,它就会很容易使用。 它可以从其子页面创建单个页面。 它能够从模块化内容页面构建复杂的单页面布局。

模块化页面设置为不可路由,因为无法通过URL直接访问它们。 它们在文件夹名称之前由_(下划线)标识。 它是一组页面,每个页面都显示一个以获得单个页面。 例如, user/pages/home/_header.

文件夹结构

如果是单页骨架,您可以在01.home文件夹中找到此页面。 在这里,您将获得一个模块化的.md文件,该文件指出必须包含哪些页面以及要显示的页面顺序。 modular.html.twig可以在您当前的主题文件夹中找到。

在下图中,您可以看到为模块化页面创建的文件夹结构。

Grav模块化页面

每个子文件夹都必须包含描述markdown文件的.md文件。

首先,您必须在/users/pages/01.home文件夹中创建子文件夹。 接下来,每个文件夹必须包含.md文件和modular.md文件。

创建子文件夹时,图像和文件都必须位于同一文件夹中。

如何创建模块化页面

要创建模块化页面,您必须遵循给定的步骤。

Step 1 - 在/user/pages/01.home/创建几个页面。 夹。 在下图中,您可以看到我们创建了两个文件夹以及modular.md文件。

Grav模块化页面

Step 2 - 要创建模块化页面,您必须在每个文件夹中创建一个文件并将其命名为text.md

Grav模块化页面

Step 3 - 接下来,在text.md文件中添加代码,保存并运行相同的代码。

Example

将所有四个页面保存为.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 - Multi Language

多语言定义为在您的网站中使用不同的语言。 我们将学习不同的程序,以帮助您在Grav站点中使用多语言。

多语言基础知识

基本上Grav需要一个.md文件来表示任何页面。 启用多语言支持时,它将查找default.en.mddefault.fr.md.等文件default.fr.md.

语言配置

您必须首先在user/config/system.yaml文件中设置一些基本语言配置。 文件。

Language:
   Supported:
      - en
      - Fr

通过这样做,您已在Grav中启用了多语言支持。 在上面的代码中, en表示英语, fr表示法语。 这意味着您的网站将支持这两种语言。 这里的默认语言是en (English) 。 如果你先写Fr (French) ,那么它就成了你的默认语言。

多语言页面

如果您的默认语言设置为English ,则Grav将查找default.en.md文件。 如果找不到该文件,则Grav会查找您设置的其他语言。 如果找不到这两种语言,则会查找default.md文件。

Example

default.en.md文件

---
title: Home
---
# Grav is Running!
## You have installed **Grav** successfully

上面的代码将生成以下输出 -

Grav多语言

对于法语作为默认语言,default.fr.md文件将为 -

---
titre: Accueil
---
# Grav est en marche!
## Vous avez installé ** ** Grav succès

上面的代码将生成以下输出 -

Grav多语言

通过URL激活语言

如果您想使用语言代码更新网站的网址,请按以下步骤操作 -

Example

如果您希望自己的网站使用英文,请在浏览器中输入以下内容 -

http://www.mysite.com/en

如果您希望自己的网站使用法语,请在浏览器中输入以下内容 -

http://www.mysite.com/fr 

通过浏览器激活语言

Grav能够获取http_accept_language值并将它们与当前支持的语言进行比较。 如果您希望此功能正常运行,请在语言部分启用您的user/system.yaml文件 -

language :
   http_accept_language : true

Language-Based Homepage

要拥有基于语言的主页,您必须在site.yaml文件中启用以下代码 -

home:
   aliases:
      en: /homepage
      fr: /page-d-accueil

通过这种方式,Grav将找出使用活动语言的语言。

以下代码将强制Grav将您重定向到您的默认语言路由。 include_route选项强制在您的网址中添加语言代码,例如http://www.mysite.com/en/home

languages:
   home_redirect:
      include_lang: true
      include_route: false

基于语言的树枝模板

如果您的文件是default.en.md ,那么Grav将查找twig文件default.html.twig 。 当您需要特定于语言的twig文件时,必须在语言文件夹的根级别上载它。 如果您当前的主题位于templates/default.html.twig ,则必须创建templates/en/文件夹,并将特定于英语的文件夹放在其中: templates/en/default.html.twig

语言切换器

Grav Package Manager(GPM)提供语言切换器插件。

通过Twig翻译

使用twig filter和t()函数。 两者功能相似。 如果你有另一个twig文件,那么它允许你从一个数组转换。

插件和主题语言翻译

通过在主题或插件的根目录(/user/plugins/error/languages.yaml)中创建languages.yaml文件,提供插件和主题的翻译,并且必须包含所有支持的语言。

翻译覆盖

如果要覆盖转换,则必须将值对放在user/languages/文件夹中的语言文件中。

Advanced

Environment – Based Language Handling

可以根据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

然后只需添加您想要的语言即新网址。

/en/blog/custom/my-page

翻译支持

Grav提供了简单的机制,通过PHP在Twig中提供翻译,用于主题和插件。 它默认启用,如果没有定义特定语言,则使用en语言。 要启用或禁用,请转至system.yaml文件并进行更改。

languages:
   translations: true

您可以通过多种方式和不同的地方提供翻译。 首先是系统/语言文件夹。 必须以en.yamlfr.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

Session Based Active Language

您可以激活活动语言的基于会话的存储。 要启用,您必须在system.yaml中具有session : enables : true enable session : enables : true并启用语言设置。

languages:
   session_store_active: true

Language Switcher

从GPM安装语言切换插件。

Setup with language specific domains

使用基于环境的语言处理配置来分配默认语言。 将此选项添加到system.yaml; 它必须设置为true。

pages.redirect_default_route: true

将以下内容添加到.htaccess文件中,并根据您的要求选择语言slugs和域名。

# 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 - Themes Basics

主题控制Grav网站的外观。 Grav中的主题是使用强大的Twig Templating引擎构建的。

内容页面和树枝模板

您创建的页面,按名称引用特定模板文件或通过设置页面的模板头变量。 建议使用页面名称以便进行更简单的维护。

安装Grav Base软件包后,您将在user/pages/01.home文件夹中找到defauld.md文件。 该文件的名称,即default告诉Grav,应该使用置于themes/《mytheme》/templates文件夹中的themes/《mytheme》/templates模板default.html.twig来呈现此页面。

例如,如果您有一个名为contact.md的文件,它将使用themes/《mytheme》/templates/contact.html.twig模板作为themes/《mytheme》/templates/contact.html.twig

主题组织

在以下部分中,我们将讨论主题组织,即其定义,配置等。

定义和配置

有关主题的信息将在user/themes/antimatter/blueprints.yaml文件中定义,并且可选择提供要在“管理”面板中使用的表单定义。 您将在user/themes/antimatter/blueprints.yaml文件中看到以下内容。

name: Antimatter
version: 1.6.0
description: "Antimatter is the default theme included with **Grav**"
icon: empire
author:
   name: Team Grav
   email: devs@getgrav.org
   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/《mytheme》/《mytheme》.yaml的文件中提供默认设置。

Example

enable: true

主题和插件事件

主题通过插件架构与Grav交互的能力是Grav的另一个强大功能。 要实现此目的,只需创建user/themes/《mytheme》/《mytheme》.php (例如, antimatter.php为默认的Antimatter主题)文件并使用以下格式。

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

模板 (Templates)

Grav主题的结构没有设置规则,除了每个页面类型内容的模板/文件夹中必须有关联的twig模板。

由于页面内容和树枝模板之间的这种紧密耦合,最好根据下载页面中提供的Skeleton包创建一般主题。

假设您要在主题中支持模块化模板,您必须创建modular/文件夹并在其中存储twig模板文件。 如果要支持表单,则应创建form/文件夹并在其中存储表单模板。

蓝图(Blueprints)

要为每个模板文件定义选项和配置的表单,请使用blueprints/文件夹。 这些将无法通过Administrator Panel进行编辑,并且可以选择使用。 主题功能齐全,没有blueprints文件夹。

SCSS/LESS/CSS

如果你想用SASS或LESS开发网站,那么你必须在user/themes/《mytheme》/scss/创建子文件夹,或者less/如果你想要一个css /文件夹。

对于从SASS或LESS编译的自动生成的文件,使用css-compiled/文件夹。 在Antimatter主题中,使用SASS的scss变体。

请按照以下步骤在您的机器中安装SASS。

  • 在主题的根目录下,键入下面给出的命令以执行scss shell脚本。

$ ./scss.sh
  • 键入以下命令以直接运行它。
$ scss --sourcemap --watch scss:css-compiled

css-compiled/将包含所有已编译的scss文件,并且将在您的主题内生成css文件。

其他文件夹

建议在user/themes/《mytheme》/文件夹中为主题中使用的任何图像,字体和JavaScript文件创建单独的images/, fonts/js/文件夹。

主题示例

我们到目前为止讨论的Antimatter主题的整体文件夹结构如下所示。

Grav主题基础知识

Grav - Theme Tutorial

在本章中,让我们创建一个Grav主题来理解这个概念。

反物质(Antimatter)

安装Grav基本软件包时,会安装默认的Antimatter主题,该主题使用Nucleus (一种简单的CSS样式基础集)。 Nucleus是一个轻量级的CSS框架,包含基本的CSS样式和HTML标记,提供独特的外观和感觉。

Bootstrap

让我们创建一个利用流行的Bootstrap框架的主题。 Bootstrap是一个开源和最流行的HTML,CSS和JS框架,使前端Web开发更快,更容易。

以下步骤描述了主题的创建 -

第1步:基本主题设置

我们在主题基础知识章节中研究了Grav主题的一些关键元素,以便创建新主题。

  • 安装Grav基础软件包后,在user/themes文件夹下创建一个名为bootstrap的文件夹,如下所示。

Grav主题教程
  • user/themes/bootstrap文件夹中,创建css/, fonts/, images/, js/templates/ ,如下所示。

Grav主题教程
  • user/themes/bootstrap文件夹中创建一个名为bootstrap.php user/themes/bootstrap文件,并在其中粘贴以下内容。

<?php
namespace Grav\Theme;
use Grav\Common\Theme;
class Bootstrap extends Theme {}
  • 现在,在themes/bootstrap文件夹中创建一个主题配置文件bootstrap.yaml ,并在其中写入以下内容。

enable: true
  • 我们将跳过blueprints文件夹,因为我们没有配置选项,本章将使用常规CSS。

第2步:添加Bootstrap

要创建引导主题,必须在主题中包含Bootstrap。 因此,您需要通过单击此link下载最新的Bootstrap包,如下所示。

Grav主题教程

解压缩包,你会看到三个文件夹,即css,fonts和js。 现在将这3个文件夹的内容复制到之前创建的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 %}内的{% endblock head %}是可选的。

  • if语句测试页眉中是否设置了meta description 。 如果未设置,则应使用user/config/site.yaml文件中定义的site.description呈现模板。

  • 当前主题的路径由theme_url变量给出。

  • 语法{% do assets.add('theme://css/bootstrap.min.css',101) %}用于使用Asset Managertheme://表示当前主题路径,101表示较高值首先跟随较低值的顺序。 我们还可以明确提供CDN链接 -

{% do assets.addCss('http://fonts.googleapis.com/css?family = Open + Sans') %}

or,

{% 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主题教程

Grav - Twig Filters and Functions

在本章中,我们将研究Twig Filters and Functions 。 过滤器也用于根据需要使用所需的输出格式化数据。 函数用于生成内容。

Twig模板是包含由值替换的表达式和变量的文本文件。 Twig使用三种类型的标签。

  • Output tags - 以下语法用于在此处显示已计算的表达式结果。

{{  Place Your Output Here  }}
  • Action Tags - 以下语法用于在此处执行语句。

{%  executable statements are placed here  %}
  • Comment tags - 以下语法用于在Twig模板文件中编写注释。

{#  write your comment here  #}

树枝过滤器

Twig Filters使用| 将过滤器应用于Twig变量后跟过滤器名称的字符。 类似于Twig函数,参数可以在括号中传递。

下表显示了Grav中使用的Twig过滤器 -

Sr.No. 过滤和说明
1

Absolute URL

它采用相对路径并将其转换为绝对URL。

'<img src="/some/path/img.jpg"/>' |absolute_url

转换为 -

<img src="http://learn.getGrav.org/some/path/img.jpg" />
2

Camelize

它将字符串转换为CamelCase格式。

'contact_us'| camelize

转换为 -

ContactUs
3

Contains

如果找到字符串。

'This is some string' | contains('some')

输出是 -

1
4

Defined

您可以检查是否定义了某个变量。 如果未定义变量,则可以提供默认值。

set header_image_width = 
page.header.header_image_width|defined(900)

如果未定义,则将header_image_width为值900。

5

Ends-With

您可以使用Ends-With过滤器确定字符串是否以给定字符串结尾。

'this is an example for ends-with filter' | ends_with('filter')

它显示为 -

True
6

FieldName

它通过将点更改为数组表示法来过滤字段名称。

'field.name'|fieldName

它显示为 -

field[name]
7

Humanize

它用于将字符串转换为人类可读格式。

'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

Left Trim

它用于删除字符串开头的空格,并删除字符串左侧给出的匹配字符。

'/strip/leading/slash/'|ltrim('/')

它显示为 -

strip/leading/slash/
10

Markdown

它用于使用Grav的markdown解析器将包含markdown的字符串转换为HTML。

'## some text with markdown'|markdown

它显示为 -

<h2>some text with markdown</h2>
11

MD5

可以使用此过滤器创建字符串的md5哈希。

'something'|md5

它显示为 -

437b930db84b8079c2dd804a71936b5f
12

Monthize

通过使用Monthize过滤器,我们可以将整数天转换为月数。

'61'|monthize

它显示为 -

2
13

Nice Time

通过使用Nice Time过滤器,我们可以获得一个很好的人类可读时间格式的日期作为输出。

page.date|nicetime(false)

它显示为 -

3 hrs ago
14

Ordinalize

通过使用Ordinalize过滤器,可以将标准(如第1, 2,第3)赋予整数。

'78'| ordinalize

它显示为 -

78th
15

Pluralize

可以使用Pluralize过滤器将字符串转换为其复数英语形式。

'child'|pluralize

它显示为 -

children
16

Randomize

此过滤器有助于随机化提供的列表。 如果参数包含任何值,则从随机化中跳过这些值。

{% 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

Right Trim

它与left trim非常相似,只是它从字符串的右侧删除了空格和匹配的字符。

'/strip/leading/slash/'|rtrim('/')

它显示为 -

/strip/leading/slash
18

Singularize

可以使用奇异滤波器将字符串转换为英文单数形式。

'vehicles'|singularize

它显示为 -

vehicle
19

Safe Email

安全电子邮件过滤器用于将电子邮件地址转换为ASCII字符,以便使电子邮件更难发送垃圾邮件。

"someoneemailaddress@domain.com"|safe_email

输出是 -

someoneemailaddress@domain.com
20

SortByKey

它用于使用键对数组映射进行排序。

{% set people = [{'email':'john@gmail.com', 'id':3}, {'email':'melw@fdd.com', 'id':1}, {'email':'nancy@fb.com', 'id':7}]|sort_by_key('id') %}
{% for person in people %}{{ person.email }}:{{ person.id }}, {% endfor %}

它显示 -

melw@fdd.com:1, john@gmail.com:3, nancy@fb.com:7,
21

Starts-With

您可以使用Starts-With过滤器确定字符串是否以给定字符串开头。

'this is an example for starts-with filter' |starts_with('this')

输出是 -

true
22

Translate

了解更多详细信息。

MY_LANGUAGE_KEY_STRING

它显示 -

'Some text in English'
23

Translate Admin

它将字符串转换为当前语言,该语言在user.yaml文件中设置。

24

Titleize

使用Titleize将字符串转换为Title Case格式。

'welcome page'|titleize

它显示为 -

Welcome Page
25

UnderScoreize

使用UnderScoreize过滤器格式化。

'ContactUs'|underscorize

它被转换为 -

contact_us
26

Truncate a string

您可以使用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函数。 下表列出了这些功能 -

Sr.No. 功能说明
1

Array

此函数将值转换为数组。

array(value)
2

Authorize

此功能使经过身份验证的用户有权查看资源并接受权限字符串或权限字符串数组。

authorize(['admin.statistics', 'admin.super'])
3

Dump

它接受一个有效的twig变量并将其转储到Grav调试器面板中。 但是,应启用调试器以查看消息选项卡值。

dump(page.header)
4

Debug

这与dump()函数相同。

5

Gist

此函数根据Github Gist ID创建Gist嵌入代码。

6

Random String Generation

此函数将创建具有指定字符数的随机字符串。 这些字符串可以用作唯一ID或密钥。

generate_random_string(10)
7

Repeat

此函数将在给定的时间内重复该字符串。

repeat('Grav ', 10) will repeat Grav 10 times.
8

String

生成指定字符长度的随机字符串。

ta (23)
9

Translate Array

它是与|ta过滤器连接的功能。

10

Url

此过滤器将创建一个URL,它还将PHP URL流转换为有效的HTML资源。 如果无法解析URL,则可以传递默认值。

url('theme://images/logo.png') | default('http://www.placehold.it/150x100/f4f4f4')
11

Translate

使用Translate过滤器,字符串被转换为|t过滤器。

t('SITE_NAME')

被翻译成 -

Site Name

Grav - Theme Variables

在本章中,让我们了解Grav中的Theme Variables 。 在设计主题时,可以从树枝模板访问对象和变量,这些对象和变量由Twig模板框架读取和操作。

核心对象

Twig模板有许多core objects; 每个对象都有一组variablesfunctions

下表显示了带有简要说明的变量。

Sr.No. 变量和描述
1

{{ base_dir }}

我们可以使用此变量获取Grav安装基本文件目录。

2

{{ base_url }}

可以使用此变量访问Grav站点的基本URL。

3

{{ base_url_relative }}

它返回基本URL到Grav站点的相对路径。

4

{{ base_url_absolute }}

它将基本URL的绝对路径返回到Grav站点。

5

{{ theme_dir }}

它用于返回当前主题的文件目录文件夹。

6

{{ theme_url }}

它用于返回当前主题的相对URL。

配置对象

configuration.yaml文件中,config对象设置为访问任何Grav配置设置。

{{ config.pages.theme }}

它将返回当前配置的主题。

网站对象

config.site对象提供别名,表示site.yaml文件中设置的配置。

样式表对象

这些对象提供了一个用于存储CSS样式表资产的数组,可以循环将CSS添加到模板中。

脚本对象

这些对象提供了一个由JavaScript资产组成的数组,该数据循环并将JavaScripts添加到模板中。

页面对象

由于Grav的结构在pages/文件夹中定义,因此page object负责表示每个页面。 page object包含有关您当前正在处理的页面的所有信息。

下表显示了页面对象的方法。

Sr.No. 方法和描述
1

summary([size])

它给出了页面内容的要点,其中指定的大小作为参数提供。

如果未指定size,则从system/config/site.yaml文件中的summary.size变量获取该值。

您还可以在内容中分隔=== 。 分隔符前的内容将用于摘要。

{{ page.summary }}

OR

{{ 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()

返回menu变量的值,该值在页面的YAML标题中指定。 如果未设置title变量,则默认为title

title: My Blog
menu: my blog page
7

visible()

它用于设置页面的可见性。 通常,在菜单中显示具有数字值后跟句点(即01.foldername)的页面,并且不显示不包含数值的文件夹名称(即foldername)。 我们可以在页眉中覆盖它。

title: About Us
visible: true
8

routable()

通过使用此功能,我们可以确定页面是否routablenot routable这意味着您是否可以在将浏览器指向页面时接收内容。 不可路由的页面可以用在插件,模板等中,并且不能直接访问这些页面。 这是在页眉中设置的。

title: My Page
routable: true
9

slug()

通过使用此变量,我们可以获得页面URL中显示的直接名称。

my-page
10

url([include_host = false])

它用于返回页面的URL

{{ page.url }}  { # could return /myfolder/mypage #}

OR

{{ page.url(true) }}  {# could return http: //mysite.com/ myfolder/mypage #}
11

route()

它用于返回页面的内部路由。

12

home()

使用此变量可以确定页面是否配置为home 。 当页面配置为主页时返回true,未配置时返回false。 您可以在system.yaml文件中找到此设置。

13

root()

它确定当前页面是否是层次结构的根页面。 如果它是根页面,则返回true如果不是根页面,则返回false

14

active()

您可以使用此变量确定浏览器是否正在访问当前页面。 如果浏览器正在访问此页面,则返回true否则返回false

15

modular()

通过使用此变量,我们可以确定此页面是否为模块化。 如果这是一个模块化页面,那么它返回truefalse如果不是。

16

activeChild()

此变量可以确定此URI的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()

此方法返回已排序的子订单类型。 可能包含的值包括defaulttitledatefolder以及页眉中配置的这些值。

25

orderDir()

此方法返回已排序的子页面的顺序方向。 值可以是asc (升序)或desc(descending) 。 通常,这些值在页眉中配置。

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()

通过使用此变量,您可以确定当前页面是否仅是用于路由的文件夹。 它基于它返回truefalse

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对象表示为页面对象的嵌套树。 在创建navigations, sitemapfinding a particular page navigations, sitemap此嵌套树非常有用。

儿童方法

这将返回由子页面组成的页面对象数组。 具有树状结构的页面对象可以在文件夹中的每个页面上迭代。

要获取菜单的顶级页面,请使用以下代码。

<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对象的方法。

Sr.No. 方法和描述
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()

通过此方法返回页面的引用者信息。

标题对象

它是原始页面的page.header()的替代。 循环浏览子页面时,更适合使用原始页眉。

内容对象

它是原始页面的page.content()的替代。

分类对象

站点的所有分类信息都包含在全局分类对象中。

浏览器对象

Grav通过使用内置支持以编程方式确定用户的平台,浏览器和版本。

{{ browser.platform}}   # windows
{{ browser.browser}}    # chrome
{{ browser.version}}    # 24

添加自定义变量

自定义变量以多种方式添加。 如果您使用的是站点范围的变量,则将其放在user/config/site.yaml文件中,然后您可以访问它,如下所示。

{{ site.my_variable }}

如果变量仅适用于特定页面,则可以在YAML前端添加它,并使用page.header对象访问它。

For example -

title: My Page
author: John

作者姓名可以访问为 -

The author of this page is: {{ page.header.author }}

添加自定义对象

通过使用插件,您可以将自定义对象添加到Twig对象。 这是一个高级主题,我们将在插件章节中看到更多信息。

Grav - Asset Manager

在本章中,我们将研究Asset Manager 。 在Grav 0.9.0中引入了Asset Manager来统一用于添加和管理JavaScriptCSS等资产的界面。 从主题和插件添加这些资源将提供诸如orderingAsset Pipeline等高级功能。 Asset Pipeline用于缩小和压缩资产,以减少浏览器的需求并减少资产的大小。

Asset Manager是一个类,可以通过插件事件挂钩在Grav中使用。 您还可以使用Twig调用直接在主题中使用Asset Manager类。

配置 (Configuration)

Asset Manager由一组配置选项组成。 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资产添加到Asset Manager。 您可以通过将数值作为第二个参数传递来设置样式表的优先级。 对addCss()方法的调用会从CSS资源中呈现HTML标记。

JavaScript资产的使用方式与CSS资产相同。 block twig标记内的JavaScript资源如下所示。

{% 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() }}

添加资产

下表列出了不同类型的添加方法 -

Sr.No. 方法和描述
1

add(asset, [options])

根据文件扩展名, add方法与资产匹配。 它是调用CSS或JS的直接方法之一的正确方法。 您可以使用options来设置优先级。 是否应将资产包含在组合/缩小管道中由管道属性控制。

2

addCss(asset, [options])

通过使用此方法,您可以将资产添加到CSS资产。 根据第二个参数中设置的优先级,资产在列表中排序。 如果未设置优先级,则默认设置为10。 是否应将资产包含在组合/缩小管道中由管道属性控制。

3

addDirCss(directory)

通过使用此方法,您可以添加由CSS资产组成的实体目录,该目录将按字母顺序排列。

4

addInlineCss(css, [options])

您可以使用此方法在内联样式标记内提供一串CSS。

5

addJs(asset, [options])

通过使用此方法,您可以将资产添加到JS资产。 如果未设置优先级,则将默认优先级设置为10.管道属性确定资产是否应包含在组合/缩小管道中。

6

addInlineJs(javascript, [options])

此方法允许您在内联脚本标记内添加JS字符串。

7

addDirJs(directory)

通过使用此方法,您可以添加由JS资产组成的实体目录,该目录将按字母顺序排列。

8

registerCollection(name, array)

此方法允许您使用名称注册由CSS或JS资产组成的数组,以便稍后可以使用add()方法使用它。 如果您使用多个主题或插件,则此方法非常有用。

选项 (Options)

有许多选项可以传递资产数组,如下所示 -

对于CSS

  • priority - 它采用整数值,默认值为100。

  • pipeline - 当资产未包含在管道中时,它将设置为false值。 并且默认值设置为true

For JS

  • priority - 取整数值,默认值为100。

  • pipeline - 当资产未包含在管道中时,设置为false 。 并且默认值设置为true

  • loading - 此选项支持3个值,例如emptyasyncdefer

  • group - 它由一个字符串组成,该字符串指定组的唯一名称。 并且默认值设置为true

Example

{% do assets.addJs('theme://js/example.js', 
{'priority':101, 'pipeline':true, 'loading':'async', 'group':'top'}) %}

渲染资产

可以使用以下方法呈现CSS和JS资产的当前状态 -

css()

基于已添加到Asset Manager的所有CSS资产, css()方法呈现由HTML CSS链接标记组成的列表。 根据管道属性,列表可以包含缩小文件和个人/组合资产。

js()

基于已经到资产管理器的所有JS资产, js()方法呈现由HTML JS链接标记组成的列表。 根据管道属性,列表可以包含缩小文件和个人/组合资产。

命名资产

Grav允许您使用名称注册CSS和JS资产的集合,以便您可以使用注册名称add资产add到Asset Manager。 这可以通过使用named assets的功能在Grav中完成。 这些自定义集合在system.yaml;中定义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引入了一个名为Grouped Assets的新功能,它允许您在添加Assets时传递由可选group组成的选项数组。 当您在页面的特定部分需要一些JS文件或内联JS时,此功能非常有用。

通过使用选项语法,您必须在添加资产时指定组,如下所示。

{% do assets.addJs('theme://js/example.js', {'priority':102, 'group':'bottom'}) %}

如果没有为资产设置组,则将head设置为默认组。 如果要在底部组中呈现这些资源,则必须在主题中添加以下内容。

{{ assets.js('bottom') }}

静态资产

无论何时想要在不使用Asset Manager的情况下引用资产,都可以使用url()辅助方法。 例如,如果要从主题中引用图像,则可以使用以下语法。

<img src = "{{ url("theme://" ~ widget.image) }}" alt = "{{ widget.text|e }}" />

url()帮助器方法可选地使用第二个参数来使URL能够使用truefalse值来包含域和模式。 默认情况下,该值设置为false ,仅显示相对URL。

Example

url("theme://somepath/mycss.css", true)

Grav - Theme Customization

在本章中,让我们研究一下Theme Customization 。 有几种方法可以自定义主题。 Grav提供了许多功能和一些功能,可以轻松自定义您的主题。

自定义CSS

您可以提供自己的custom.css文件来自定义主题。 Antimatter主题通过使用Asset Manager引用css/custom.css文件。 如果未找到对CSS文件的引用,则Asset Manager将不会添加对HTML的引用。 在Antimatter的css/文件夹中创建CSS文件将覆盖默认的CSS。 例如 -

custom.css

body a {
   color: #FFFF00;
}

默认链接颜色被覆盖并设置为黄色。

Custom SCSS/LESS

提供自定义CSS文件的另一种方法是使用custom.scss文件。 SCSS(Syntactically Awesome Style Sheets)是一个CSS预处理器,它允许您通过使用运算符,变量,嵌套结构,导入,部分和混合来有效地构建CSS。 反物质是使用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。 这是选择这种方式来定制主题的主要缺点。 这可以通过使用主题继承来解决。

主题继承

Theme Inheritance是修改或自定义主题的最佳方式,可以通过一些设置来完成。 基本思想是将主题定义为您继承的基本主题,并且只能修改一些位,其余部分由基本主题处理。 使用主题继承的优点是,只要更新基本主题,定制的继承主题就不会直接受到影响。 为此,您需要按照以下步骤操作。

  • 要存储新主题,请创建名为mytheme/ inside /user/themes/ folder的新文件夹。

  • 接下来,您需要在新创建的/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: devs@getgrav.org
   url: http://getgrav.org

我们现在将了解如何定义由基本元素组成的主题blueprints.yaml 。 可以为表单定义提供更多详细信息以控制表单功能。 可以检查blueprints.yaml文件以获取更多详细信息。

  • 在您的user/config/system.yaml文件中编辑pages: theme:将默认主题更改为新主题的选项,如下所示。

pages:
   theme: mytheme

现在创建了新的主题,反物质将成为这个新的mytheme主题的基本主题。 如果你想修改特定的SCSS,我们需要配置SCSS编译器,使它首先看你的mytheme主题,其次是反物质主题。

它使用以下设置 -

  • 首先复制放在antimatter/scss/文件夹中的template.scss文件,然后将其粘贴到mytheme/scss/文件夹中。 此文件将包含各种文件的所有@import调用,如template/_custom.scss和子文件。

  • load-path指向包含大量SCSS文件的antimatter/scss/文件夹。 要运行SCSS编译器,需要为其提供load-path to it as shown below.

scss --load-path ../antimatter/scss --watch scss:css-compiled
  • 现在,在mytheme/scss/template/下创建一个名为_custom.scss的文件。 此文件将包含您的所有修改。

更改自定义SCSS文件后,所有SCSS文件将自动再次编译到template.css ,该文件位于mytheme/css-compiled/文件夹下,然后Grav会准确地引用它。

Grav - Plugin Basics

在本章中,我们将了解插件如何作为Grav中的附加功能。 插件是一款软件,提供了Grav核心功能最初未完成的附加功能。

可以上载Grav插件以扩展站点的功能。 插件用于简化您的工作。 Dependency Injection Container有助于访问Grav中的关键对象。 在Grav's event hooks的帮助下,在整个生命周期中,我们可以根据需要操纵Grav,也可以访问Grav知道的任何内容。 我们将在章节Grav - Event Hooks中详细研究Grav事件挂钩

Dependency Injection是一种软件设计模式,其中组件被赋予其依赖性,而不是在组件内对它们进行硬编码。

Grav有许多免费插件可用于显示博客存档,站点地图,搜索引擎,表单,灯光滑块等等。 您可以从here下载插件。 在Plugin文件夹中,您可以使用唯一名称存储插件; 该名称应与插件的功能相关,并且不应包含任何大写字母,下划线或空格。 我们将在章节Grav - 插件教程中研究如何使用插件。

Powerful

插件易于编写,灵活且功能强大。 有46个插件,具有包括displaying a sitemapprovides breadcrumbsdisplay blog archives等功能。

要点(Essentials)

在系统上安装Grav时,您可以看到《your_folder_name》/user/plugins文件夹中有两个插件。

  • 错误插件

  • 问题插件

Error Plugin - 用于显示HTTP错误,即当没有可用于给定URI的请求页面时, 404 Page Not Found

Problem Plugin - 用于检测有关权限,主机设置和丢失文件夹的问题。 当您安装新的Grav以识别此类问题时,它非常有用。

Grav - Plugin Tutorials

在本章中,我们将深入研究如何设置和配置插件。 此外,我们还将了解插件的结构以及如何显示随机页面。 插件是一款软件,提供了Grav核心功能最初未完成的附加功能。

在本文中,我们将使用random插件显示随机页面。 在使用这个插件之前,我们将看到随机插件的一些重要点。

  • 您可以使用此插件通过使用URI作为/random来显示随机页面。

  • 创建过滤器以使用页面中指定的分类法。 您可以创建category : blog

  • 您可以使用过滤器选项显示随机页面; 这通知Grav使用随机页面中显示的相同内容。

安装插件

在使用实际插件之前,请按照以下步骤为插件创建基本设置。

  • user/plugins文件夹下创建名为random的文件夹。

  • user/plugins/random文件夹下,创建两个文件,即 -

    • random.php用于插件代码

    • random.yaml用于配置

插件配置

要使用随机插件,我们需要一些配置选项。 我们将在random.yaml文件下写下以下行。

enabled:true
route:/random
filters:
   category:blog

随机创建您定义的路线。 基于分类过滤器,它选择一个随机项。 过滤器的默认值是'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语句在插件中使用了一堆类,这使得它更具可读性并节省空间。 namespace Grav\Plugin必须写在PHP文件的顶部。 插件名称应该用titlecase编写,并且应该使用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对象指定用于路由随机插件的配置值,并将其存储在路由对象中。

我们现在将配置的路由与当前的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 - Event Hooks

在本章中,我们将研究Grav中的Event Hooks 。 在Plugins章节中,您将看到,插件的逻辑包含在两个方法中。 方法是onPluginsInitializedonPageInitialized ; 这些方法类似于事件挂钩。 要了解更多信息并控制Grav插件的功能,您需要检查事件挂钩的可用性。 事件挂钩从头到尾与Grav有直接关系。 您必须知道调用挂钩的顺序以及这些调用时可用的内容。

下表列出了在处理页面期间激活的核心Grav event hooks

Sr.No. 活动和描述
1

onFatalException

如果PHP给出致命异常,您可以随时触发此事件。 Problem插件使用它来管理显示完整解释的列表,以解决Grav传递致命错误的原因。

2

onPluginsInitialized

这是第一个可在Grav中使用的插件事件。 如下所述介绍了以下对象 -

  • Uri
  • Config
  • Debugger
  • Cache
  • Plugins
3

onAssetsInitialized

这指定assets管理器已加载并可供使用和管理。

4

onPageNotFound

如果您找到了意外的页面,则可以关闭此事件。 目前,错误插件用于指定404 error页面。

5

onPageInitialized

这通过加载到Page对象的URL指定所请求的页面。

6

onOutputGenerated

这指定了Twig templating引擎的输出过程。 目前,它只是一串HTML

7

onOutputRendered

这是一个输出过程,发送到显示器。

8

onShutdown

这是一个新的非常强大的事件,允许您执行操作。 这是在Grav completed processing并关闭与客户端的连接之后completed processing 。 此单独操作不需要与用户进行任何交互,结果会影响性能。 它包括用户跟踪和作业处理。

9

onBeforeDownload

这是一个新事件,它passes到包含文件的事件对象。 它允许用户执行记录,授予和忽略下载所述文件的权限。

Twig Event Hooks

Twig有自己的事件挂钩集合,如下所述。

Sr.No. 活动和描述
1

onTwigTemplatePaths

模板路径的基本位置在Twig object上设置。 此事件用于添加Twig将搜索模板路径的其他位置。

2

onTwiglnitialized

initialize Twig模板引擎。

3

onTwigExtensions

它指定核心树枝扩展即可使用。 此事件挂钩允许您添加自己的Twig扩展。

4

onTwigPageVariables

这个Twig过程允许你直接页面,即你可以在YAML标题的页面中找到process:twig:tru 。 在这里,您可以向Twig添加任何变量,并且在此过程中可以访问twig。

5

onTwigSiteVariables

在此过程中,您将通过Twig方法按order wise查看完整的网站模板。 此外,您可以在此过程中向Twig添加任何变量。

收集事件挂钩

下表列出了一个集合事件挂钩。

Sr.No. 活动和描述
1

onCollectionProcessed

在本节中,一旦完成该过程,您就可以control集合。

页面事件挂钩

下表列出了页面事件挂钩的集合。

Sr.No. 活动和描述
1

onBuildPagesInitialized

此事件对于插件控制内容和缓存结果非常有用。 激活此事件后,页面将被回收。 当缓存已expired或需要refreshing时,会发生这种情况。

2

onBlueprintCreated

此事件有助于处理和管理表单。

3

onPageContentRaw

在此过程中,当找到页面时, headers是固定的,但content将不会被修复。 您将在Grav系统中看到每个页面都被触发。 如果已清除缓存或清除缓存,则会发生此事件。

4

onPageProcessed

一旦页面被tested并修复,每个页面都会在Grav系统中被解除。 在这种情况下,性能无关紧要,因为它不会在缓存页面上播放。

5

onPageContentProcessed

一旦页面的content()技术修复了页面内容,您就可以看到此事件被解除。 如果您希望对修复后的内容执行操作但确保cached结果,则此事件非常有用。

6

onFolderProcessed

测试并修复文件夹后,Grav系统中的每个文件夹都将被解除。 在这种情况下,性能无关紧要,因为它不会在缓存页面上播放。

Grav - Admin Introduction

Grav Administration Panel插件是Grav Administration Panel的Web图形用户界面(GUI)。 它可以轻松创建和修改页面。 它是一个可选的插件,有效地工作Grav并不完全依赖于此。 管理员提供有限的视图以便于使用Grav。

特点 (Features)

以下是行政小组的特点 -

  • 启用或禁用插件管理器列表中的插件。

  • 您可以轻松地创建,编辑,复制和删除页面。

  • 最新页面更新列表显示在仪表板上。

  • 只需点击一下,即可轻松查看最新的可用更新。

  • 使用搜索框从列表中查找特定页面。

  • 它由忘记密码的功能组成。

  • 可以通过拖放方法上传媒体文件。

  • 允许在正常模式和专家模式下通过yaml或表单进行编辑。

  • 仪表板包括站点活动,最新页面更新和维护状态。

  • 它由Ajax驱动的备份和清除缓存功能组成。

  • 它由站点和系统配置管理组成。

  • 由GPM提供支持的新插件和主题安装。

  • 用户登录时提供自动密码加密功能。

  • 它提供了代码编辑器,通过即时Grav驱动的预览突出强大的语法。

  • 可以使用主题管理器完成已安装的主题列表和配置。

  • 它还管理登录用户。

安装 (Installation)

要访问管理插件,我们需要运行latest Grav 。 您可以在CLI(命令行界面)中运行以下命令。

$ bin/gpm selfupgrade -f

selfupgrade用于将selfupgrade更新为可用的最新版本。 -f用于刷新GPM(Grav包管理器)索引。

我们需要安装adminformemaillogin插件,以使您的管理插件正常运行。 由于所有插件都有依赖关系,因此在安装admin插件时提示您安装其他插件时需要同意; 这些插件可通过GPM(Grav Package Manager)获得。 我们将在Grav-GPM一章中更多地了解GPM

以下命令用于使用命令提示符安装管理插件。

$ bin/gpm install admin

手动安装

我们可以通过单独下载以下插件手动安装管理面板 -

下载完所有插件后,解压缩所有zip文件并存储在《your_folder_name》/user/plugins文件夹中。 在Plugin文件夹中,您可以存储具有唯一名称的插件; 该名称应与插件的功能相关。 该文件夹可以重命名为admin/email/form/login/ 。 有必要将Plugin文件夹中的所有四个插件存储在一起; 否则管理面板将无法正常工作。

创建用户

我们可以使用命令行界面创建用户帐户。 使用以下命令创建用户帐户。

$bin/grav newuser

否则,您还可以通过编写以下代码行手动创建用户帐户 -

email: admin@tutorials.com
access:
   admin:
      login: true
      super: true
   site:
      login: true
fullname: 'IOWIKI'
title: tp
password: 'Password'

将以上行保存在《your_folder_name》/user/account/admin.yaml文件中。 您用于保存上述代码的username将是您登录的username ,即admin。 您可以根据您的要求编辑emailfullnametitlepassword

用法 (Usage)

您可以通过将浏览器指向localhost/《your_folder_name》/admin来访问管理面板,您将看到如下所示的屏幕。 您可以在creating user部分中指定的yaml文件中设置usernamepassword

格拉夫介绍

Grav - Admin Dashboard

在本章中,我们将研究Grav中的Administrative Panel Dashboard 。 仪表板充当Grav管理面板插件的信息神经中枢。 您可以检查traffic statisticscreate new backupsGrav updatesmaintenance information ,查看最新页面更新,还可以借助此单页清除Grav缓存。

Step 1 - 您可以指定用户的权限,并根据需求更改Dashboard的内容。 仪表板的屏幕有点像下面的屏幕截图。

重型仪表板

Step 2 - 您现在将在仪表板中看到Cache and Updates Checking的功能。

重型仪表板

您将在“仪表板”菜单顶部看到两个选项卡。

  • 清除缓存
  • 检查更新

清除缓存

它指定删除所有缓存内容,包括图像缓存和资产。

您可以在下拉菜单中看到更多功能,如下所述。

  • All cache - 它指定删除所有缓存

  • Assets only - 它指定仅删除资产的缓存。

  • Images only - 它指定仅删除图像的缓存。

  • Cache only - 它定义为仅删除缓存。

检查更新

此选项卡指定检查站点的更新。 如果有新的更新,您将在仪表板上收到通知。 您将收到支持的插件,主题甚至Grav的更新。

维护和统计

此部分可让您了解有关您网站的重要信息。

维护(Maintenance)

本节为您提供完全最新的Grav功能的百分比图表。 您将在维护和统计部分上方看到所需更新的通知。

  • Update - 只要有新的更新,就会出现“更新”按钮。 接下来,您可以单击它并更新插件和主题。 您将在通知栏中看到“ Update Grav Now按钮,该按钮会更新Grav的核心部分。

  • Backup - 在此部分中,您可以看到显示您未备份站点多长时间的图表。 这可以通过生成和下载zip文件来执行,将其另存为站点数据的备份。

统计(Statistics)

它会显示您网站上访问者流量的简单快速图表,该图表是在过去一天,一周和一个月内收到的。 它显示的条形图分为一周中的几天。

Step 3 - 接下来,您将看到最新页面更新的详细信息,如下所示。

重型仪表板

本部分允许您了解有关Grav站点中页面的最新修改内容的更多信息。 接下来,每次刷新页面时,它都会为您生成最近更新的列表。

您可以从列表中单击页面的title ; 这会将您重定向到管理部分中的页面编辑器。

Manage Pages按钮会将您重定向到管理面板的页面。

Grav - Configuration System

在本章中,我们将研究Grav管理面板中的Configuration System 。 您可以在“配置”页面的帮助下直接配置站点系统的设置。 此外,您将看到服务器属性的简要说明,包括PHP,服务器环境以及其他一些管理站点性能的组件。

“系统”选项卡允许您修改/user/config/system.yaml文件中的设置。 这会影响Grav操作的许多主要系统相关功能。 这些设置可以分为不同的部分,向您展示Grav性能的不同特征。

以下是系统选项卡中显示的configuration sections的详细列表 -

Content

在本部分中,您可以修复站点Content处理的基本属性,如下所示。

grav配置系统
  • Home Page - 指定要为站点显示的主页。

  • Default Theme - 显示您网站的主要默认主题。

  • Process - 控制页面的处理方式。 可以按页面而不是全局设置。

  • TimeZone - 设置服务器中的默认时区。

  • Short Date Format - 显示短日期格式。

  • Long Date Format - 显示长日期格式。

  • Default Ordering - 页面使用此顺序显示在列表中。

  • Default Order Direction - 指定列表中页面的方向。

  • Default Page Count - 定义列表中的最大默认页面计数。

  • Date Based Publishing - 它Date Based Publishing自动发布帖子。

  • Events - 它指定启用或禁用事件。 禁用将导致插件损坏。

  • Redirect Default Route - 它定义默认路由并自动重定向到页面。

Languages

您可以在此区域中设置Multi language features ,如下所示。

grav配置系统
  • Supported - 它指定用逗号分隔的两个字母语言代码的列表,即en,fr,de。

  • Translations Enabled - 启用Grav,插件和扩展中的翻译。

  • Translations Fallback - 如果不存在活动语言,则指定替代支持的翻译。

  • Active Language in Section - 您可以将活动语言存储在该区域中。

  • Home Redirect Include Language - 它根据需求包含主重定向(/ en)中的语言。

  • Home redirect Include Route - 它指定重定向管理主目录。

  • Set language from browser - 它Set language from browser指定语言。

  • Override locale - 它指定覆盖区域设置。

HTTP标头

此部分用于设置HTTP Headers选项。 此设置有助于基于浏览器的缓存和优化。

grav配置系统
  • Expires - 定义到期时间并以秒为单位设置值。

  • Last Modified - 设置上次修改的标头有助于优化代理和浏览器缓存。

  • ETag - 定义e tag header以标识已修改的页面。

  • Vary Accept Encoding - 您应该将Vary:HTTP标头排列为Accept。 这将有利于代理上的缓存。

Markdown

在本节中,我们将研究Grav如何管理Markdown及其功能以启用Markdown Extra。 它可以帮助用户并构成Grav页面内容的大部分内容。

grav配置系统
  • Markdown Extra - 它指定Markdown Extra的默认支持。

  • Auto Line Breaks换行 - 它指定降价时的换行符。

  • Auto URL Links - 它指定将URL转换为HTML超链接。

  • Escape Markup - 它将标记选项卡指定为HTML对象。

缓存 (Caching)

在本节中,您可以配置站点的主要Caching功能。 Grav结合了缓存功能,有助于为用户构建最快的平面文件CMS选项。

grav配置系统
  • Caching - 指定全局切换ON/OFFenable/disable Grav缓存。

  • Cache Check Method - 这定义了文件,文件夹和无的高速缓存检查方法。

  • Cache Driver - 指定为用户选择缓存驱动程序。 Auto Detect缓存驱动程序发现最佳。

  • Cache Prefix - 这指定了部分Grav密钥的标识符。 仅在需要时更改它,否则不要更改它。

  • Lifetime - 以秒为单位定义缓存生存期, 0=infinite

  • Gzip Compression - 要提高性能,请启用Grav页面的Gzip压缩。

树枝模板

在本节中,Grav强调了它的Twig templating功能。 您可以在此处配置Twig缓存,调试和修改跟踪设置。

grav配置系统
  • Twig Caching - 指定控制Twig缓存系统。 启用时,它可以提供最佳性能。

  • Twig Debug - 这定义了不加载Twig Debugger扩展的选项。

  • Detect Changes - 在Twig模板中完成的任何更改,这将自动重新编译Twig缓存。

  • Autoescape Variables - 所有变量都是autoescapes ; 这可能会对您的网站造成损害。

Assets

此部分用于处理资产,包括CSS和JavaScript资产,如下所示。

grav配置系统
  • CSS Pipeline - 将多个CSS资源集成到单个文件中。

  • CSS Minify - 在流水线操作期间,CSS缩小。

  • CSS Minify Windows Override - 默认设置为False,它为Windows平台定义Minify Override。

  • CSS Rewrite - 在流水线操作期间CSS Rewrite CSS相对URL。

  • JavaScript Pipeline - 将多个JavaScript资源集成到一个文件中。

  • JavaScript Minify - 在流水线操作期间,JS正在缩小。

  • Enable Timestamps on AssetsEnable Timestamps on Assets - Enable Timestamps on Assets时间戳。

  • Collections - 资产集合是单独添加的。

错误处理程序

在站点开发期间,此部分对于管理Grav错误报告非常有用。

grav配置系统
  • Display Error - Display Error完整的回溯样式错误页面。

  • Log Errors - 日志错误显示在/logs文件夹中。

Debugger

这类似于错误处理,调试工具集成在Grav中以定位和排除错误。

grav配置系统
  • Debugger - 启用调试器及其设置。

  • Debug Twig - 启用Twig模板调试器。

  • Shutdown Close Connection - 在调用onShutdown()之前,您需要关闭连接。

Media

此部分用于管理Grav的media内容。 您可以在此处配置图像质量,文件上载大小和许多媒体处理选项。

grav配置系统
  • Default Image Quality - 在缓存或重新采样图像时使用默认图像质量。

  • Cache all Images - 所有图像都通过Grav的缓存系统运行,即使它不包含媒体操作。

  • Image Debug Watermark - 您可以指示图像的像素深度,同时在图像上显示叠加,即使用视网膜。

  • File Upload Limit - 它定义最大上载大小(以字节为单位)(0为无限)。

  • Enable Timestamps on Media - 根据上次修改日期为每个媒体项添加时间戳。

Session

下面提到的功能可帮助您启用session支持。

grav配置系统
  • Enable - 这指定Grav中的会话支持。

  • Timeout - 指定会话超时(以秒为单位)。

  • Name - 指定由标识符开发和应用的会话cookie的名称。

Advanced

在本节中,您将看到advanced系统选项。

grav配置系统
  • Absolute URLs - 指定base_url绝对或相对URL。

  • Parameter Separate - 您可以在参数分隔符的帮助下在Windows上更改Apache。

Grav - Configuration Site

在本章中,我们将研究如何在Grav的管理面板中Configure Site 。 您可以在“配置”页面的帮助下直接配置站点系统的设置。 “ Site选项卡允许您修改/user/config/system.yaml文件中的设置。 此选项卡允许您修改影响站点相关功能的选项和字段,例如站点中使用的名称,默认作者等。

以下是您可以在“ Site选项卡中看到的不同配置设置。

Default

在此区域中,您可以设置基本属性以管理站点的内容。 在这里,您可以设置多个内容显示选项,例如主页,默认主题和许多其他选项。

grav配置站点
  • Site Title - 指定您网站的标题。

  • Default Author - 指定在主题或页面内容中使用的默认作者姓名。

  • Default Email - 这指定主题或页面中的默认电子邮件。

  • Taxonomy Types - 指定在页面中使用的分类法类型。

页面摘要

页面摘要可以向您显示页面内容的小预览。 您可以在页面中,在分隔符的帮助下在摘要内容之间定义“截断”点。

grav配置站点
  • Enabled - 指定是否启用页面摘要。

  • Summary Size - 定义页面中用作内容摘要的字符数。

  • Format - Short使用第一次出现的分隔符, Long忽略汇总分隔符。

  • Delimiter - 指定汇总分隔符。 默认值为默认值'==='。 您可以在页面摘要中使用它,并在打开段落后发布。

Metadata

元数据在页面中起着重要作用,并提高您的SEO。 您可以在此处设置多个元数据属性,以便您的链接可以根据需求显示在多个搜索引擎和社交Feed中。

grav配置站点

这指定了默认元数据值,稍后您可以进行修改。

重定向和路由

这允许您设置重定向和路由到您网站的其他页面。

grav配置站点
  • Custom Redirects - 定义指向其他页面的路由。 替换标准正则表达式是有效的。

  • Custom Routes - 路由到其他页面的别名。 替换标准正则表达式是有效的。

Grav - Administration Panel Pages

在本章中,我们将了解管理面板页面如何在Grav中工作。 通过页面可以轻松访问您的网站创建,编辑或删除内容。 在管理面板页面中,您可以查看为您的站点创建的页面列表,还可以为您的站点创建新的模块化页面或非模块化页面。

添加新页面

您可以看到pages管理面板顶部有三个按钮,如下面的屏幕截图所示。

Grav管理面板页面
  • Back - 这将返回到管理页面的仪表板。

  • Add Page - 这将创建一个新的非模块化内容。

  • Add Modular - 这将创建新的模块化内容。

添加页面

它为您的网站创建非模块化页面,其中包含各种字段,同时向您的网站添加页面,例如Title, Folder Name, Parent root等。

单击“ Add Page按钮时,会出现一个弹出窗口,如下所示 -

Grav管理面板页面

它包含以下字段 -

  • Page Title - 在此输入页面标题。

  • Folder Name - 这是输入页面的文件夹名称,或者输入标题后将自动生成名称。

  • Parent Page - 设置新创建页面的父页面。

  • Page File - 这将向页面显示所选主题模板。

  • Visible - 通过将页面设置为auto, yesno auto, yes可以在导航栏中显示该页面。

填写字段中的所有信息后,单击“ Continue按钮。 它会将您重定向到页面编辑器。

添加模块化页面

模块化页面允许从其子页面创建单个页面。 它能够从模块化内容页面构建复杂的单页面布局。

单击“ Add Modular按钮时,会出现一个弹出窗口,如下所示 -

Grav管理面板页面

该窗口包含以下字段 -

  • Page Title - 这里我们输入模块化页面的标题。

  • Folder Name - 这是输入页面的文件夹名称,或者在您输入标题后自动生成名称。

  • Page - 设置新创建的模块子页面的父页面。

  • Modular Template - 选择要为模块化页面显示的特定模板。

填写字段中的所有信息后,单击“ Continue按钮。 它会将您重定向到页面编辑器。

页面列表

这将显示为站点创建的页面列表。

Grav管理面板页面

在这里,您可以轻松访问创建的页面并进行编辑。

  • 单击页面的任何标题,它将重定向到页面编辑器以进行编辑。

  • 页面右侧的X图标用于删除页面。

  • “过滤器”框用于查找要搜索的页面。 它根据类型过滤页面,以便只在列表中显示modularvisible和/或routable等页面。

  • 当您知道该页面的确切名称时,搜索框用于查找页面。

  • 当您直接悬停在页面左侧的图标上时,它会显示当前状态,即Page . Routable . Visible . Published Page . Routable . Visible . Published Page . Routable . Visible . Published ,表示该页面通过URL可见,并将显示在导航菜单中。

单击列表中显示的页面时,您将看到以下屏幕。

Grav管理面板页面

在上面的屏幕中,您可以选择编辑页面,添加内容或向页面添加图像。 “ OptionsOptions卡包含我们在“ 页面编辑器选项”一章中学习的发布,分类和站点地图选项。 “ Advanced选项卡包含页面的高级选项,如设置,排序和覆盖,将在“ 页面编辑器高级”一章中介绍。

Grav - Page Editor Options

在本章中,我们将研究Grav管理面板中的Page Editor options 。 这是一个动态文本编辑器,允许您创建页面内容。 此外,您还可以在页面中添加媒体文件。 您可以看到options卡的功能,如下所示。

Grav页面编辑器选项

Options卡包含两个部分 -

  • Publishing
  • Taxonomies

出版(Publishing)

此部分用于设置发布和取消发布页面的日期和时间。 您可以完全控制要发布或取消发布的内容,并且可以为特定页面创建元数据值。

Grav页面编辑器选项

以下字段出现在出版部分 -

  • Published - 默认情况下,页面设置为“ Yes ,即已发布。 选择No您可以取消发布该页面。

  • Date - 设置页面的日期和时间。

  • Published Date - 设置自动发布页面的日期和时间。

  • Unpublished Date - 设置自动Unpublished Date发布页面的日期和时间。

  • Metadata - 设置将在所有页面上显示的元数据值。

分类法(Taxonomies)

在本节中,您可以在页面上显示类别并配置页面及其结构属性。

Grav页面编辑器选项

以下字段存在于分类法部分中。

  • Category - 它设置页面的类别。 它有助于对内容进行排序和过滤。

  • Tag - 它提供有关您的网页的信息。 它有助于组织和过滤内容。

Grav - Page Editor Advanced

页面编辑器是一个文本编辑器,也管理页面; 这允许您创建内容,包括媒体文件,发布和分类选项,设置和主题特定选项。 以下屏幕截图显示了编辑器页面的“高级”选项卡。

Grav页面编辑器高级

“高级”选项卡包含三个部分 -

  • Settings

  • Ordering

  • Overrides

Settings

Settings部分处理页面的各种选项。 在这里,您可以设置页面的模板,设置页面的父级,更改页面所在的文件夹名称。

Grav页面编辑器高级

以下字段显示在设置部分中 -

  • Folder Numeric Prefix - 数字设置为提供手动排序。

  • Folder Name - 输入页面所在的文件夹名称。

  • Parent - 为您的页面设置root或少数页面显示为子页面。

  • Page File - 将主题模板设置为要显示的页面。

  • 正文Body Classes - 输入应用于页面正文的类名。

Ordering

此部分用于按特定顺序设置非编号文件夹。

Grav页面编辑器高级

按住四叉箭头并将其移动到某个位置以按特定顺序重新排列页面。

覆盖 (Overrides)

Overrides选项为页面提供了额外的功能,例如缓存,导航可见性,将slug设置为基于文件夹名称设置的默认值以外的其他功能。

Grav页面编辑器高级

以下字段显示在“覆盖”部分中。

  • Menu - 设置要用作菜单的名称。 如果没有设置,则将使用Title

  • Slug - 可以通过此slug变量设置URL的Page部分。

  • Page redirect - 设置页面URL以将其重定向到其他URL。

  • Process - 您希望在页面内容中提供的流程。

  • Default Child Type - 对于子页面,页面类型设置为默认值。

  • Routable - 相应地设置页面以检查URL是否可以访问。

  • Caching - 设置页面的缓存。

  • Visible - 指定页面在导航中是否可见。

  • Display Template - 将模板设置为要显示的页面。

Grav - Blueprints

Blueprints是关于资源(信息源)的元数据信息。 它有两个目的 -

  • 首先是资源标识本身。
  • 其次是表格。

此完整信息保存在每个插件或主题中的blueprints.yaml文件中。

资源标识

blueprints.yaml为每个主题和插件定义文件标识。 在蓝图未经过格式化和完美编译之前,不会在Grav存储库中添加资源。

蓝图示例

name: plugin name
version: 0.6.0
description: Adds an advanced plugin to manage your site
icon: empire
author:
   name: Team Grav
   email: devs@getGrav.org
   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

以下几个属性是可选的,有些属性用于提供您的身份和资源。

Sr.No. 属性和描述
1

name*

提及资源的名称。

2

version*

指定资源的版本。

3

description*

提供有关资源的简要说明。 它不应超过200个字符。

4

icon*

指定用于开发新主题或插件的图标库。

5

author.name*

指定开发人员的名称。

6

author.email (optional)

指定开发人员的电子邮件地址。

7

author.url (optional)

指定开发人员的URL主页。

8

homepage (optional)

为您的资源指定分配的主页首页。

9

docs (optional)

指定您为资源编写的文档链接。

10

demo (optional)

指定演示资源的链接。

11

guide (optional)

指定如何指导资源的指南或教程的链接。

12

keywords (optional)

指定与资源相关的关键字列表。

13

bugs (optional)

指定可以报告问题或错误的Url。

14

license (optional)

指定您的资源许可证,即MIT,GPL等。

15

dependencies (optional)

指定插件或主题所需的依赖项的名称。

以下是登录插件蓝图的示例 -

name: Login
version: 0.3.3
description: Enables user authentication and login screen.
icon: sign-in
author:
   name: Team Grav
   email: devs@getGrav.org
   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配置此资源的一部分, Admin PluginForms元数据定义。

以下是Archives Plugin 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

这些是插件的默认设置。 要在不使用Admin插件的情况下配置它们,用户必须将此文件复制到/user/config/plugins/archives.yaml文件夹中并进行更改。 您可以正确提供archives.yaml文件; 您可以选择从用户更改管理界面中的设置。

保存更改后,它将自动写入《your_folder_name》/user/config/plugins/archives.yaml

Archives Plugin的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: devs@getGrav.org
   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_formatlimit是选项。 此根元素中存在的字段确定类型,大小,标签,默认值和选项。 根据字段类型,其他字段可以更改; 例如,选择字段需要选项列表。

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文件中看到的那样,表单验证设置为strict。 当验证设置为严格时,则对于所有选项,您必须添加蓝图表单,否则在保存时会弹出错误。 当您只想将两个字段自定义为管理界面时,可以将form.validation设置为松散。

下表给出了与上述表格元素相关的字段的简要说明。

Sr.No. 领域和描述
1

Type

表示字段类型。

2

Size

指定字段的大小。

3

Label

指定字段的标签。

4

Validate

它验证字段的类型和字段中输入的最小长度。

5

Default

设置默认字段。

6

Options

指定选项列表。

7

Classes

指定字段的类。

管理员中可用的表单字段

有许多可用的内置表单字段,可供插件和主题使用,也可以创建自己的表单字段。 下表列出了可用的表单字段 -

常见的表单字段

Sr.No. 领域和描述
1

Checkbox

显示单个复选框。

2

Checkboxes

显示复选框列表。

3

Date

包含日期字段。

4

Datetime

包含日期和时间字段。

5

Email

包含带验证的电子邮件地址字段。

6

Password

包含以点格式显示的密码字段。

7

Hidden

包含隐藏的输入字段。

8

Radio

允许从列表中仅选择一个选项。

9

Select

该字段包含几个选项。

10

Spacer

向表单添加标题,文本或水平线。

11

Text

包含普通文本字段。

12

Textarea

包含多行文本输入。

特殊表格领域

Sr.No. 领域和描述
1

Array

添加多个键值行。

2

Ignore

未使用的字段将被删除。

3

Columns

将表单分成多列。

4

Column

显示单个列。

5

Dateformat

设置日期和时间格式。

6

Display

显示没有任何输入值的文本值。

7

Frontmatter

页面以原始格式显示。

8

List

显示没有键的项目列表。

9

Markdown

显示降价编辑器。

10

Pages

显示页面列表。

11

Section

设置页面分为几个部分,每个部分都有一个标题。

12

Selectize

它用于选择框。

13

Tabs

设置分为选项卡列表。

14

Tab

标签字段用于提供标签。

15

Taxonomy

这是一个预先配置的选择,用于选择分类。

16

Toggle

它表示指定打开或关闭输入类型的切换效果。

Grav - Performance & Caching

在本章中,我们将了解Grav中的性能和缓存概念。

表现(Performance)

术语“性能”指的是系统性能,使其能够处理更高的系统负载并修改系统以处理更高的负载。

考虑以下与Grav表现有关的要点 -

  • 要获得更好的opcache性能,可以使用PHP opcacheusercache 。 opcache适用于PHP 5.4,使用PHP 5.5,PHP 5.6和Zend opcache可以更快地运行usercache。

  • SSD (固态硬盘)使用闪存并且没有移动部件。 有时缓存将存储在用户缓存中或存储为文件。 因此SSD驱动器可以提供更好的性能。

  • 虚拟机是在云计算技术下托管提供商的最佳方式。 您可以指定资源而无需与物理设备交互。 Native hosting比虚拟机更快。 Grav在虚拟机上运行得更好,但为了获得最佳性能,您可以使用本机托管选项。

  • Grav具有faster memory ,其缓存使用大量内存,可在服务器上提供更好的性能。 与其他平台相比,它使用更少的内存。

  • Grav使用shared hosting服务器上的共享主机来共享内容。 共享托管以低成本提供,有时可能会导致服务器上的内容变慢。

  • 多核处理器用于更快地处理多个任务。 高级处理器比这些处理器更好,这有助于用户完成任务。

缓存 (Caching)

通常,高速缓存是高速缓存存储器中的存储数据。 缓存机制使Grav更快,浏览器可以从缓存而不是原始服务器获取文件,从而节省时间和额外的网络流量。

Grav使用Doctrine Cache库,它支持以下内容 -

  • 自动(默认) - 它自动使用默认选项。

  • 文件 - 它指定cache/文件夹中存在的cache/文件。

  • APC

  • XCache

  • Memcache

  • Redis

  • WinCache

默认情况下,Grav使用自动设置。 它将尝试APC,然后是WinCache,XCache,最后它使用File。

缓存类型

有5种类型的缓存 -

  • YAML配置缓存到PHP中。

  • 页面对象的核心Grav缓存。

  • Twig将模板文件缓存为PHP类。

  • 媒体资源的图像缓存。

  • 使用流水线技术对CSS和jQuery进行资产缓存。

存储在/cache文件夹中的YAML配置的/cache 。 图像缓存将其图像存储在/images文件夹中。 核心Grav缓存的配置选项存储在user/config/system.yml文件中,如下所示 -

cache:
   enabled: true
   check:
      method: file
   driver: auto
   prefix: 'g'
  • enabled选项通过将其设置为true来enabled缓存。

  • method选项检查页面中的更新,例如文件或文件夹。

  • driver选项指定不同类型的缓存选项,如Auto,File,APC,XCache,Memcache,Redis或WinCache。

  • prefix选项定义缓存前缀字符串。

Memcache选项

如果您使用的是memcached server ,则需要使用user/config/system.yml filememcache驱动程序添加一些额外的配置选项。 可以在cache: group下定义这些选项。

cache:
...
...
   memcache:
      server:localhost
      port: 8080

Redis选项

如果您使用的是redis ,则需要在user/config/system.yml file使用redis驱动程序添加一些额外的配置选项。 可以在cache: group下定义这些选项。

cache:
...
...
   redis:
   	server:localhost
      port: 8080

Twig模板使用自己的缓存机制,在user/config/system.yml文件中使用user/config/system.yml驱动程序。

twig:
   cache: true
   debug: true
   auto_reload: true
   autoescape: false

它有一些选项,如 -

  • cache选项通过将twig缓存设置为true来启用它。

  • debug选项启用twig调试。

  • auto_reload选项用于通过将更改设置为true来重新加载更改。

  • autoescape选项用于自动转义树枝变量。

缓存和事件

启用缓存时可以使用事件。 除OnPageContentRawOnPageProcessedOnPageContentProcessedOnTwigPageVariablesOnFolderProcessed事件外,可以为所有事件启用此功能。 这些事件可以在所有页面和文件夹上使用,并且只能在事件处理时运行。 页面缓存后无法运行这些事件。

Grav - Debugging & Logging

在开发主题和插件时,调试和记录信息是非常必要的。 Grav使用如下所述的一些功能来使用调试信息。

PHP调试栏

Grav附带了一个名为Debug Bar的工具来显示调试信息。 默认情况下,此功能已禁用。 您可以全局system.yaml它,也可以将system.yaml用于您的开发环境。

debugger:
   enabled: true
   twig: true
   shutdown:
      close_connection: true

启用调试器后,您可以查看以下调试栏,如下所示。 单击角落左侧的G符号。

Grav调试和日志记录

debug栏中,您可以查看右侧角落的整体内存使用情况和处理时间。 它还包含几个提供详细信息的选项卡。

Grav调试和日志记录

在“消息”选项卡中,您可以查看有助于调试Grav开发过程的消息,并且信息将通过$Grav['debugger']→addMessage($my_var)从代码发布到此选项卡。

Grav调试和日志记录

在“时间轴”选项卡中,您可以查看Grav计时的细分。

错误显示

它在运行时显示有关块或页面的错误消息。 在Grav中,您可以轻松识别错误并快速解决错误。 以下是将显示在屏幕上的错误消息,如以下屏幕截图所示。

Grav调试和日志记录

user/config/system.yaml文件中,您可以通过将其设置为false来禁用错误页面。

errors:
   display: false
   log: true

日志记录 (Logging)

日志记录用于报告库和应用程序中的错误和状态信息。 在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命令行界面。 它执行一些任务,例如clearing cache ,创建backup副本等。

在不同平台上访问CLI是不同的。 在Windows上,您可以通过cmd访问,在Mac上可以通过Terminal访问,在Linux上可以使用shell。 在Windows中,您不能使用UNIX样式命令。 要使用它们,只需安装提供GIT和GIT BASH的msysgit包,并在Windows上提供UNIX样式命令。

您可以使用以下命令列出Grav中的可用命令 -

$ bin/Grav list

您可以看到可用的命令,如以下屏幕截图所示 -

Grav CLI

新项目创建

使用Grav创建新项目非常简单。 您可以使用Grav实例创建新项目。

  • 打开terminalconsole ,然后导航到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/文件夹中存储的cache/ 。 要清除缓存,可以使用以下命令 -

$ cd ../webroot/myproject
$ bin/Grav clear-cache

创建备份

在Grav中,您可以备份存储在根文件夹下的项目。 因为它不会使用数据库所以备份没有困难。 如果要创建名为myproject( ../webroot/myproject myproject)的项目备份,请使用以下命令 -

$ cd ../webroot/myproject
$ bin/Grav backup

您将看到在backup/文件夹下创建的backup/的zip文件。

更新Composer

您可以更新通过Github安装并使用基于作曲家的供应商包手动安装的Grav编辑器。 命令是 -

$ bin/Grav composer

Grav - GPM

GPM代表Grav Package Manager,用于安装,更新,卸载和列出Grav存储库上的可用插件。 GPM使用命令行界面(如终端或cmd)执行命令。

您可以非常轻松地访问CLI。 在Windows上,您可以通过cmd访问,在Mac上可以通过Terminal访问,在Linux上可以使用shell 。 在Windows中,您不能使用UNIX样式命令。 要使用它们,只需安装提供GIT和GIT BASH的msysgit包,并在Windows上提供UNIX样式命令。

要列出Grav存储库上的可用命令,请将命令键入 -

$ bin/gpm list

您将收到以下信息 -

Grav GPM

您可以通过向该行添加帮助来帮助命令,如下所示 -

$ bin/gpm help install

您可以使用以下命令在命令行界面上找到PHP的版本 -

$ php -v

Grav GPM

它是如何工作的?

在命令行界面上运行命令时,GPM会自动从GetGrav.org站点下载所需的数据。 它包括可用软件包的所有详细信息,还确定了需要安装的软件包以及需要更新的软件包。

当您从存储库下载软件包时,Grav存储库将在本地缓存,并且在生成缓存后,任何请求都无法联系GetGrav.org服务器。

某些命令带有--force (-f)选项,强制重新获取存储库。 使用此选项,在清除缓存之前无需等待24小时循环。

Commands

您可以使用某些命令从Grav存储库下载可用的包。 要使用该命令,请打开终端并导航到Grav文件夹的根目录并键入bin/gpm 《command》

Index

index命令用于列出Grav存储库中的可用插件和主题。 在终端中使用以下命令列出可用资源。

$ bin/gpm index

Grav GPM

每行定义插件或主题的名称,slug,插件或主题的版本,并显示它是否已安装。

Info

info命令用于显示有关包的信息,如作者,版本,上次更新的日期和时间,包的存储库,包的下载链接,许可证信息等。

Grav GPM

Install

顾名思义,install命令从Grav存储库安装包所需的资源。

您可以使用以下命令安装所需的程序包。

$ bin/gpm install package_name

Grav GPM

如果您尝试安装已安装的软件包,则会通知下一步该做什么。

Grav GPM

如果键入Y ,它将覆盖已安装的软件包,如果键入N ,则将中止安装过程。

更新 (Update)

update命令通知有关需要更新的包。 假设所有软件包都是最新的,那么它将不会更新任何内容。

$ bin/gpm update

Grav GPM

Self-upgrade

自升级命令用于将Grav升级到最新版本。 使用以下命令升级Grav。

$ bin/gpm self-upgrade

如果您使用的是最新版本的Grav,那么它将显示一条消息“您已经在运行最新版本的Grav”以及发布日期和屏幕中显示的时间。

Grav GPM

Grav - Development

您可以使用不同类型的Development来构建Grav,例如Grav CoreGrav PluginsGrav SkeletonGrav Themes

Grav核心

Grav是一个现代化的CMS,其中写作内容简单,构建页面更友好和直观。 Grav core专门讨论了控制Grav一切的系统文件夹,并代表了Grav工作流程和生命周期的质量。 它主要关注可以良好编写的页面。 它专注于您的内容并将您的内容转换为可导航的网站。

Grav插件

Plugin是一款提供增强功能的软件,最初并未由Grav的核心功能完成。 Grav存储库上有许多插件可以显示网站上的功能。

考虑以下与Grav插件相关的要点 -

  • Grav本身就是super-lean ,只为您的网站添加了所需的插件。

  • 无需等待添加所需的额外功能。 要实现这一点,只需创建一个插件来扩展Grav。

  • 插件非常灵活和强大,可以显示站点地图,博客档案,搜索引擎,提供面包屑等。

格拉夫骷髅

Grav skeleton描述了一个示例站点,其中包含Grav Core,插件,页面,主题。 Grav背后的最初想法是非常容易地建立网站。 开发站点所需的全部内容都放在user文件夹中。 Grav的骨架带有各种依赖项,如插件,主题等,并存储在一个可以解压缩的包中。

格拉夫主题

Grav支持不同类型的themes它们构成了Grav网站不可或缺的一部分。 当您在系统上安装Grav时,它会附带Antimatter主题。 大多数主题都带有骨架包或样本页面。 您可以在user/pages文件夹下看到示例页面,它提供与骨架包类似的体验。

已安装的主题需要适合您网页的twig templates 。 主题是主题和内容的组合,等于整个网站设计。 您可以根据自己的设计创建自己的树枝模板引擎。

主题/插件发布流程

您可以注意到在Grav存储库中添加的已创建主题或插件的一些要点。

  • 它是一个由MIT许可的开源软件。

  • 它具有README.md文件,该文件指定项目的安装过程和配置。

  • 它包含blueprints.yaml文件,其中包含有关资源的信息,可以在每个插件和主题的根目录中找到。

  • 包含CHANGELOG.md文件,其中包含主题或插件的版本,并在对文件进行更改时显示信息。

  • 创建发行版是将完成的主题或插件放在GitHub上的更好方法。 如果没有发布,那么您将找不到您的插件或主题。

  • 添加有关插件或主题的详细信息,并进行测试以确保其工作功能。

ChangeLog格式

changelog format使用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 - Lifecycle

在本章中,我们将了解Grav的生命周期。 Grav Lifecycle确定Grav如何处理以通过插件扩展Grav。 下图显示了Grav生命周期过程的流程。

Grav生命周期

Grav生命周期的以下四个步骤 -

  • PHP Version

  • Loader class is initialized

  • Obtain Grav Instance

  • Call Grav Process

PHP版本

它检查PHP的版本以确保我们运行的是5.4.0以上的PHP版本。

Loader类已初始化

在第二步中,类加载器被初始化。

获取Grav实例

  • 如果不存在实例,则调用load()方法并添加Grav。

  • 它初始化调试器值并添加到调试器。

  • 它注册日志和错误处理程序。

  • 它添加了uri,任务,事件,缓存,会话,插件,主题,树枝,分类,语言,页面,资产和基本URL。

  • 它注册流和配置处理程序。

调用Grav Process

  • 它初始化配置,Uri对象,错误处理程序,调试器和会话。

  • 初始化后,它开始缓冲输出。

  • 它初始化时区和插件并触发onPluginsInitialized事件。

  • 接下来,它初始化主题并触发onThemeInitializedonTask[TASK]事件。

  • 它初始化资产并触发onAssetsInitialized事件。

  • 它通过以下操作初始化树枝 -

    • 根据配置,它设置树枝模板路径。

    • 处理可用的语言模板。

    • 接下来,它将触发onTwigTemplatePaths事件。

    • 装载链和树枝配置已加载。

    • 触发onTwigInitialized事件。

    • 它加载onTwigExtensions扩展并触发onTwigExtensions事件。

    • 它设置标准树枝变量。

  • 接下来它初始化页面。

    • 它调用buildPages()方法。

    • 如果缓存很好,那么它从缓存加载页面。 如果缓存不好,则调用recurse()方法。

    • onBuildPagesInitialized事件在recurse()方法中触发。

    • 如果找到文件为.md ,则执行以下操作 -

      • 要加载文件详细信息,请调用init()方法。

      • 它设置filePath,modified和id。

      • 调用header()方法来初始化头变量。

      • 调用slug()方法来设置URL slug。

      • 调用visible()方法来设置可见状态。

      • 基于以_(下划线)开头的文件夹,设置modularTwig()

    • 它稍后会触发onPageProcessed事件。

    • 如果找到文件夹,则recurse()子项。

    • 它会触发onFolderProcessed事件。

    • 调用buildRoutes()方法。

    • 对于所有页面,初始化taxonomy

    • route表是为快速查找而构建的。

  • onPagesInitializedonPageInitialized事件被触发。

  • 调试器CSS/JS被添加到资产中。

  • 使用Twig的processSite()方法,我们得到输出。

    • onTwigSiteVariables事件被触发。

    • 获取页面的输出。

    • 如果找不到页面或无法路由, onPageNotFound触发事件onPageNotFound

    • 所有Twig变量都在twig对象上设置。

    • 根据文件/标题/扩展名信息设置模板名称。

    • 调用render()方法。

    • 以HTML格式返回文件格式

  • 它会触发onOutputGenerated事件。

  • 设置HTTP标头。

  • 显示输出

  • 输出缓冲区刷新到页面。

  • onOutputRendered事件将会触发。

  • 关闭与客户端的连接。

  • 最后,它会触发onShutDown事件。

在页面上调用content()方法时,将发生以下生命周期。

  • onPageContentRaw事件将起火。

  • 根据Markdown和Twig设置,它处理页面。

  • 它会触发onPageContentProcessed事件。

Grav - YAML Syntax

YAML代表YAML Ain't Markup Language ,它包括人类可读的内容,常用于配置文件,蓝图(有关资源的元数据信息)和页面设置。

特点 (Features)

以下是YAML的特点 -

  • 与XML或JSON相比,YAML不那么复杂并且提供相同的功能。

  • 它提供配置设置,无需学习复杂的代码类型,如CSS,JavaScript或PHP。

  • YAML描述了YAML文件的数据和内容,可以轻松地将其转换为多种语言类型。

YAML的基本规则

YAML有一些基本规则,用于减少多种语言和可编辑程序的歧义。

  • 您必须以.yaml扩展名结束YAML文件。

  • YAML必须区分大小写。

  • YAML不支持使用制表符。 它不使用制表符,而是使用通用不支持的空格。

YAML的基本数据类型

YAML支持一些可用于编程语言的基本数据类型,例如 -

  • Scalars - 字符串或数字。

  • Sequences - 数组或列表。

  • Mappings - 哈希或词典。

标量 (Scalars)

标量是在页面上使用字符串或数字来处理数据的基本数据类型。 它可以是boolean property (是或否), integer value (如2)或文本string (如单词或句子或网站标题)。

例如 -

string: "Grav"
integer: 10
float: 10.5
boolean: true

有时标量会带有不带引号的值,如整数,浮点数或布尔值。 字符串值使用标点符号,该标点符号带有单引号或双引号,它使用转义来指定ASCII和Unicode字符。

序列(Sequences)

YAML以数组或列表的形式表示序列。 它定义了每个项目,并在列表中放置了开头短划线( - ),如下所示。

例如 -

- Apple
- Orange
- Grapes

假设您要使用子项定义嵌套序列,然后在子项中的每个短划线之前放置一个空格。

例如 -

-
   - Apple
   - Orange
   - Grapes

如果你想在嵌套列表中嵌套序列,那么添加一些级别,如下所示 -

例如 -

-
   -
      - Apple
      - Orange
      - Grapes

Mappings

这是一种定义键和值的方法。

例如,您可以为特定元素指定一些值 -

Sports: cricket

这里的值是“板球”,用称为“体育”的键映射。 您可以将此映射与序列一起使用,以指定板球项目列表; 例如,我们将为值“cricket”定义一些玩家名称,使名称为child, Sports: cricket为parent。

Sports: cricket
- Sachin Tendulkar
- Rahul Dravid
- M S Dhoni

Grav - Forms

您可以使用此link提供的form插件创建表单。 搜索表单插件并将其安装在Grav文件夹中。

您也可以使用命令$ bin/gpm install Form安装此插件。 导航到Grav的根文件夹并键入此命令。 它将自动下载表单插件并安装必要的依赖项。

创建一个简单的表单

您可以创建一个可以在页面YAML frontmatter中定义的简单表单。 以下是表格的一个例子 -

---
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
---

上面的代码显示了包含名称,电子邮件,消息和Captcha字段的简单表单页面。 填写表单后提交信息时,表单将通过向YAML前端添加process字段来处理,如代码所示。

process字段使用以下信息 -

  • email选项使用两个字段,例如from字段指定电子邮件的发件人和字段指定邮件的接收者。

  • subject使用[feedback][entered mail]选项,其中电子邮件将发送到输入的电子邮件。

  • 电子邮件的正文在forms/data.html.twig文件中指定,该文件存在于主题文件夹中。

  • 表单输入数据存储在user/data文件夹下。 模板在forms/data.txt.twig文件中定义,该文件存在于主题文件夹中。

  • thankyou/ sub文件夹下创建一个子页面,当用户提交表单时,该子页面将被重定向到该页面。

您可以将一些字段与表单插件一起使用,如下表所示 -

Sr.No. 领域和描述
1

Captcha

它是一个反垃圾邮件字段,用于计算以确定用户是否是人。

2

Checkbox

它显示一个简单的复选框。

3

Checkboxes

它显示多个复选框。

4

Date and Datetime

这两个字段分别用于显示日期和日期以及时间。

5

Email

这是一个带验证的电子邮件字段。

6

Hidden

它指定隐藏字段。

7

Password

它指定密码字段。

8

Radio

它显示简单的单选按钮。

9

Select

它提供选择字段。

10

Spacer

它允许向表单添加标题,文本或水平线。

11

Text

它显示简单的文本字段。

12

Textarea

它显示简单的文本区域字段。

13

Display

它显示文本或指令字段,而不是输入字段。

字段参数

每个字段都接受以下参数,这些参数可用于自定义表单中的外观。

Sr.No. 参数和描述
1

label

它定义了标签字段。

2

validate.required

它使元素成为必需。

3

validate.pattern

它指定验证模式。

4

validate.message

它在验证失败时显示消息。

5

type

它定义了字段类型。

6

default

它定义默认字段类型。

7

size

它显示字段大小,如大,x小,中,长,小。

8

name

它定义了字段名称。

9

classes

它使用带有css类的字符串。

10

id

它定义了字段id。

11

style

它指定了该字段的样式。

12

title

它定义了字段的标题。

13

disabled

它确定该字段是否处于禁用状态。

14

placeholder

这是一个简短的提示,在用户输入值之前显示在输入字段中。

15

autofocus

它指定输入元素应在页面加载时自动获得焦点。

16

novalidate

它指定在提交时不应验证表单数据。

17

readonly

它将字段确定为只读状态。

18

autocomplete

当用户开始在字段中键入时,它会在字段中显示选项,并根据先前键入的值显示值。

某些字段包含特定参数,例如 -

Sr.No. 参数和描述
1

date and datetime

这些字段使用validate.minvalidate.max来设置最小值和最大值。

2

spacer

它使用underline添加《hr》标记,使用text添加文本值并使用title作为“h3”标记。

3

select

它使用multiple参数来添加多个值。

4

select and checkboxes

它使用options字段来设置可用选项。

5

display

它使用content参数来显示内容。 它将markdown设置为true以显示内容。

6

captcha

它使用recatpcha_site_keyrecaptcha_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选项,其中将电子邮件发送到通过主题[联系人] [输入的名称]输入的电子邮件,并且电子邮件的正文在主题的forms/data.html.twig文件中定义。

重定向到其他页面

您可以使用在process字段下定义的messagedisplay选项重定向到另一个页面。

process:
   - message: Thank you for getting in touch!
   - display: thankyou

message选项设置一条消息,当用户单击提交按钮时应显示该message 。 当用户提交表单时,应将其重定向到另一个页面。 在存储form.md文件的thankyou子文件夹下创建一个子form.md 。 提交表单后,它将被重定向到页面上并显示上述消息。

名为thankyou/formdata.md的子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 - Web Hosting

托管(也称为网站托管)是维护和组织网站并通过万维网提供对网站的访问的过程。 简而言之,您可以说,它是一种为互联网上的网站提供服务的平台。

Grav支持不同类型的托管服务 -

  • Rochen Web Hosting

  • WireNine

  • Crucial Web Hosting

  • Arvixe

  • SiteGround

  • Dreamhost

Rochen网页寄存

它可以用作GetGrav.orgRocketTheme.com作为长期托管服务提供商。 它使用SSD驱动器,Litespeed Web服务器和Intel XEON处理器来增强Grav性能。 它提供两种类型的选择; 一个是Shared主机,另一个是Burst主机。

格拉夫托管

有关Rochen Web Hosting的更多信息,请单击此link

WireNine

WireNine为超过665个国家/地区的客户提供可靠的网络托管服务。 它使用Intel Xeon E5 v3 CPU,DDR4 ECC ram和冗余RAID SSD存储来增强服务器的功能。 它提供最大的可靠性和稳定性,确保100%的正常运行时间。 它包括优化的软件,如CloudLinux,Litespeed,MariaDB,PHP,Ruby,Python,Perl等。

格拉夫托管

有关WireNine托管的信息,请访问此link

Crucial虚拟主机

它是另一种Web托管类型,它更侧重于速度和支持。 它使用SSD驱动器,Litespeed Web服务器和Intel XEON处理器来增强Grav性能。

格拉夫托管

您可以在此link获得有关Crucial Web Hosting的更多信息。

Arvixe

Arvixe是一种网络托管类型,它提供无与伦比的可靠性,质量和可负担性的Web托管。 它在网络托管领域提供了良好的功能,赢得了众多的网络托管奖项。

格拉夫托管

有关Arvixe Web Hosting的更多信息,请单击此link

SiteGround (SiteGround)

它为Joomla,WordPress,Magento和其他Web应用程序提供托管解决方案。 它的标语为Web Hosting Crafted With Care ,它可以仔细处理Web托管计划,并提供使您的网站运行更快的新技术。

格拉夫托管

只需访问此link以获取有关SiteGround托管的信息。

Dreamhost (Dreamhost)

它通过为您的个人或业务相关的Web托管需求提供更多功能来提供功能列表。 它拥有超高速SSD和新的专用服务器,最高可达64GB RAM。

格拉夫托管

有关Dreamhost虚拟主机的更多信息,请单击此link

Grav - Server Error

由于Grav配置错误导致服务器错误。 当服务器遇到内部错误或意外发生的事情时,Grav无法提供并恢复页面。

如果服务器在生产模式下运行,要隐藏用户的信息,则会出现服务器错误消息。 所有错误消息都记录在文件《your_folder_name》/logs/Grav.log下的Grav.log文件中。

以下是可能导致服务器错误的一些原因 -

  • 过时的配置
  • 文件权限不正确
  • 格式化的配置文件无效
  • Grav不知道文件系统的变化

Out-of-date configuration

您可以刷新缓存以检查配置是否是最新的。 使用以下命令刷新缓存。

bin/Grav clear-cache

安装和配置问题

安装和配置的问题是 -

  • 配置问题
  • 安装问题
  • 系统要求
  • 文件权限

Grav - Permission

通常, permission是允许在托管环境中执行某些操作的过程。 该权限包括对服务器上文件的读写访问权限或编辑文件系统上的文件。 Grav是一个基于平面文件的CMS,需要写入文件系统以创建缓存和日志文件。

Grav有三种主要情景 -

PHP/Webserver与编辑文件的用户一起运行

此方案适用于大多数共享主机设置以及本地开发。 在专用的Web主机上,我们不能认为这种方法足够安全。

PHP/Webserver使用不同的帐户运行,但同一组

使用用户和PHP/Webserver帐户之间使用共享组的775664权限,您可以确保两个不同的帐户具有对文件的Read/Write访问权限。 我们可以通过在root上使用适当的权限设置umask 0002来创建新文件。

不同的帐户,手动修复权限

此方法将具有不同的帐户并更新文件的所有权和权限,以确保PHP/Webserver用户将对文件具有Read/Write访问权限。

以下是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 * line将文件和子文件夹的所有权更改为joeblow和staff。

  • 该线find . -type f ! -path "./bin/" | xargs chmod 664 find . -type f ! -path "./bin/" | xargs chmod 664 find . -type f ! -path "./bin/" | xargs chmod 664为目录中的所有文件设置664权限,为其他文件设置Read ,为组和用户设置Read/Write

  • 该线find . -type f -path "./bin/" | xargs chmod 775 find . -type f -path "./bin/" | xargs chmod 775 find . -type f -path "./bin/" | xargs chmod 775为目录中的所有文件设置775个权限,为其他文件设置RX ,为组和用户设置RWX

  • umask 0002用于创建具有664和775权限的新文件。

↑回到顶部↑
WIKI教程 @2018