后端表单

介绍

表单行为 是一个控制器修饰符,用于轻松地将表单功能添加到后端页面。 该行为提供了三个名为Create,Update和Preview的页面。 “预览”页面是“更新”页面的只读版本。 当您使用表单行为时,您不需要在控制器中定义createupdatepreview操作 - 行为就是为您完成的。 但是,您应该提供相应的视图文件。

表单行为取决于表单字段定义模型类。 为了使用表单行为,您应该将它添加到控制器类的$implement属性中。 此外,应定义$formConfig类属性,其值应引用用于配置行为选项的YAML文件。

  1. namespace Acme\Blog\Controllers;
  2. class Categories extends \Backend\Classes\Controller
  3. {
  4. public $implement = ['Backend.Behaviors.FormController'];
  5. public $formConfig = 'form_config.yaml';
  6. }

注意: 表单和列表行为通常在同一个控制器中一起使用。

配置表单行为

$formConfig属性中引用的配置文件以YAML格式定义。 该文件应放入控制器的views目录。 以下是典型表单行为配置文件的示例:

  1. # ===================================
  2. # Form Behavior Config
  3. # ===================================
  4. name: Blog Category
  5. form: $/acme/blog/models/post/fields.yaml
  6. modelClass: Acme\Blog\Post
  7. create:
  8. title: New Blog Post
  9. update:
  10. title: Edit Blog Post
  11. preview:
  12. title: View Blog Post

The following fields are required in the form configuration file:

字段 描述
name 此表单管理的对象的名称。
form 配置数组或对表单字段定义文件的引用,请参阅表单字段
modelClass 模型类名称,表单数据将加载并保存在此模型中。

下面列出的配置选项是可选的。 如果希望表单行为支持Create, UpdatePreview页面,请定义它们。

选项 描述
defaultRedirect 在未定义特定重定向页面时用作回退重定向页面。
create 配置数组或对“新建”页面的配置文件的引用。
update 配置数组或对“更新”页面的配置文件的引用。
preview 配置数组或对预览页面的配置文件的引用。

新建页面

要支持“新建”页面,请将以下配置添加到YAML文件中:

  1. create:
  2. title: New Blog Post
  3. redirect: acme/blog/posts/update/:id
  4. redirectClose: acme/blog/posts
  5. flashSave: Post has been created!

“创建”页面支持以下配置选项:

选项 描述
title 页面标题,可以参考本地化字符串.。
redirect 保存记录时的重定向页面。
redirectClose 保存记录时的重定向页面,并随请求一起发送close post变量。
flashSave 保存记录时显示的flash消息,可以参考本地化字符串
form 仅覆盖创建页面的默认表单字段定义。

更新页面

要支持“更新”页面,请将以下配置添加到YAML文件中:

  1. update:
  2. title:编辑文章
  3. redirect:acme/blog/posts
  4. flashSave:保存成功
  5. flashDelete:删除成功

“更新”页面支持以下配置选项:

选项 描述
title 页面标题,可以参考本地化字符串
redirect 保存记录时的重定向页面。
redirectClose 保存记录时的重定向页面和请求一起发送close post变量。
flashSave 保存记录时显示的flash消息,可以参考本地化字符串
flashDelete 删除记录时显示的flash消息,可以参考本地化字符串
form 仅覆盖更新页面的默认表单字段定义。

预览页面

要支持“预览”页面,请将以下配置添加到YAML文件中:

  1. preview:
  2. title:博客详情页

“预览”页面支持以下配置选项:

选项 描述
title 页面标题,可以参考本地化字符串
form 仅覆盖预览页面的默认表单字段定义。

定义表单字段

表单字段使用YAML文件定义。 表单字段配置由表单行为用于创建表单控件并将它们绑定到模型字段。 该文件放在插件的models目录的子目录中。 子目录名称与以小写字母书写的模型类名称匹配。 文件名无关紧要,但fields.yamlform_fields.yaml是常用名称。 示例表单字段文件位置:

  1. plugins/
  2. acme/
  3. blog/
  4. models/ <=== Plugin models directory
  5. post/ <=== Model configuration directory
  6. fields.yaml <=== Model form fields config file
  7. Post.php <=== model class

