ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 表单视图 ### 表单视图 对于您的表单支持“[创建”](https://octobercms.com/docs/backend/forms#form-create-page),“[更新”](https://octobercms.com/docs/backend/forms#form-update-page)和“[预览”的](https://octobercms.com/docs/backend/forms#form-preview-page)每个页面,应提供一个具有相应名称的[视图文件](https://octobercms.com/docs/backend/forms#introduction)**\-create.htm**,**update.htm**和**Preview.htm**。 表单行为向控制器类添加了两个方法:`formRender`和`formRenderPreview`。这些方法呈现使用上述YAML文件配置的表单控件。 ### [](https://octobercms.com/docs/backend/forms#form-create-view)建立检视 该**create.htm**观点代表了创建页面,允许用户创建新的记录。典型的“创建”页面包含面包屑,表单本身和表单按钮。该**数据请求**属性应该指的是`onSave`由表单行为提供AJAX处理程序。下面是典型的create.htm表单的内容。 ~~~ <?= Form::open(['class'=>'layout']) ?> <div class="layout-row"> <?= $this->formRender() ?> </div> <div class="form-buttons"> <div class="loading-indicator-container"> <button type="button" data-request="onSave" data-request-data="close:true" data-hotkey="ctrl+enter, cmd+enter" data-load-indicator="Creating Category..." class="btn btn-default"> Create and Close </button> <span class="btn-text"> or <a href="<?= Backend::url('acme/blog/categories') ?>">Cancel</a> </span> </div> </div> <?= Form::close() ?> ~~~ ### [](https://octobercms.com/docs/backend/forms#form-update-view)更新视图 该**update.htm**观点代表了更新页面,允许用户更新或删除现有记录。典型的“更新”页面包含面包屑,表单本身和表单按钮。“更新”页面与“创建”页面非常相似,但通常具有“删除”按钮。该**数据请求**属性应该指的是`onSave`由表单行为提供AJAX处理程序。以下是典型的update.htm表单的内容。 ~~~ <?= Form::open(['class'=>'layout']) ?> <div class="layout-row"> <?= $this->formRender() ?> </div> <div class="form-buttons"> <div class="loading-indicator-container"> <button type="button" data-request="onSave" data-request-data="close:true" data-hotkey="ctrl+enter, cmd+enter" data-load-indicator="Saving Category..." class="btn btn-default"> Save and Close </button> <button type="button" class="oc-icon-trash-o btn-icon danger pull-right" data-request="onDelete" data-load-indicator="Deleting Category..." data-request-confirm="Do you really want to delete this category?"> </button> <span class="btn-text"> or <a href="<?= Backend::url('acme/blog/categories') ?>">Cancel</a> </span> </div> </div> <?= Form::close() ?> ~~~ ### [](https://octobercms.com/docs/backend/forms#form-preview-view)预览视图 该**preview.htm**视图表示预览页面,允许用户在只读模式预览现有记录。典型的“预览”页面包含面包屑和表单本身。下面是典型的Preview.htm表单的内容。 ~~~ <div class="form-preview"> <?= $this->formRenderPreview() ?> </div> ~~~ ### [](https://octobercms.com/docs/backend/forms#field-conditions)将条件应用于字段 有时,您可能希望在某些条件下操纵表单字段的值或外观,例如,如果勾选了复选框,则可能希望隐藏输入。您可以通过触发器API或字段依赖项来执行此操作。输入预设转换器主要用于转换字段值。这些选项将在下面更详细地描述。 ### [](https://octobercms.com/docs/backend/forms#field-input-preset)输入预设转换器 输入预设转换器是使用“`preset`[表单字段”选项](https://octobercms.com/docs/backend/forms#form-field-options)定义的,它允许您将输入到元素中的文本转换为另一个输入元素中的URL,段或文件名值。 在此示例中,`url`当用户在`title`字段中输入文本时,我们将自动填写字段值。如果在“标题”中键入文本**Hello world**,则URL会跟着\*\*/ hello-world\*\*的转换值。仅当目标字段(`url`)为空且未更改时,才会发生此行为。 ~~~ title: label: Title url: label: URL preset: field: title type: url ~~~ 或者,该`preset`值也可以是仅引用该**字段**的字符串,`type`然后该选项将默认为**slug**。 ~~~ slug: label: Slug preset: title ~~~ 以下选项可用于该`preset`选项: | 选项 | 描述 | | --- | --- | | **field** | 定义另一个字段名称来作为值的来源。 | | **type** | 指定转换类型。请参阅下面的支持值。 | | **prefixInput** | 可选,使用CSS选择器在转换后的值之前提供在提供的输入元素中找到的值。 | 以下是受支持的类型: | 类型 | 描述 | | --- | --- | | **exact** | 复制准确值 | | **slug** | 将复制的值格式化为段 | | **url** | 与子弹相同,但以/开头 | | **camel** | 使用camelCase格式化复制的值 | | **file** | 将复制的值格式化为文件名,并用短划线代替空格 | ### [](https://octobercms.com/docs/backend/forms#field-trigger-events)触发事件 触发事件是使用`trigger`[form field选项](https://octobercms.com/docs/backend/forms#form-field-options)定义的,是使用JavaScript的基于浏览器的简单解决方案。它允许您基于其他元素的状态来更改元素属性,例如可见性或值。这是一个示例定义: ~~~ is_delayed: label: Send later comment: Place a tick in this box if you want to send this message at a later time. type: checkbox send_at: label: Send date type: datepicker cssClass: field-indent trigger: action: show field: is_delayed condition: checked ~~~ 在上面的示例中,`send_at`仅在`is_delayed`选中表单字段时才会显示该表单字段。换句话说,如果选中了其他表单输入(字段)(条件),则该字段将显示(操作)。该`trigger`定义指定了以下选项: | 选项 | 描述 | | --- | --- | | **action** | 定义满足条件时应用于此字段的操作。支持的值:显示,隐藏,启用,禁用,为空。 | | **field** | 定义将触发操作的另一个字段名称。通常,字段名称是指相同级别形式的字段。例如,如果此字段在[转发器小部件中](https://octobercms.com/docs/backend/forms#widget-repeater),则仅选中同一[转发器小部件中的](https://octobercms.com/docs/backend/forms#widget-repeater)字段。但是,如果字段名称前面有一个插入符号,`^`例如:`^parent_field`,它将引用一个[转发器小部件](https://octobercms.com/docs/backend/forms#widget-repeater)或形成比该字段本身高一级的格式。此外,如果超过一个插入符号`^`时,它会参考很多水平高:`^^grand_parent_field`,`^^^grand_grand_parent_field`,等。 | | **condition** | 确定指定字段应满足的条件,以将条件视为“ true”。支持的值:选中,未选中,value \[somevalue\]。 | ### [](https://octobercms.com/docs/backend/forms#field-dependencies)字段依赖 表单字段可以通过定义`dependsOn`[表单字段选项](https://octobercms.com/docs/backend/forms#form-field-options)来声明对其他字段的依赖关系,该[选项](https://octobercms.com/docs/backend/forms#form-field-options)提供了更健壮的服务器端解决方案,用于在修改依赖关系时更新字段。当声明为依赖项的字段发生更改时,定义字段将使用AJAX框架进行更新。这提供了使用`filterFields`方法或更改要提供给该字段的可用选项与该字段的属性进行交互的机会。下面的例子: ~~~ country: label: Country type: dropdown state: label: State type: dropdown dependsOn: country ~~~ 在上面的示例中,当`state`表单字段的`country`值更改时,表单字段将刷新。发生这种情况时,当前表单数据将被填充到模型中,以便下拉选项可以使用它。 ~~~ public function getCountryOptions() { return ['au' => 'Australia', 'ca' => 'Canada']; } public function getStateOptions() { if ($this->country == 'au') { return ['act' => 'Capital Territory', 'qld' => 'Queensland', ...]; } elseif ($this->country == 'ca') { return ['bc' => 'British Columbia', 'on' => 'Ontario', ...]; } } ~~~ 该示例对于处理模型值很有用,但无权访问表单字段定义。您可以通过定义`filterFields`模型内的方法来[过滤表单字段](https://octobercms.com/docs/backend/forms#filter-form-fields),如[过滤表单字段](https://octobercms.com/docs/backend/forms#filter-form-fields)部分所述。下面提供了一个示例: ~~~ dnsprovider: label: DNS Provider type: dropdown registrar: label: Registrar type: dropdown specificfields[for][provider1]: label: Provider 1 ID type: text hidden: true dependsOn: - dnsprovider - registrar specificfields[for][provider2]: label: Provider 2 ID type: text hidden: true dependsOn: - dnsprovider - registrar ~~~ filterFields方法的逻辑如下: ~~~ public function filterFields($fields, $context = null) { $displayedVendors = strtolower($this->dnsprovider->name . $this->registrar->name); if (str_contains($displayedVendors, 'provider1')) { $fields->{'specificfields[for][provider1]'}->hidden = false; } if (str_contains($displayedVendors, 'provider2')) { $fields->{'specificfields[for][provider2]'}->hidden = false; } } ~~~ 在上面的示例中,只要修改了或字段,则`provider1`和`provider2`字段都会自动刷新。发生这种情况时,将处理整个表单周期,这意味着将再次运行方法中定义的任何逻辑,从而使您可以筛选动态显示哪些字段。`dnsprovider``registrar``filterFields` ### [](https://octobercms.com/docs/backend/forms#prevent-field-submission)阻止提交字段 有时您可能需要阻止提交字段。为此,只需在表单配置文件中的字段名称之前添加下划线(\_)。以下划线开头的表单域将自动清除,不再保存到模型中。 ~~~ address: label: Title type: text _map: label: Point your address on the map type: mapviewer ~~~