解析器服务

介绍

October使用多种标准来处理标记,模板和配置。 每个都经过精心挑选,以尽可能简化您的开发过程和学习曲线。 例如,主题中找到的对象 在其模板结构中使用TwigINI格式 。 下面更详细地描述每个解析器。

Markdown解析器

Markdown允许您编写易于阅读且易于编写的纯文本格式,然后转换为HTML。 Markdown facade用于解析Markdown语法,基于GitHub flavored markdown。 Markdown的一些简单例子:

  1. This text is **bold**, this text is *italic*, this text is ~~crossed out~~.
  2. # The largest heading (an <h1> tag)
  3. ## The second largest heading (an <h2> tag)
  4. ...
  5. ###### The 6th largest heading (an <h6> tag)

使用Markdown::parse方法将Markdown渲染为HTML:

  1. $html = Markdown::parse($markdown);

您也可以使用| md过滤器解析前端标记中的Markdown

  1. {{ '**Text** is bold.'|md }}

Twig模板解析器

Twig是一个简单但功能强大的模板引擎,它将HTML模板解析为优化的PHP代码,它是前端标记视图内容邮件消息内容

Twig facade用于解析Twig语法,你可以使用Twig::parse方法将Twig渲染为HTML。

  1. $html = Twig::parse($twig);

第二个参数可用于将变量传递给Twig标记。

  1. $html = Twig::parse($twig, ['foo' => 'bar']);

可以通过插件注册文件.扩展Twig解析器以注册自定义功能。

Bracket解析器

October还附带了一个简单的括号模板解析器,作为Twig解析器的替代,目前用于将变量传递给主题内容块。 此引擎可以更快地呈现HTML,并且更适合非技术用户。 这个解析器没有facade,因此完全限定的October\Rain\Parse\Bracket类应该与parse方法一起使用。

  1. use October\Rain\Parse\Bracket;
  2. $html = Bracket::parse($content, ['foo' => 'bar']);

语法使用单数花括号来渲染变量:

  1. <p>Hello there, {foo}</p>

您还可以传递一组对象作为变量进行解析。

  1. $html = Template::parse($content, ['likes' => [
  2. ['name' => 'Dogs'],
  3. ['name' => 'Fishing'],
  4. ['name' => 'Golf']
  5. ]]);

可以使用以下语法迭代该数组:

  1. <ul>
  2. {likes}
  3. <li>{name}</li>
  4. {/likes}
  5. </ul>

YAML配置解析器

YAML(“YAML不是标记语言”)是一种配置格式,类似于Markdown,它被设计成易于阅读且易于编写的格式,可转换为PHP数组。 实际上它几乎用于October的后端开发,例如表单字段list column 定义。 一些YAML的例子:

  1. receipt: Acme Purchase Invoice
  2. date: 2015-10-02
  3. user:
  4. name: Joe
  5. surname: Blogs

Yaml facade用于解析YAML,你可以使用Yaml::parse方法将YAML呈现给PHP数组:

  1. $array = Yaml::parse($yamlString);

使用parseFile方法解析文件的内容:

  1. $array = Yaml::parseFile($filePath);

解析器还支持反向操作,从PHP数组输出YAML格式。 您可以使用render方法:

  1. $yamlString = Yaml::render($array);

初始化(INI)配置解析器

INI文件格式是用于定义简单配置文件的标准,通常由主题模板内的组件使用。 它可以被认为是YAML格式的堂兄,虽然与YAML不同,它非常简单,对拼写错误不太敏感,也不依赖于缩进。 它支持带有节的基本键值对,例如:

  1. receipt = "Acme Purchase Invoice"
  2. date = "2015-10-02"
  3. [user]
  4. name = "Joe"
  5. surname = "Blogs"

Ini facade用于解析INI,你使用Ini::parse方法将INI渲染到PHP数组:

  1. $array = Ini::parse($iniString);

使用parseFile方法解析文件的内容:

  1. $array = Ini::parseFile($filePath);

解析器还支持反向操作,从PHP数组输出INI格式。 您可以使用render方法:

  1. $iniString = Ini::render($array);

October风格的INI

通常,PHP函数parse_ini_string使用的INI解析器仅限于3级深度的数组。 例如:

  1. level1Value = "foo"
  2. level1Array[] = "bar"
  3. [level1Object]
  4. level2Value = "hello"
  5. level2Array[] = "world"
  6. level2Object[level3Value] = "stop here"

October使用October风格的INI扩展了此功能,以允许无限深度的数组,受HTML表单语法的启发。 继上面的示例之后,支持以下语法:

  1. [level1Object]
  2. level2Object[level3Array][] = "Yay!"
  3. level2Object[level3Object][level4Value] = "Yay!"
  4. level2Object[level3Object][level4Array][] = "Yay!"
  5. level2Object[level3Object][level4Object][level5Value] = "Yay!"
  6. ; ... 超越无限!

动态语法解析器

动态语法是October独有的模板引擎,从根本上支持两种渲染模式。 解析模板将产生两个结果,viewedit模式。 以此模板文本为例,{text} ... {/ text}标签的内部部分代表view模式的默认文本,而内部属性,namelabel,用作edit模式的属性。

  1. <h1>{text name="websiteName" label="Website Name"}Our wonderful website{/text}</h1>