字段可以放在三个区域,外部区域主要标签次要标签。 下一个示例显示了表单字段定义文件的典型内容。

  1. # ===================================
  2. # Form Field Definitions
  3. # ===================================
  4. fields:
  5. blog_title:
  6. label: Blog Title
  7. description: The title for this blog
  8. published_at:
  9. label: Published date
  10. description: When this blog post was published
  11. type: datepicker
  12. [...]
  13. tabs:
  14. fields:
  15. [...]
  16. secondaryTabs:
  17. fields:
  18. [...]

可以使用Relation WidgetRelation Manager呈现相关模型中的字段。 例外是OneToOne或morphOne相关字段,必须定义为relation[field],然后可以指定为模型的任何其他字段:

  1. user_name:
  2. label: User Name
  3. description: The name of the user
  4. avatar[name]:
  5. label: Avatar
  6. description: will be saved in the Avatar table
  7. published_at:
  8. label: Published date
  9. description: When this blog post was published
  10. type: datepicker
  11. [...]

标签选项

对于每个选项卡定义,即tabssecondaryTabs,您可以指定以下选项:

选项 描述
stretch 指定此选项卡是否伸展以适合父高度。
defaultTab 分配字段的默认选项卡。 默认值:杂项。
cssClass 将一个CSS类分配给选项卡容器。
paneCssClass 将CSS类分配给单个选项卡窗格。 值是数组,键是制表符索引或标签,值是CSS类。

字段选项

对于每个字段,您可以指定这些选项(如果适用):

选项 描述
label 向用户显示表单字段时的名称。
type 定义应该如何呈现此字段(请参阅下面的可用字段类型 )。 默认值:文字。
span 将表单字段对齐到一侧。 选项:auto, left, right, full。 默认值:full。
size 指定使用它的字段的字段大小,例如textarea字段. Options: tiny, small, large, huge, giant.
placeholder 如果字段支持占位符值。
comment 在字段下方放置描述性注释。
commentAbove 在该字段上方显示评论。
commentHtml 允许的HTML标记内的comment。选项:true,false。
default 指定字段的默认值。
defaultFrom 从另一个字段的值中获取默认值。
tab 将字段分配给选项卡。
cssClass 向字段容器分配CSS类。
readOnly 防止字段被修改。选项: true, false.
disabled 防止字段被修改,并将其从保存的数据中排除。选项:true, false.
hidden 从视图隐藏字段,并将其从保存的数据中排除。选项: true, false.
stretch 指定此字段是否延伸到适合父级的高度。
context 什么时候应该使用上下文应该提醒显示场。上下文可以通过使用符号@ 在“字段名称”名称,例如,name@update
dependsOn 其他字段名的数组依赖于,当修改其他字段时,该字段将更新。
trigger 使用触发器事件.指定该字段的条件。
preset 允许字段值最初由另一个字段的值设置,使用输入预置转换器进行转换。
required 在字段标签旁边放置一个红色的星号以指示它是必需的(请确保在模型上设置验证,因为这不是由表单控制器执行的)。
attributes 指定要添加到表单字段元素的自定义HTML属性。
containerAttributes 指定要添加到表单字段容器的自定义HTML属性。

可用的字段类型

有各种本机字段类型可用于类型设置。 对于更高级的表单字段,可以使用表单窗口小部件

  1. Text
  2. Number
  3. Password
  4. Textarea
  5. Dropdown
  6. Radio List
  7. Balloon Selector
  8. Checkbox
  9. Checkbox List
  10. Switch
  11. Section
  12. Partial
  13. Hint
  14. Widget

Text

text - 呈现单行文本框。 如果未指定,则使用此默认类型。

  1. blog_title:
  2. label: Blog Title
  3. type: text

Number

number - 呈现仅包含数字的单行文本框。

  1. your_age:
  2. label: Your Age
  3. type: number

Password

password - 呈现单行密码字段。

  1. user_password:
  2. label: Password
  3. type: password

Textarea

textarea - 呈现多行文本框。 尺寸也可以用可能的值指定: tiny, small, large, huge, giant.

  1. blog_contents:
  2. label: Contents
  3. type: textarea
  4. size: large

Dropdown

dropdown - 使用指定选项呈现下拉列表。 有4种方法可以提供下拉选项。 第一个方法直接在YAML文件中定义options

  1. status_type:
  2. label: Blog Post Status
  3. type: dropdown
  4. options:
  5. draft: Draft
  6. published: Published
  7. archived: Archived

