ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 动态解析器语法 ### [](https://octobercms.com/docs/services/parser#dynamic-syntax-parser)动态语法解析器 动态语法是十月份独有的模板引擎,从根本上支持两种渲染模式。解析模板将产生两个结果,即**视图**或**编辑器**模式。以该模板文本为例,`{text}...{/text}`标签的内部部分表示**视图**模式的默认文本,而内部属性`name`和`label`用作**编辑器**模式的属性。 ~~~ <h1>{text name="websiteName" label="Website Name"}Our wonderful website{/text}</h1> ~~~ 该解析器没有外观,因此`October\Rain\Parse\Syntax\Parser`应将完全限定的类与该`parse`方法一起使用。该`parse`方法的第一个参数将模板内容作为字符串并返回一个`Parser`对象。 ~~~ use October\Rain\Parse\Syntax\Parser as SyntaxParser; $syntax = SyntaxParser::parse($content); ~~~ ### [](https://octobercms.com/docs/services/parser#syntax-view-mode)查看模式 假设我们使用上面的第一个示例作为模板内容,调用该`render`方法本身将使用默认文本呈现模板: ~~~ echo $syntax->render(); // <h1>Our wonderful website</h1> ~~~ 就像任何模板引擎一样,将变量数组传递给的第一个参数`render`将替换模板中的变量。此处的默认值`websiteName`替换为我们的新值: ~~~ echo $syntax->render(['websiteName' => 'OctoberCMS']); // <h1>OctoberCMS</h1> ~~~ 作为一项额外功能,调用该`toTwig`方法将以准备好的状态输出模板,以供[Twig引擎](https://octobercms.com/docs/services/parser#twig-parser)渲染。 ~~~ echo $syntax->toTwig(); // <h1>{{ websiteName }}</h1> ~~~ ### [](https://octobercms.com/docs/services/parser#syntax-editor-mode)编辑器模式 到目前为止,动态语法解析器与常规模板引擎没有太大区别,但是在编辑器模式下,动态语法的实用性变得更加明显。编辑器模式开启了一个新的可能性领域,例如,[布局将自定义表单字段注入到](http://octobercms.com/plugin/rainlab-pages)属于它们的[页面](http://octobercms.com/plugin/rainlab-pages)或用于[电子邮件活动中动态生成的表单](http://octobercms.com/plugin/responsiv-campaign)。 继续上面的示例,`toEditor`在`Parser`对象上调用方法将返回一个PHP属性数组,该数组定义应如何使用表单生成器填充变量。 ~~~ $array = $syntax->toEditor(); // 'websiteName' => [ // 'label' => 'Website name', // 'default' => 'Our wonderful website', // 'type' => 'text' // ] ~~~ 您可能会注意到,这些属性与[表单字段定义中](https://octobercms.com/docs/backend/forms#form-fields)的选项非常相似。这是有意的,因此这两个功能可以相互补充。现在,我们可以轻松地将上面的数组转换为YAML并写入`fields.yaml`文件: ~~~ $form = [ 'fields' => $syntax->toEditor() ]; File::put('fields.yaml', Yaml::render($form)); ~~~ ### [](https://octobercms.com/docs/services/parser#syntax-supported-tags)支持的标签 动态语法解析器可以使用多种标记类型,这些标记类型旨在匹配常见的[表单字段类型](https://octobercms.com/docs/backend/forms#field-types)。 #### 文本 单行输入,用于较小的文本块。 ~~~ {text name="websiteName" label="Website Name"}Our wonderful website{/text} ~~~ #### 文字区 多行输入用于较大的文本块。 ~~~ {textarea name="websiteDescription" label="Website Description"} This is our vision for things to come {/textarea} ~~~ ### 落下 呈现一个下拉表单字段。 ~~~ {dropdown name="dropdown" label="Pick one" options="One|Two"}{/dropdown} ~~~ 呈现具有独立值和标签的下拉表单字段。 ~~~ {dropdown name="dropdown" label="Pick one" options="one:One|two:Two"}{/dropdown} ~~~ 使用静态类方法(该类必须是完全命名空间的类)返回的数组呈现下拉表单字段。 ~~~ {dropdown name="dropdown" label="Pick one" options="\Path\To\Class::method"}{/dropdown} ~~~ ### 无线电 渲染单选表单字段。 ~~~ {radio name="radio" label="Thoughts?" options="y:Yes|n:No|m:Maybe"}{/radio} ~~~ #### 变量 完全按照`type`属性中的定义呈现表单字段类型。此标记将仅设置一个变量,并在视图模式下呈现为空字符串。 ~~~ {variable type="text" name="name" label="Name"}John{/variable} ~~~ #### 丰富的编辑 用于丰富内容的文本输入(WYSIWYG)。 ~~~ {richeditor name="content" label="Main content"}Default text{/richeditor} ~~~ 在Twig中呈现为 ~~~ {{ content|raw }} ~~~ #### 降价促销 Markdown内容的文本输入。 ~~~ {markdown name="content" label="Markdown content"}Default text{/markdown} ~~~ 在Twig中呈现为 ~~~ {{ content|md }} ~~~ #### 媒体搜寻器 媒体库项目的文件选择器。该标记值将包含文件的相对路径。 ~~~ {mediafinder name="logo" label="Logo"}defaultlogo.png{/mediafinder} ~~~ 在Twig中呈现为 ~~~ {{ logo|media }} ~~~ #### 上传文件 文件的文件上传器输入。该标记值将包含文件的完整路径。 ~~~ {fileupload name="logo" label="Logo"}defaultlogo.png{/fileupload} ~~~ #### 直放站 渲染一个包含其他字段的重复节。 ~~~ {repeater name="content_sections" prompt="Add another content section"} <h2>{text name="title" label="Title"}Title{/text}</h2> <p>{textarea name="content" label="Content"}Content{/textarea}</p> {/repeater} ~~~ 在Twig中呈现为 ~~~ {% for fields in repeater %} <h2>{{ fields.title }}</h2> <p>{{ fields.content|raw }}</p> {% endfor %} ~~~ 调用`$syntax->toEditor`将为转发器字段返回不同的数组: ~~~ 'repeater' => [ 'label' => 'Website name', 'type' => 'repeater', 'fields' => [ 'title' => [ 'label' => 'Title', 'default' => 'Title', 'type' => 'text' ], 'content' => [ 'label' => 'Content', 'default' => 'Content', 'type' => 'textarea' ] ] ] ~~~ 转发器字段还支持组模式,该组模式可与动态语法解析器一起使用,如下所示: ~~~ {variable name="sections" type="repeater" prompt="Add another section" tab="Sections" groups="$/author/plugin/repeater_fields.yaml"}{/variable} ~~~ 这是repeater\_fields.yaml组配置文件的示例: ~~~ quote: name: Quote description: Quote item icon: icon-quote-right fields: quote_position: span: auto label: Quote Position type: radio options: left: Left center: Center right: Right quote_content: span: auto label: Details type: textarea ~~~ 有关Repeater组模式的更多信息,请参见[Repeater Widget](https://octobercms.com/docs/backend/forms#widget-repeater)。