此解析器没有facade,因此完全限定的October\Rain\Parse\Syntax\Parser类应与parse方法一起使用。 parse方法的第一个参数将模板内容作为字符串并返回一个Parser对象。

  1. use October\Rain\Parse\Syntax\Parser as SyntaxParser;
  2. $syntax = SyntaxParser::parse($content);

查看模式

假设我们使用上面的第一个示例作为模板内容,调用render方法本身将使用默认文本呈现模板:

  1. echo $syntax->render();
  2. // <h1>Our wonderful website</h1>

就像任何模板引擎一样,将变量数组传递给render的第一个参数将替换模板中的变量。 这里websiteName的默认值被替换为我们的新值:

  1. echo $syntax->render(['websiteName' => 'OctoberCMS']);
  2. // <h1>OctoberCMS</h1>

作为一个额外的功能,调用toTwig方法将输出准备状态的模板,以便由Twig引擎.进行渲染。

  1. echo $syntax->toTwig();
  2. // <h1>{{ websiteName }}</h1>

编辑模式

到目前为止,动态语法解析器与常规模板引擎没有太大区别,但编辑器模式是动态语法的实用程序变得更加明显的地方。 编辑器模式解锁了一个新的可能性领域,例如,布局将自定义表单字段注入页面属于它们或动态构建的表单用于电子邮件.。

继续上面的示例,在Parser对象上调用toEditor方法将返回一个PHP数组属性,这些属性定义如何填充变量,例如由表单构建器。

  1. $array = $syntax->toEditor();
  2. // 'websiteName' => [
  3. // 'label' => 'Website name',
  4. // 'default' => 'Our wonderful website',
  5. // 'type' => 'text'
  6. // ]

您可能会注意到这些属性与 表格字段定义中的选项非常相似。 这是故意的,因此这两个特征相互补充。 我们现在可以轻松地将上面的数组转换为YAML并写入fields.yaml文件:

  1. $form = [
  2. 'fields' => $syntax->toEditor()
  3. ];
  4. File::put('fields.yaml', Yaml::render($form));

支持的标签

动态语法分析器可以使用各种标记类型,这些标记类型旨在匹配常见的表单字段类型

Text

单行输入,用于较小的文本块。

  1. {text name="websiteName" label="Website Name"}Our wonderful website{/text}

Textarea

多行输入,用于较大的文本块。

  1. {textarea name="websiteDescription" label="Website Description"}
  2. This is our vision for things to come
  3. {/textarea}

Dropdown

呈现下拉表单字段。

  1. {dropdown name="dropdown" label="Pick one" options="One|Two"}{/dropdown}

Radio

呈现表单单选字段。

  1. {radio name="radio" label="Thoughts?" options="y:Yes|n:No|m:Maybe"}{/radio}

Variable

完全按照type属性中的定义呈现表单字段类型。 此标记将只设置一个变量,并在视图模式下呈现为空字符串。

  1. {variable type="text" name="name" label="Name"}John{/variable}

Rich editor

富内容的文本输入(WYSIWYG)。

  1. {richeditor name="content" label="Main content"}Default text{/richeditor}

以Twig渲染为

  1. {{ content|raw }}

Markdown

Markdown内容的文本输入。

  1. {markdown name="content" label="Markdown content"}Default text{/markdown}

以Twig渲染为

  1. {{ content|md }}

Media finder

媒体库项目的文件选择器。 此标记值将包含文件的相对路径。

  1. {mediafinder name="logo" label="Logo"}defaultlogo.png{/mediafinder}

以Twig渲染为

  1. {{ logo|media }}

File upload

文件的文件上传输入。 此标记值将包含文件的完整路径。

  1. {fileupload name="logo" label="Logo"}defaultlogo.png{/fileupload}

Repeater

渲染一个包含其他字段的重复部分。

  1. {repeater name="content_sections" prompt="Add another content section"}
  2. <h2>{text name="title" label="Title"}Title{/text}</h2>
  3. <p>{textarea name="content" label="Content"}Content{/textarea}</p>
  4. {/repeater}

以Twig渲染为

  1. {% for fields in repeater %}
  2. <h2>{{ fields.title }}</h2>
  3. <p>{{ fields.content|raw }}</p>
  4. {% endfor %}

调用$syntax-> toEditor将为转发器字段返回一个不同的数组:

  1. 'repeater' => [
  2. 'label' => 'Website name',
  3. 'type' => 'repeater',
  4. 'fields' => [
  5. 'title' => [
  6. 'label' => 'Title',
  7. 'default' => 'Title',
  8. 'type' => 'text'
  9. ],
  10. 'content' => [
  11. 'label' => 'Content',
  12. 'default' => 'Content',
  13. 'type' => 'textarea'
  14. ]
  15. ]
  16. ]

转发器字段还支持组模式,与动态语法分析器一起使用,如下所示:

  1. {variable name="sections" type="repeater" prompt="Add another section" tab="Sections"
  2. groups="$/author/plugin/repeater_fields.yaml"}{/variable}

这是repeater_fields.yaml组配置文件的示例:

  1. quote:
  2. name: Quote
  3. description: Quote item
  4. icon: icon-quote-right
  5. fields:
  6. quote_position:
  7. span: auto
  8. label: Quote Position
  9. type: radio
  10. options:
  11. left: Left
  12. center: Center
  13. right: Right
  14. quote_content:
  15. span: auto
  16. label: Details
  17. type: textarea

有关转发器组模式的更多信息,请参阅Repeater Widget