第二种方法使用模型类中声明的方法定义选项。 如果省略options元素,框架需要在模型中定义名为 getFieldNameOptions 的方法。 使用上面的示例,模型应该具有getStatusTypeOptions方法。 此方法的第一个参数是此字段的当前值,第二个参数是整个表单的当前数据对象。 此方法应返回key=>label格式的选项数组。

  1. status_type:
  2. label: Blog Post Status
  3. type: dropdown

提供模型类中的下拉选项:

  1. public function getStatusTypeOptions($value, $formData)
  2. {
  3. return ['all' => 'All', ...];
  4. }

第三个全局方法getDropdownOptions也可以在模型中定义,这将用于模型的所有下拉字段类型。 此方法的第一个参数是字段名称,第二个参数是字段的当前值,第三个参数是整个表单的当前数据对象。 它应该以key=>label格式返回一个选项数组。

  1. public function getDropdownOptions($fieldName, $value, $formData)
  2. {
  3. if ($fieldName == 'status') {
  4. return ['all' => 'All', ...];
  5. }
  6. else {
  7. return ['' => '-- none --'];
  8. }
  9. }

第四种方法使用模型类中声明的特定方法。 在下一个示例中,应该在模型类中定义listStatuses方法。 此方法接收与getDropdownOptions方法相同的所有参数,并应返回key=>label格式的选项数组。

  1. status:
  2. label: Blog Post Status
  3. type: dropdown
  4. options: listStatuses

将下拉选项提供给模型类:

  1. public function listStatuses($fieldName, $value, $formData)
  2. {
  3. return ['published' => 'Published', ...];
  4. }

要在没有选择时定义行为,可以指定emptyOption值以包含可以重新选择的空选项。

  1. status:
  2. label: Blog Post Status
  3. type: dropdown
  4. emptyOption: -- no status --

或者,您可以使用placeholder选项来使用无法重新选择的“单向”空选项。

  1. status:
  2. label: Blog Post Status
  3. type: dropdown
  4. placeholder: -- select a status --

默认情况下,下拉列表具有搜索功能,允许快速选择值。 可以通过将showSearch选项设置为false来禁用它。

  1. status:
  2. label: Blog Post Status
  3. type: dropdown
  4. showSearch: false

Radio List

radio - 呈现单选按钮列表,其中一次只能选择一个项目。

  1. security_level:
  2. label: Access Level
  3. type: radio
  4. options:
  5. all: All
  6. registered: Registered only
  7. guests: Guests only

单选按钮列表还可以支持次要描述。

  1. security_level:
  2. label: Access Level
  3. type: radio
  4. options:
  5. all: [All, Guests and customers will be able to access this page.]
  6. registered: [Registered only, Only logged in member will be able to access this page.]
  7. guests: [Guests only, Only guest users will be able to access this page.]

无线电列表支持三种定义选项的方式,与下拉字段类型完全相同。 对于无线电列表,该方法可以返回简单数组:key=>value或用于提供描述的数组数组:key=>[label,description]

Balloon Selector

balloon-selector - 呈现一个列表,其中一次只能选择一个项目。

  1. gender:
  2. label: Gender
  3. type: balloon-selector
  4. options:
  5. female: Female
  6. male: Male

气球选择器支持三种定义选项的方式,与下拉字段类型完全相同。

Checkbox

checkbox - 呈现单个复选框。

  1. show_content:
  2. label: Display content
  3. type: checkbox
  4. default: true

Checkbox List

checkboxlist - 呈现复选框列表。

  1. permissions:
  2. label: Permissions
  3. type: checkboxlist
  4. options:
  5. open_account: Open account
  6. close_account: Close account
  7. modify_account: Modify account

复选框列表支持三种定义选项的方法,与下拉字段类型完全相同,并且还支持单选字段类型中的辅助描述。

Switch

switch - 呈现一个开关按钮。

  1. show_content:
  2. label: Display content
  3. type: switch
  4. comment: Flick this switch to display content
  5. on: myauthor.myplugin::lang.models.mymodel.show_content.on
  6. off: myauthor.myplugin::lang.models.mymodel.show_content.off

Section

section - 呈现节标题和子标题。 labelcomment值是可选的,包含标题和子标题的内容。

  1. user_details_section:
  2. label: User details
  3. type: section
  4. comment: This section contains details about the user.

Partial

partial - 呈现partial,path值可以引用部分视图文件,否则字段名称用作partial名称。 在partial内部,这些变量是可用的:$value是默认字段值,$model是用于字段的模型,$field是配置的类对象Backend\Classes\FormField

  1. content:
  2. type: partial
  3. path: $/acme/blog/models/comments/_content_field.htm

Hint

hint - 与partial字段相同,但在一个可以被用户隐藏的提示容器内呈现。

  1. content:
  2. type: hint
  3. path: content_field

Widget

widget - 呈现自定义表单窗口小部件,type字段可以直接引用窗口小部件的类名或注册的别名。

  1. blog_content:
  2. type: Backend\FormWidgets\RichEditor
  3. size: huge

表单小部件

标准中包含各种表单小部件,但插件通常提供自己的自定义表单小部件。 您可以在Form Widgets文章上阅读更多内容。

  1. Code editor
  2. Color picker
  3. Date picker
  4. File upload
  5. Record finder
  6. Media finder
  7. Relation
  8. Repeater
  9. Rich editor/WYSIWYG
  10. Markdown editor
  11. Tag list

Code editor

codeeditor - 为格式化代码或标记呈现纯文本编辑器。 请注意,可以通过在后端为管理员定义的代码编辑器首选项继承选项。

  1. css_content:
  2. type: codeeditor
  3. size: huge
  4. language: html
选项 描述
language 代码语言,例如,php,css,js,html。 默认值:php。
showGutter 显示带行号的Gutter。 默认值:true。
wrapWords 自动换行。 默认为true。
fontSize 文字字体大小。 默认值:12。

Color picker

colorpicker - 渲染控件以选择十六进制颜色值。

  1. color:
  2. label: Background
  3. type: colorpicker
选项 描述
availableColors 可用颜色列表。

Date picker

datepicker - 呈现用于选择日期和时间的文本字段。

  1. published_at:
  2. label: Published
  3. type: datepicker
  4. mode: date
选项 选项
mode 预期结果,date, datetime或time。 默认值:datetime。
format 提供明确的日期显示格式。 例如:Y-m-d
minDate 可以选择的最短/最早日期。 默认值:2000-01-01。
maxDate 可以选择的最长/最晚日期。 默认值:2020-12-31。
firstDay 一周的第一天。 默认值:0(星期日)。
showWeekNumber 在行首显示周数。 默认值:false
ignoreTimezone 显示与存储时完全相同的日期时间,忽略October和后端用户指定的时区

File upload

fileupload - 呈现图像或常规文件的文件上传器。 字段名称必须使用attachOne或attachMany关系。

  1. avatar:
  2. label: Avatar
  3. type: fileupload
  4. mode: image
  5. imageHeight: 260
  6. imageWidth: 260
  7. thumbOptions:
  8. mode: crop
  9. offset:
  10. - 0
  11. - 0
  12. quality: 90
  13. sharpen: 0
  14. interlace: false
  15. extension: auto
选项 描述
mode 预期的文件类型,文件或图像。 默认值:图片。
imageWidth 如果使用图像类型,图像将调整为此宽度,可选。
imageHeight 如果使用图像类型,图像将调整为此高度,可选。
fileTypes 上传者接受的文件扩展名,可选。 例如:zip,txt
mimeTypes 上传者接受的MIME类型,可以是文件扩展名,也可以是完全限定名,可选。 例如:bin,txt
useCaption 允许为文件设置标题和描述。 默认值:true
prompt 要为上传按钮显示的文本,仅适用于文件,可选。
thumbOptions 传递给文件的缩略图生成方法的选项
attachOnUpload 如果存在父记录,则在上载时自动附加上载的文件,而不是在保存父记录时使用延迟绑定附加。 默认为false。

Record finder

recordfinder - 呈现包含相关记录详细信息的字段。 展开字段会显示一个弹出列表以搜索大量记录。 仅受单一关系支持。

  1. user:
  2. label: User
  3. type: recordfinder
  4. list: $/rainlab/user/models/user/columns.yaml
  5. prompt: Click the %s button to find a user
  6. nameFrom: name
  7. descriptionFrom: email
选项 描述
nameFrom 用于显示名称的关系中使用的列名称。默认值:名称。
descriptionFrom 用于显示描述的关系中使用的列名。默认值:说明。
title 要在弹出窗口的标题部分显示的文本。
prompt 没有选择记录时显示的文本。 %s字符代表搜索图标。
list 配置数组或对列表列定义文件的引用,请参阅list columns
recordsPerPage 每页显示的记录,没有页面使用0。默认值:10
conditions 指定要应用于列表模型查询的raw where查询语句。
scope 指定相关表单模型中定义的查询范围方法以始终应用于列表查询。第一个参数将包含窗口小部件将其值附加到的模型,即父模型。
searchMode 将搜索策略定义为包含所有单词,任何单词或精确短语。支持的选项:all,any,exact。默认值:全部。
searchScope 指定在相关表单模型中定义的查询范围方法以应用于搜索查询,第一个参数将包含搜索项。

Media finder

mediafinder - 呈现用于从媒体管理器库中选择项目的字段。 展开字段会显示媒体管理器以查找文件。 结果选择是一个字符串作为文件的相对路径。

  1. background_image:
  2. label: Background image
  3. type: mediafinder
  4. mode: image
选项 描述
mode 预期的文件类型,文件或图像。 默认值:文件。
prompt 没有选择项目时显示的文本。 %s字符代表媒体管理器图标。
imageWidth 如果使用图像类型,预览图像将显示为此宽度,可选。
imageHeight 如果使用图像类型,预览图像将显示到此高度,可选。

Relation

relation - 根据字段关系类型呈现下拉列表或复选框列表。 单数关系显示下拉列表,多个关系显示复选框列表。 用于显示每个关系的标签来自nameFromselect定义。

  1. categories:
  2. label: Categories
  3. type: relation
  4. nameFrom: title

或者,您可以使用自定义select语句填充标签。 任何有效的SQL语句都适用于此处

  1. user:
  2. label: User
  3. type: relation
  4. select: concat(first_name, ' ', last_name)

您还可以提供一个模型范围,用于使用scope属性过滤结果。

选项 描述
nameFrom 用于显示关系标签的模型属性名称。 默认值:名称。
select 用于名称的自定义SQL select语句。
emptyOption 没有可用选择时显示的文本。
scope 指定相关表单模型中定义的查询范围方法以始终应用于列表查询。

Repeater

repeater - 呈现一组重复的表单字段。

  1. extra_information:
  2. type: repeater
  3. titleFrom: title_when_collapsed
  4. form:
  5. fields:
  6. added_at:
  7. label: Date added
  8. type: datepicker
  9. details:
  10. label: Details
  11. type: textarea
  12. title_when_collapsed:
  13. label: This field is the title when collapsed
  14. type: text
选项 描述
form 对表单字段定义文件的引用,请参见后端表单字段。 也可以使用内联字段。
prompt 要为创建按钮显示的文本。 默认值:添加新项目。
titleFrom 项目中字段的名称,用作折叠项目的标题
minItems 最低要求。 不使用组时预先显示这些项目
maxItems 转发器内允许的最大项目数。
groups 引用一组表单字段,将转发器置于组模式(见下文)。 也可以使用内联定义。

转发器字段支持组模式,该模式允许为每次迭代选择一组自定义字段。

  1. content:
  2. type: repeater
  3. prompt: Add content block
  4. groups: $/acme/blog/config/repeater_fields.yaml

这是组配置文件的示例,它位于 /plugins/acme/blog/config/repeater_fields.yaml中。 或者,这些定义可以与转发器一起指定。

  1. textarea:
  2. name: Textarea
  3. description: Basic text field
  4. icon: icon-file-text-o
  5. fields:
  6. text_area:
  7. label: Text Content
  8. type: textarea
  9. size: large
  10. quote:
  11. name: Quote
  12. description: Quote item
  13. icon: icon-quote-right
  14. fields:
  15. quote_position:
  16. span: auto
  17. label: Quote Position
  18. type: radio
  19. options:
  20. left: Left
  21. center: Center
  22. right: Right
  23. quote_content:
  24. span: auto
  25. label: Details
  26. type: textarea

每个组必须指定唯一键,并且该定义支持以下选项。

选项 描述
name 组的名称。
description 该小组的简要说明。
icon 定义组的图标,可选。
fields 属于该组的表单字段,请参见后端表单字段

注意: 组密钥与保存的数据一起存储为_group属性。

富文本编辑器/WYSIWYG

richeditor - 为富格式文本呈现可视化编辑器,也称为WYSIWYG编辑器。

  1. html_content:
  2. type: richeditor
  3. toolbarButtons: bold|italic
  4. size: huge
选项 描述
toolbarButtons 哪些按钮显示在编辑器工具栏上。

可用的工具栏按钮是:

  1. fullscreen, bold, italic, underline, strikeThrough, subscript, superscript, fontFamily, fontSize, |, color, emoticons, inlineStyle, paragraphStyle, |, paragraphFormat, align, formatOL, formatUL, outdent, indent, quote, insertHR, -, insertLink, insertImage, insertVideo, insertAudio, insertFile, insertTable, undo, redo, clearFormatting, selectAll, html

注意: | 将在工具栏中插入一个垂直分隔线,并在-中插入一个水平分隔线。

Markdown编辑器

markdown - 为markdown格式化文本呈现基本编辑器。

  1. md_content:
  2. type: markdown
  3. size: huge
  4. mode: split
选项 描述
mode 预期的视图模式,tab或split。 默认标签页。

标签列表

taglist - 呈现用于输入标签列表的字段。

  1. tags:
  2. type: taglist
  3. separator: space

标签列表可以支持三种定义“选项”的方式,与下拉字段类型完全相同。

  1. tags:
  2. type: taglist
  3. options:
  4. - Red
  5. - Blue
  6. - Orange

您可以使用名为relationmode,其中字段名称是多对多关系。 这将通过关系自动获取和分配标签。 如果支持自定义标记,则会在分配之前创建它们。

  1. tags:
  2. type: taglist
  3. mode: relation
选项 描述
mode 控制返回值的方式,字符串,数组或关系。 默认值:字符串 string
separator 使用指定字符(逗号或空格)分隔标记。 默认值:comma,
customTags 允许用户手动输入自定义标签。 默认值:true
options 指定预定义选项的方法或数组。 设置为true以使用模型get*Field*Options方法。 可选的。
nameFrom 如果使用关系模式,则显示标签名称的模型属性名称。 默认值:name
useKey 使用密钥而不是值来保存和读取数据。 默认值:false

表单视图

对于每个页面,您的表单支持 Create, UpdatePreview ,您应该提供view file使用相应的名称 - create.htm, update.htm and preview.htm

表单行为向控制器类添加了两个方法:formRenderformRenderPreview。 这些方法呈现使用上述YAML文件配置的表单控件。

新建页面

create.htm视图表示允许用户创建新记录的“创建”页面。 典型的“创建”页面包含面包屑,表单本身和表单按钮。 data-request 属性应该引用表单行为提供的onSave AJAX处理程序。 以下是典型的create.htm表单的内容。

  1. <?= Form::open(['class'=>'layout']) ?>
  2. <div class="layout-row">
  3. <?= $this->formRender() ?>
  4. </div>
  5. <div class="form-buttons">
  6. <div class="loading-indicator-container">
  7. <button
  8. type="button"
  9. data-request="onSave"
  10. data-request-data="close:true"
  11. data-hotkey="ctrl+enter, cmd+enter"
  12. data-load-indicator="Creating Category..."
  13. class="btn btn-default">
  14. Create and Close
  15. </button>
  16. <span class="btn-text">
  17. or <a href="<?= Backend::url('acme/blog/categories') ?>">Cancel</a>
  18. </span>
  19. </div>
  20. </div>
  21. <?= Form::close() ?>

更新页面

update.htm视图表示允许用户更新或删除现有记录的“更新”页面。 典型的“更新”页面包含面包屑,表单本身和表单按钮。 “更新”页面与“创建”页面非常相似,但通常具有“删除”按钮。 data-request属性应该引用表单行为提供的onSave AJAX处理程序。 以下是典型update.htm表单的内容。

  1. <?= Form::open(['class'=>'layout']) ?>
  2. <div class="layout-row">
  3. <?= $this->formRender() ?>
  4. </div>
  5. <div class="form-buttons">
  6. <div class="loading-indicator-container">
  7. <button
  8. type="button"
  9. data-request="onSave"
  10. data-request-data="close:true"
  11. data-hotkey="ctrl+enter, cmd+enter"
  12. data-load-indicator="Saving Category..."
  13. class="btn btn-default">
  14. Save and Close
  15. </button>
  16. <button
  17. type="button"
  18. class="oc-icon-trash-o btn-icon danger pull-right"
  19. data-request="onDelete"
  20. data-load-indicator="Deleting Category..."
  21. data-request-confirm="Do you really want to delete this category?">
  22. </button>
  23. <span class="btn-text">
  24. or <a href="<?= Backend::url('acme/blog/categories') ?>">Cancel</a>
  25. </span>
  26. </div>
  27. </div>
  28. <?= Form::close() ?>

预览页面

preview.htm 视图表示预览页面,允许用户以只读模式预览现有记录。 典型的预览页面包含面包屑和表单本身。 以下是典型的preview.htm表单的内容。

  1. <div class="form-preview">
  2. <?= $this->formRenderPreview() ?>
  3. </div>

将条件应用于字段

有时您可能希望在某些条件下操纵表单字段的值或外观,例如,如果勾选了复选框,您可能希望隐藏输入。 通过使用触发器API或字段依赖性,有几种方法可以做到这一点。 输入预设转换器主要用于转换字段值。 下面更详细地描述这些选项。

输入预设转换器

输入预设转换器使用“预设”表单字段选项定义,并允许您将输入到元素中的文本转换为另一个输入元素中的URL,slug或文件名值。

在这个例子中,当用户在title字段中输入文本时,我们将自动填写url字段值。 如果为标题键入了文本Hello world,则URL将跟随/hello-world的转换值。 仅当目标字段(url)为空且未触及时才会发生此行为。

  1. title:
  2. label: Title
  3. url:
  4. label: URL
  5. preset:
  6. field: title
  7. type: url

或者,preset值也可以是仅引用字段的字符串,然后type选项将默认为slug

  1. slug:
  2. label: Slug
  3. preset: title

以下选项可用于“预设”选项:

选项 描述
field 定义另一个字段名称以从中获取值。
type 指定转换类型。 请参阅下面的支持值。
prefixInput 可选,使用CSS选择器为转换后的值添加前缀,并在提供的输入元素中找到该值。

以下是支持的类型:

输入 描述
exact 复制确切的值
slug 将复制的值格式化为slug
url 与slug相同但以/为前缀
camel 使用camelCase格式化复制的值
file 将复制的值格式化为文件名,并用空格替换为空格

触发事件

触发事件使用trigger 表单字段选项 定义,是一个使用JavaScript的基于浏览器的简单解决方案。 它允许您根据其他元素的状态更改元素属性,例如可见性或值。 这是一个示例定义:

  1. is_delayed:
  2. label: Send later
  3. comment: Place a tick in this box if you want to send this message at a later time.
  4. type: checkbox
  5. send_at:
  6. label: Send date
  7. type: datepicker
  8. cssClass: field-indent
  9. trigger:
  10. action: show
  11. field: is_delayed
  12. condition: checked

在上面的例子中,只有在选中is_delayed字段时才会显示send_at表单字段。 换句话说,如果检查了另一个表单输入(字段)(条件),该字段将显示(动作)。 trigger定义指定了以下选项:

选项 描述
action 定义满足条件时应用于此字段的操作。 支持的值:show,hide,enable,disable,empty。
field 定义将触发操作的其他字段名称。 通常,字段名称是指同一级别形式的字段。 例如,如果此字段位于转发器窗口小部件 中,则仅检查相同转发器窗口小部件 中的字段。 但是,如果字段名称前面带有插入符号^,如:^ parent_field,它将引用repeater widget 或形成比字段本身高一级的插入符号。 另外,如果使用多个插入符号^ ^,它将引用更高级别:^^ grand_parent_field^^^ grand_grand_parent_field等。
condition 确定指定字段应满足的条件,以使条件被视为“真”。 支持的值:选中,未选中,值[somevalue]。

字段依赖性

在定义dependsOn 表单字段选项时,表单字段可以依赖于其他字段,这提供了更强大的服务器端解决方案。 当定义的其他字段发生更改时,定义字段将使用AJAX框架进行更新。 这是一个示例定义:

  1. country:
  2. label: Country
  3. type: dropdown
  4. state:
  5. label: State
  6. type: dropdown
  7. dependsOn: country

在上面的例子中,state表单字段将在country字段具有更改的值时刷新。 发生这种情况时,当前表单数据将填入模型中,因此下拉选项可以使用它。

  1. public function getCountryOptions()
  2. {
  3. return ['au' => 'Australia', 'ca' => 'Canada'];
  4. }
  5. public function getStateOptions()
  6. {
  7. if ($this->country == 'au') {
  8. return ['act' => 'Capital Territory', 'qld' => 'Queensland', ...];
  9. }
  10. elseif ($this->country == 'ca') {
  11. return ['bc' => 'British Columbia', 'on' => 'Ontario', ...];
  12. }
  13. }

此示例对于操作模型值很有用,但它无权访问表单字段定义。 您可以通过在模型中定义filterFields方法来过滤表单字段,如过滤表单字段 部分所述。

防止字段提交

有时您可能需要阻止提交字段。 为此,只需在表单配置文件中的字段名称前添加下划线(\ __)。 以下划线开头的表单字段将自动清除,不再保存到模型中。

  1. address:
  2. label: Title
  3. type: text
  4. _map:
  5. label: Point your address on the map
  6. type: mapviewer

扩展表单行为

有时您可能希望修改默认表单行为,有几种方法可以执行此操作。

覆盖控制器action

您可以将自己的逻辑用于控制器中的createupdatepreview操作方法,然后可选地调用Form行为父方法。

  1. public function update($recordId, $context = null)
  2. {
  3. //
  4. //Do any custom code here
  5. //
  6. //Call the FormController behavior update() method
  7. return $this->asExtension('FormController')->update($recordId, $context);
  8. }

扩展表单模型查询

可以通过覆盖控制器类中的formExtendQuery方法来扩展表单数据库模型的查询查询。 此示例将通过将withTrashed作用域应用于查询来确保仍可以找到并更新软删除的记录:

  1. public function formExtendQuery($query)
  2. {
  3. $query->withTrashed();
  4. }

扩展表单字段

您可以通过在控制器类上调用extendFormFields静态方法从外部扩展另一个控制器的字段。 此方法可以采用三个参数,$form表示Form小部件对象,$model表示表单使用的模型,$context是包含表单上下文的字符串。 以此控制器为例:

  1. class Categories extends \Backend\Classes\Controller
  2. {
  3. public $implement = ['Backend.Behaviors.FormController'];
  4. public $formConfig = 'form_config.yaml';
  5. }

使用extendFormFields方法,您可以向此控制器呈现的任何表单添加额外的字段。 由于这可能会影响此控制器使用的所有表单,因此最好检查$model的类型是否正确。 这是一个例子:

  1. Categories::extendFormFields(function($form, $model, $context)
  2. {
  3. if (!$model instanceof MyModel) {
  4. return;
  5. }
  6. $form->addFields([
  7. 'my_field' => [
  8. 'label' => 'My Field',
  9. 'comment' => 'This is a custom field I have added.',
  10. ],
  11. ]);
  12. });

您还可以通过覆盖控制器类中的formExtendFields方法在内部扩展表单字段。 这只会影响FormController行为使用的形式。

  1. class Categories extends \Backend\Classes\Controller
  2. {
  3. [...]
  4. public function formExtendFields($form)
  5. {
  6. $form->addFields([...]);
  7. }
  8. }

$form对象提供以下方法。

方法 描述
addFields 向外部区域添加新字段
addTabFields 向选项卡区域添加新字段
addSecondaryTabFields 将新字段添加到辅助选项卡区域
removeField 从任何区域删除字段

每个方法都采用类似于表单字段配置的字段数组。

过滤表单字段

您可以通过覆盖所用模型中的filterFields方法来过滤表单字段定义。 这允许您根据模型数据操纵可见性和其他字段属性。 该方法有两个参数$fields表示已经由field configuration定义的字段的对象,$context表示活动表单context。

  1. public function filterFields($fields, $context = null)
  2. {
  3. if ($this->source_type == 'http') {
  4. $fields->source_url->hidden = false;
  5. $fields->git_branch->hidden = true;
  6. }
  7. elseif ($this->source_type == 'git') {
  8. $fields->source_url->hidden = false;
  9. $fields->git_branch->hidden = false;
  10. }
  11. else {
  12. $fields->source_url->hidden = true;
  13. $fields->git_branch->hidden = true;
  14. }
  15. }

上面的例子将通过检查Model属性source_type的值在某些字段上设置hidden标志。 当表单首次加载时以及通过定义的字段依赖性更新时,将应用此逻辑。

验证表单字段

要验证表单的字段,您可以在模型中使用验证特征。