后台表格

Introduction

表单行为 是控制器behavior 用于轻松地将表单功能添加到后端页面。该行为提供了三个页面,分别称为创建、更新和预览。预览页面是更新页面的只读版本。当您使用表单行为时,您不需要定义create,updatepreview 控制器中的动作 - 行为会为您完成。但是您应该提供相应的视图文件。

表单行为取决于表单字段定义 和一个模型类.为了使用表单行为,你应该添加\Backend\Behaviors\FormController::class 的定义$implement 控制器类的属性。

namespace Acme\Blog\Controllers;

class Categories extends \Backend\Classes\Controller
{
    /**
     * @var array List of behaviors implemented by this controller
     */
    public $implement = [
        \Backend\Behaviors\FormController::class,
    ];
}

NOTE: 很多时候形式和列表行为 在同一个控制器中一起使用。

配置表单行为

表单行为将从一个 YAML 格式加载其配置config_form.yaml 文件位于控制器的查看目录 (plugins/myauthor/myplugin/controllers/mycontroller/config_form.yaml) 默认情况下。

这可以通过覆盖$formConfig 控制器上的属性以引用不同的文件名或完整的配置数组:

public $formConfig = 'my_custom_form_config.yaml';

下面是一个典型的表单行为配置文件的例子:

# ===================================
#  Form Behavior Config
# ===================================

name: Blog Category
form: $/acme/blog/models/post/fields.yaml
modelClass: Acme\Blog\Post

create:
    title: New Blog Post

update:
    title: Edit Blog Post

preview:
    title: View Blog Post

表单配置文件中需要以下字段:

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

下面列出的配置选项是可选的。如果您希望表单行为支持Create,Update 或者Preview 页。

Option Description
defaultRedirect 当没有定义特定的重定向页面时用作后备重定向页面。
create 配置数组或对创建页面的配置文件的引用。
update 更新页面的配置数组或对配置文件的引用。
preview 配置数组或对预览页面配置文件的引用。

创建页面

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

create:
    title: New Blog Post
    redirect: acme/blog/posts/update/:id
    redirectClose: acme/blog/posts
    flashSave: Post has been created!

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

Option Description
title 一个页面标题,可以参考一个本地化字符串.
redirect 保存记录时的重定向页面。
redirectClose 保存记录时的重定向页面和close post 变量随请求一起发送。
flashSave 保存记录时闪现信息,可参考本地化字符串.
form 仅覆盖创建页面的默认表单字段定义。

更新页面

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

update:
    title: Edit Blog Post
    redirect: acme/blog/posts
    flashSave: Post updated successfully!
    flashDelete: Post has been deleted.

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

Option Description
title 一个页面标题,可以参考一个本地化字符串.
redirect 保存记录时的重定向页面。
redirectClose 保存记录时的重定向页面和close post 变量随请求一起发送。
flashSave 保存记录时闪现信息,可参考本地化字符串.
flashDelete 删除记录时闪现的信息,可以参考本地化字符串.
form 仅覆盖更新页面的默认表单字段定义。

预览页面

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

preview:
    title: View Blog Post

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

Option Description
title 一个页面标题,可以参考一个本地化字符串.
form 仅覆盖预览页面的默认表单字段定义。

定义表单域

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

📂 plugins
 ┗ 📂 acme
   ┗ 📂 blog
     ┗ 📂 models             <=== Plugin models directory
       ┣ 📂 post             <=== Model configuration directory
       ┃ ┗ 📜 fields.yaml    <=== Model form fields config file
       ┗ 📜 Post.php         <=== model class

字段可以放置在三个区域中,外区,主选项卡 或者二级标签.下一个示例显示了表单字段定义文件的典型内容。

# ===================================
#  Form Field Definitions
# ===================================

fields:
    blog_title:
        label: Blog Title
        description: The title for this blog

    published_at:
        label: Published date
        description: When this blog post was published
        type: datepicker

    [...]

tabs:
    fields:
        [...]

secondaryTabs:
    fields:
        [...]

来自相关模型的字段可以使用关系小部件 或者关系经理.例外是 OneToOne 或 morphOne 相关字段,必须定义为relation[field] 然后可以指定为模型的任何其他字段:

    user_name:
        label: User Name
        description: The name of the user
    avatar[name]:
        label: Avatar
        description: will be saved in the Avatar table
    published_at:
        label: Published date
        description: When this blog post was published
        type: datepicker

    [...]

选项卡选项

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

Option Description
stretch 指定此选项卡是否拉伸以适合父级高度。
defaultTab 将字段分配给的默认选项卡。默认值:杂项。
icons 使用选项卡名称作为键将图标分配给选项卡。
lazy 单击时动态加载的选项卡数组。对于包含大量内容的选项卡很有用。
cssClass 将 CSS 类分配给选项卡容器。
paneCssClass 将 CSS 类分配给单个选项卡窗格。值是一个数组,键是标签索引或标签,值是 CSS 类。它也可以指定为字符串,在这种情况下,该值将应用于所有选项卡。

NOTE: 不建议在包含受触发器影响的字段的选项卡上使用延迟加载。

tabs:
    stretch: true
    defaultTab: User
    cssClass: text-blue
    lazy:
        - Groups
    paneCssClass:
        0: first-tab
        1: second-tab
    icons:
        User: icon-user
        Groups: icon-group

    fields:
        username:
            type: text
            label: Username
            tab: User

        groups:
            type: relation
            label: Groups
            tab: Groups

字段选项

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

Option Description
label 向用户显示表单字段时的名称。
type 定义应如何呈现此字段(请参阅可用字段类型 以下)。默认:text.
span 将表单域对齐到一侧。选项:auto,left,right,storm,full.默认:full.参数storm 允许您将表单显示为 Bootstrap 网格,使用cssClass 财产,例如,cssClass: col-xs-4.
size 为使用它的字段指定字段大小,例如,textarea 字段。选项:tiny,small,large,huge,giant.
placeholder 如果该字段支持占位符值。
comment 在字段下方放置描述性注释。
commentAbove 在字段上方放置评论。
commentHtml 允许在评论中使用 HTML 标记。选项:true,false.
default 指定字段的默认值。为了dropdown,checkboxlist,radioballoon-selector 小部件,您可以在此处指定一个选项键以默认选择它。
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 属性。
permissions permissions 当前后端用户必须拥有该字段才能使用该字段。支持单个权限的字符串或一组权限,其中只需要一个权限即可授予访问权限。

可用字段类型

有多种本机字段类型可用于type 环境。对于更高级的表单域,一个表单小部件 可以代替使用。

- [Balloon Selector](#field-balloon) - [Checkbox](#field-checkbox) - [Checkbox List](#field-checkboxlist) - [Dropdown](#field-dropdown) - [Email](#field-email) - [Hint](#field-hint) - [Number](#field-number) - [Partial](#field-partial) - [Password](#field-password) - [Radio List](#field-radio) - [Range](#field-range) - [Section](#field-section) - [Switch](#field-switch) - [Text](#field-text) - [Textarea](#field-textarea) - [Widget](#field-widget)

气球选择器

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

gender:
    label: Gender
    type: balloon-selector
    default: female
    options:
        female: Female
        male: Male

气球选择器支持与定义选项相同的方法下拉字段类型.

Checkbox

checkbox - 呈现单个复选框。

show_content:
    label: Display content
    type: checkbox
    default: true

复选框列表

checkboxlist - 呈现复选框列表。

permissions:
    label: Permissions
    type: checkboxlist
    # set to true to explicitly enable the "Select All", "Select None" options
    # on lists that have <=10 items (>10 automatically enables it)
    quickselect: true
    default: open_account
    options:
        open_account: Open account
        close_account: Close account
        modify_account: Modify account

复选框列表支持与定义选项相同的方法下拉字段类型 并且还支持二级描述,在无线电场类型.通过指定,选项可以相互内联显示,而不是在单独的行中cssClass: 'inline-options' 在复选框列表字段配置上。

Dropdown

dropdown - 呈现带有指定选项的下拉菜单。有 6 种方式提供下拉选项。

第一种方法定义options 直接在 YAML 文件中(两种变体):

(仅值):

status_type:
    label: Blog Post Status
    type: dropdown
    default: published
    options:
        - draft
        - published
        - archived

(核心价值):

status_type:
    label: Blog Post Status
    type: dropdown
    default: published
    options:
        draft: Draft
        published: Published
        archived: Archived

第二种方法使用模型类中声明的方法定义选项。如果省略选项元素,则框架需要一个名称为get*FieldName*Options 在模型中定义。使用上面的例子,模型应该有getStatusTypeOptions 方法。该方法的第一个参数是该字段的当前值,第二个参数是整个表单的当前数据对象。此方法应返回格式为的选项数组键=>标签.

status_type:
    label: Blog Post Status
    type: dropdown

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

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

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

public function getDropdownOptions($fieldName, $value, $formData)
{
    if ($fieldName == 'status') {
        return ['all' => 'All', ...];
    }
    else {
        return ['' => '-- none --'];
    }
}

第四种方法使用模型类中声明的特定方法。在下一个例子中listStatuses 方法应该在模型类中定义。此方法接收与getDropdownOptions 方法,并且应该以格式返回一个选项数组键=>标签.

status:
    label: Blog Post Status
    type: dropdown
    options: listStatuses

向模型类提供下拉选项:

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

第五个方法允许您在类上指定静态方法以返回选项:

status:
    label: Blog Post Status
    type: dropdown
    options: \MyAuthor\MyPlugin\Classes\FormHelper::staticMethodOptions

向模型类提供下拉选项:

public static function staticMethodOptions($formWidget, $formField)
{
    return ['published' => 'Published', ...];
}

第六个方法允许您通过数组定义指定一个可调用对象。如果使用 PHP,您可以提供一个数组,其中第一个元素是对象,第二个元素是您要对该对象调用的方法。如果您使用的是 YAML,则仅限于定义为第二个元素的静态方法和对类的命名空间引用作为第一个元素:

status:
    label: Blog Post Status
    type: dropdown
    options: [\MyAuthor\MyPlugin\Classes\FormHelper, staticMethodOptions]

向模型类提供下拉选项:

public static function staticMethodOptions($formWidget, $formField)
{
    return ['published' => 'Published', ...];
}

将图标添加到下拉选项

为了为将在下拉字段中呈现的每个选项添加图标或图像,必须将选项作为具有以下格式的多维数组提供'key' => ['label-text', 'icon-class'],.

public function listStatuses($fieldName, $value, $formData)
{
    return [
        'published' => ['Published', 'icon-check-circle'],
        'unpublished' => ['Unpublished', 'icon-minus-circle'],
        'draft' => ['Draft', 'icon-clock-o']
    ];
}

要定义没有选择时的行为,您可以指定一个emptyOption 值以包括可以重新选择的空选项。

status:
    label: Blog Post Status
    type: dropdown
    emptyOption: -- no status --

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

status:
    label: Blog Post Status
    type: dropdown
    placeholder: -- select a status --

默认情况下,下拉菜单具有搜索功能,允许快速选择一个值。这可以通过设置禁用showSearch 选择权false.

status:
    label: Blog Post Status
    type: dropdown
    showSearch: false

Email

email - 呈现类型为的单行文本框email,在移动浏览器中触发电子邮件专用键盘。

user_email:
    label: Email Address
    type: email

如果您想在保存时验证此字段以确保它是格式正确的电子邮件地址,请使用$rules 您模型上的属性,如下所示:

/**
 * @var array Validation rules
 */
public $rules = [
    'user_email' => 'email',
];

有关模型验证的更多信息,请访问文档页面.

Hint

hint - 等同于partial 字段,但呈现在用户可以隐藏的提示容器内。

content:
    type: hint
    path: content_field

Number

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

your_age:
    label: Your Age
    type: number
    step: 1  # defaults to 'any'
    min: 1   # defaults to not present
    max: 100 # defaults to not present

如果您想在保存时验证此字段服务器端以确保它是数字,请使用$rules您模型上的属性,如下所示:

/**
 * @var array Validation rules
 */
public $rules = [
    'your_age' => 'numeric',
];

有关模型验证的更多信息,请访问文档页面.

Partial

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

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

NOTE: 如果您的部分字段仅用于显示并且不会向要存储的服务器提供值,那么最好在字段名称前加上下划线 (_)防止 FormController` 行为试图处理它

Password

password - 呈现单行密码字段。也可以看看sensitive,对于应该能够根据要求披露的敏感数据。

user_password:
    label: Password
    type: password

电台列表

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

security_level:
    label: Access Level
    type: radio
    default: guests
    options:
        all: All
        registered: Registered only
        guests: Guests only

无线电列表还可以支持辅助描述。

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

单选列表支持与定义选项相同的方法下拉字段类型.对于单选列表,该方法可以返回简单数组:键=>值 或用于提供描述的数组数组:键=> [标签,描述].通过指定,选项可以相互内联显示,而不是在单独的行中cssClass: 'inline-options' 在无线电场配置上。

Range

range - 呈现一个只接受数字的滑块。

your_age:
    label: Progress
    type: range
    step: 1  # defaults to 1
    min: 0   # defaults to 0
    max: 100 # defaults to 100

Section

section - 呈现部分标题和副标题。这labelcomment 值是可选的,包含标题和副标题的内容。

user_details_section:
    label: User details
    type: section
    comment: This section contains details about the user.

Switch

switch - 呈现一个开关盒。

show_content:
    label: Display content
    type: switch
    comment: Flick this switch to display content
    on: myauthor.myplugin::lang.models.mymodel.show_content.on
    off: myauthor.myplugin::lang.models.mymodel.show_content.off

Text

text - 呈现单行文本框。如果没有指定,这是默认使用的类型。

blog_title:
    label: Blog Title
    type: text

Textarea

textarea - 呈现多行文本框。还可以使用可能的值指定大小:tiny,small,large,huge,giant.

blog_contents:
    label: Contents
    type: textarea
    size: large

Widget

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

blog_content:
    type: Backend\FormWidgets\RichEditor
    size: huge

表单小部件

标准包含各种表单小部件,尽管插件通常提供自己的自定义表单小部件。你可以阅读更多关于表单小部件 文章。

- [Code editor](#widget-codeeditor) - [Color picker](#widget-colorpicker) - [Data table](#widget-datatable) - [Date picker](#widget-datepicker) - [File upload](#widget-fileupload) - [Icon picker](#widget-iconpicker) - [Markdown editor](#widget-markdowneditor) - [Media finder](#widget-mediafinder) - [Nested Form](#widget-nestedform) - [Record finder](#widget-recordfinder) - [Relation](#widget-relation) - [Repeater](#widget-repeater) - [Rich editor / WYSIWYG](#widget-richeditor) - [Sensitive](#widget-sensitive) - [Tag list](#widget-taglist)

代码编辑器

codeeditor - 为格式化代码或标记呈现纯文本编辑器。请注意,这些选项可能会被后台为管理员定义的代码编辑器首选项所继承。

css_content:
    type: codeeditor
    size: huge
    language: html
Option Description
autoclosing 自动关闭标签和特殊边界字符,如引号、圆括号或方括号。默认true.
autocompletion 设置自动完成模式,出于manual,basiclive.默认:manual.
codeFolding 定义使用的代码折叠模式,出于manual,markbegin (在代码块的开头显示折叠切换)和markend (在代码块的末尾显示折叠切换)。默认:manual.
displayIndentGuides 如果true, 缩进指南将在编辑器中可见。默认:true.
enableSnippets 允许编辑器使用片段。默认:true.
fontSize 文本字体大小。默认:12.
highlightActiveLine 突出显示文本光标所在的活动行。默认:true.
language 代码语言,例如php、css、javascript、html。默认:php.
margin 设置编辑器边距大小。默认:0.
showGutter 显示带有行号的装订线。默认:true.
showInvisibles 显示不可见字符,如空格、制表符和换行符。默认:false.
showPrintMargin 显示打印边距。默认:false.
tabSize 定义多少个空格代表一级缩进。默认:4.
theme 设置编辑主题.默认:twilight.
useSoftTabs 如果true, 使用软制表符(空格)进行缩进。默认:true.
wrapWords 将长行换成新行。默认true.

选色器

colorpicker - 呈现控件以选择颜色值。

color:
    label: Background
    type: colorpicker
Option Description
availableColors 可用颜色列表。如果未提供,小部件将使用全局可用颜色。
allowCustom 如果false, 只有指定的颜色availableColors 将可供选择。颜色选择器调色板选择器将被禁用。默认:true
allowEmpty 允许空输入值。默认:false
formats 指定要存储的颜色格式。可以是字符串或值数组cmyk,hex,hslrgb.指定all 作为字符串将允许所有格式。默认:hex
showAlpha 如果true,不透明度滑块将可用。默认:false

有两种方法可以为颜色选择器提供可用的颜色。第一种方法定义了availableColors 直接作为 YAML 文件中的颜色代码列表:

color:
    label: Background
    type: colorpicker
    availableColors: ['#000000', '#111111', '#222222']

第二种方法使用模型类中声明的特定方法。此方法应返回与上例格式相同的颜色数组。这个方法的第一个参数是字段名,第二个是字段的当前值,第三个是整个表单的当前数据对象。

color:
    label: Background
    type: colorpicker
    availableColors: myColorList

在模型类中提供可用的颜色:

public function myColorList($fieldName, $value, $formData)
{
    return ['#000000', '#111111', '#222222']
}

如果availableColors YAML 文件中未定义的字段,颜色选择器使用一组 20 种默认颜色。您还可以定义一组自定义的默认颜色,以用于所有没有availableColors 字段指定。这可以在自定义后端 设置区域。

数据表

datatable - 呈现可编辑的记录表,格式为网格。单元格内容可以直接在网格中编辑,允许管理多行和多列信息。

NOTE: 为了将其与模型一起使用,该字段应定义为jsonable 属性,或作为另一个可以处理存储数组数据的属性。

data:
    type: datatable
    adding: true
    btnAddRowLabel: Add Row Above
    btnAddRowBelowLabel: Add Row Below
    btnDeleteRowLabel: Delete Row
    columns: []
    deleting: true
    dynamicHeight: true
    fieldName: null
    height: false
    keyFrom: id
    recordsPerPage: false
    searching: false
    toolbar: []

表格配置

下面列出了数据表控件本身的配置值。

Option Description
adding 允许将记录添加到数据表中。默认:true.
btnAddRowLabel 为“在上方添加行”按钮定义自定义标签。
btnAddRowBelowLabel 为“在下方添加行”按钮定义自定义标签。
btnDeleteRowLabel 为“删除行”按钮定义自定义标签。
columns 一个数组,表示数据表的列配置。见列配置 下面的部分。
deleting 允许从数据表中删除记录。默认:false.
dynamicHeight 如果true,数据表的高度将根据添加的记录扩展或收缩,直到达到由height 配置值。默认:false.
fieldName 定义在从数据表发送的 POST 数据中使用的自定义字段名称。留空以使用默认字段别名。
height 数据表的高度,以像素为单位。如果设置为false,数据表将拉伸以适应字段容器。
keyFrom 用于对每条记录进行键控的数据属性。这通常应该设置为id.仅支持整数值。
postbackHandlerName 指定将在其中发送数据表内容的 AJAX 处理程序名称。当设置为null (默认),将从包含数据表的表单使用的请求名称中自动检测处理程序名称。建议保留为null.
recordsPerPage 每页显示的记录数。如果设置为false,分页将被禁用。
searching 允许通过搜索框搜索记录。默认:false.
toolbar 一个数组,表示数据表的工具栏配置。

列配置

数据表小部件允许通过columns 配置变量。每列都应该使用字段名作为键,并使用以下配置变量来设置字段。

Example:

columns:
    id:
        type: string
        title: ID
        validation:
            integer:
                message: Please enter a number
    name:
        type: string
        title: Name
Option Description
type 此列的单元格的输入类型。必须是以下之一:string,checkbox,dropdown 或者autocomplete.
options 为了dropdownautocomplete 仅列 - 这指定将返回可用选项的 AJAX 处理程序,作为一个数组。数组键用作选项的值,数组值用作选项标签。
readOnly 此列是否为只读。默认:false.
title 定义列的标题。
validation 指定列单元格内容验证的数组。见列验证 下面的部分。
width 定义列的宽度,以像素为单位。

列验证

可以针对以下类型的验证来验证列单元格。验证应指定为数组,验证类型用作键,可选消息指定为message 该验证的属性。

Validation Description
float 将数据验证为浮点数。一个可选的布尔值allowNegative 可以提供属性,允许负浮点数。
integer 将数据验证为整数。一个可选的布尔值allowNegative 可以提供属性,允许负整数。
length 验证数据是否具有特定长度。一个整数minmax 必须提供属性,表示必须输入的最小和最大字符数。
regex 根据正则表达式验证数据。一个字符串pattern 必须提供属性,定义用于测试数据的正则表达式。
required 验证必须在保存前输入数据。

日期选择器

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

published_at:
    label: Published
    type: datepicker
    mode: date
Option Description
mode 预期结果,日期、日期时间或时间。默认:datetime.
format 提供明确的日期显示格式。例如:Y-m-d
minDate 可以选择的最小/最早日期。
maxDate 可以选择的最大/最晚日期。
firstDay 一周的第一天。默认值:0(星期日)。
showWeekNumber 在行首显示周数。默认:false
ignoreTimezone 完全按照显示的方式存储日期和时间,忽略后端指定的时区首选项。

上传文件

fileupload - 呈现图像或常规文件的文件上传器。

avatar:
    label: Avatar
    type: fileupload
    mode: image
    imageHeight: 260
    imageWidth: 260
    thumbOptions:
        mode: crop
        offset:
            - 0
            - 0
        quality: 90
        sharpen: 0
        interlace: false
        extension: auto
Option Description
mode 预期的文件类型,文件或图像。默认值:图像。
imageWidth 如果使用图像类型,图像将被调整到这个宽度,可选。
imageHeight 如果使用图像类型,图像将被调整到这个高度,可选。
fileTypes 上传者接受的文件扩展名,可选。例如:zip,txt
mimeTypes 上传者接受的 MIME 类型,作为文件扩展名或完全限定名称,可选。例如:bin,txt
maxFilesize 上传者接受的文件大小(以 Mb 为单位),可选。默认值:来自“upload_max_filesize”参数值
useCaption 允许为文件设置标题和描述。默认值:真
prompt 为上传按钮显示的文本,仅适用于文件,可选。
thumbOptions 传递给文件缩略图生成方法的选项
attachOnUpload 如果父记录存在,则在上传时自动附加上传的文件,而不是使用延迟绑定在保存父记录时附加。默认为假。

NOTE: 不像媒体查找器表单小部件,文件上传 FormWidget 使用数据库文件附件;所以字段名必须匹配一个有效的attachOne 或者attachMany 与表单关联的模型上的关系。IMPORTANT: 具有此字段类型使用的名称的数据库列(即具有现有名称的数据库列attachOne 或者attachMany 关系)will 导致此 FormWidget 中断。将数据库列与 Media Finder FormWidget 结合使用,将文件附件关系与 File Upload FormWidget 结合使用。

图标选取器

iconpicker - 呈现一个图标选择器,默认情况下由 WinterCMS 包含的 Font Awesome 图标提供支持。

icon:
    label: 'Icon'
    type: 'iconpicker'
    default: 'far icon-address-book'
    libraries: ~/modules/backend/formwidgets/iconpicker/meta/libraries.yaml
Option Description
default 默认所需的图标,例如far icon-address-book, 选修的。
libraries 字体库,文件或数组格式,可选。默认:~/modules/backend/formwidgets/iconpicker/meta/libraries.yaml 其中包括 Font Awesome 图标。

或者,您可以填充libraries 具有用户定义的库数组的属性(在下面的示例中far) 带有特定图标。

icon:
    label: 'Icon'
    type: 'iconpicker'
    default: 'far icon-address-book'
    libraries:
        -
            id: 'far'
            title: "Font Awesome Regular"
            prefix: "far icon-"
            listicon: "far icon-circle"
            icons:
                - "far icon-address-book"
                - "far icon-address-card"

NOTE: 如果不default 提供时,输入将保持为空,而图标选择器一旦加载,将集中在第一个可用图标上。

降价编辑器

markdown - 呈现降价格式文本的基本编辑器。

md_content:
    type: markdown
    size: huge
    mode: split
Option Description
mode 预期的视图模式,选项卡或拆分。默认:tab.

媒体查找器

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

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

NOTE: 不像文件上传表单小组件, Media Finder FormWidget 将其数据存储为表示媒体库中所选图像路径的字符串。

嵌套形式

nestedform - 将嵌套表单呈现为该字段的内容,并将表单数据作为数组返回。

NOTE: 为了将其与模型一起使用,该字段应定义为jsonable 属性,或作为另一个可以处理存储数组数据的属性。

content:
    type: nestedform
    usePanelStyles: false
    form:
        fields:
            added_at:
                label: Date added
                type: datepicker
            details:
                label: Details
                type: textarea
            title:
                label: This the title
                type: text
        tabs:
            meta_title:
                lable: Meta Title
                tab: SEO
            color:
                label: Color
                type: colorpicker
                tab: Design
        secondaryTabs:
            is_active:
                label: Active
                type: checkbox
            logo:
                label: Logo
                type: mediafinder
                mode: image

嵌套表单提供了一种整理可重用字段并使它们以多种形式可用的方法。嵌套表单支持与普通表单相同的语法,包括选项卡和辅助选项卡以及外部字段。嵌套表单的给定字段名称将包含嵌套表单的整个结构和值作为 JSON 数组。甚至可以在嵌套表单中使用嵌套表单。

Option Description
form 包含表单定义
usePanelStyles 定义嵌套表单是否应该用面板容器包装(默认值true)

记录查找器

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

user:
    label: User
    type: recordfinder
    list: ~/plugins/winter/user/models/user/columns.yaml
    recordsPerPage: 10
    title: Find Record
    prompt: Click the Find button to find a user
    keyFrom: id
    nameFrom: name
    descriptionFrom: email
    conditions: email = "bob@example.com"
    scope: whereActive
    searchMode: all
    searchScope: searchUsers
    useRelation: false
    modelClass: Winter\User\Models\User
Option Description
keyFrom 在用于键的关系中使用的列的名称。默认:id.
nameFrom 在用于显示名称的关系中使用的列名称。默认:name.
descriptionFrom 在用于显示描述的关系中使用的列名。默认:description.
title 要在弹出窗口的标题部分中显示的文本。
prompt 没有选择记录时显示的文本。这%s 字符代表搜索图标。
list 配置数组或对列表列定义文件的引用,请参阅列出列.
recordsPerPage 每页显示的记录,使用 0 表示没有页面。默认值:10
conditions 指定要应用于列表模型查询的原始 where 查询语句。
scope 指定一个查询范围方法 定义在相关表格模型 始终应用于列表查询。第一个参数将包含小部件将附加其值的模型,即父模型。
searchMode 将搜索策略定义为包含所有单词、任何单词或确切短语。支持的选项:all、any、exact。默认:all.
searchScope 指定一个查询范围方法 定义在相关表格模型 要应用于搜索查询,第一个参数将包含搜索词。
useRelation 使用字段名称作为关系名称直接在父模型上进行交互的标志。默认:true.设置false 为了绕过关系逻辑并仅使用其主键存储和检索所选记录。最适合用于jsonable 属性 或者无法加载关系的地方。NOTE: 禁用时,字段名称MUST 是将存储/检索值的字段的实际名称,它不能是关系的名称。
modelClass 当 useRelation = false 时用于列出记录的模型类

Relation

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

categories:
    label: Categories
    type: relation
    nameFrom: title

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

user:
    label: User
    type: relation
    select: concat(first_name, ' ', last_name)

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

Option Description
nameFrom 用于显示关系标签的模型属性名称。默认:name.
select 用于名称的自定义 SQL 选择语句。
order 用于对选项进行排序的顺序子句。例子:name desc.
emptyOption 没有可用选择时显示的文本。
scope 指定一个查询范围方法 定义在相关表格模型 始终应用于列表查询。

Repeater

repeater - 呈现其中定义的一组重复的表单字段。

extra_information:
    type: repeater
    titleFrom: title_when_collapsed
    form:
        fields:
            added_at:
                label: Date added
                type: datepicker
            details:
                label: Details
                type: textarea
            title_when_collapsed:
                label: This field is the title when collapsed
                type: text
Option Description
form 对表单字段定义文件的引用,请参阅后端表单域.也可以使用内联字段。
prompt 为创建按钮显示的文本。默认:Add new item.
titleFrom 用作项目标题的字段名称。当项目在转发器中折叠时,这会将字段的值显示为标题。请注意,仅支持文本字段和下拉字段。在组模式下不起作用。
minItems 所需的最少物品。在不使用组时预先显示这些项目。例如,如果你设置'最小项目:1' 第一行将显示而不是隐藏。
maxItems 中继器内允许的最大项目数。
groups 引用一组表单字段,将中继器置于组模式(见下文)。也可以使用内联定义。
sortable 转发器中的项目是否可以重新排序。默认:true.
style 申请转发器项目的行为风格。可以是以下之一:default,collapsed 或者accordion.见中继器样式 下面的部分了解更多信息。

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

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

这是组配置文件的示例,该文件位于/plugins/acme/blog/config/repeater_fields.yaml.或者,这些定义可以与中继器内联指定。

textarea:
    name: Textarea
    description: Basic text field
    icon: icon-file-text-o
    fields:
        text_area:
            label: Text Content
            type: textarea
            size: large

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

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

Option Description
name 组的名称。
description 对该组的简要描述。
icon 定义组的图标,可选。
fields 属于该组的表单字段,请参见后端表单域.

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

直放站样式

style 转发器小部件的属性控制转发器项目的行为。开发人员可以使用三种不同类型的样式:

丰富的编辑器/所见即所得

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

html_content:
    type: richeditor
    toolbarButtons: bold|italic
    size: huge
Option Description
toolbarButtons 在编辑器工具栏上显示哪些按钮。

可用的工具栏按钮有:

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

NOTE:| 将在工具栏中插入一条垂直分隔线,并且- 一个水平的。

Sensitive

sensitive - 呈现可显示的密码字段,可用于敏感信息,如 API 密钥或机密、配置值等。敏感字段可根据用户请求切换可见和隐藏。

包含先前输入值的敏感字段将在加载时将值替换为占位符值,以防止根据长度猜测或复制该值。显示值后,原始值由 AJAX 检索并填充到字段中。

api_secret:
    type: sensitive
    allowCopy: false
    hideOnTabChange: true
Option Description
allowCopy 向敏感字段添加“复制”操作,允许用户在不泄露密码的情况下复制密码。默认:false
hiddenPlaceholder 设置用于模拟隐藏的、未显示的值的占位符文本。您可以将其更改为长字符串或短字符串以模拟不同的长度值。默认:__hidden__
hideOnTabChange 如果为 true,则当用户导航到不同的选项卡或最小化浏览器时,敏感字段将自动隐藏。默认:true

标签列表

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

tags:
    type: taglist
    separator: space

标签列表支持与定义选项相同的方法下拉字段类型.

tags:
    type: taglist
    options:
        - Red
        - Blue
        - Orange

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

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

表单视图

对于您的表单支持的每个页面Create,UpdatePreview 你应该提供一个查看文件 具有相应的名称 -create.htm,update.htmpreview.htm.

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

创建视图

create.htm 视图表示允许用户创建新记录的创建页面。典型的创建页面包含面包屑、表单本身和表单按钮。这data-request 属性应该是指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() ?>

更新视图

update.htm 视图表示允许用户更新或删除现有记录的更新页面。典型的更新页面包含面包屑、表单本身和表单按钮。更新页面与创建页面非常相似,但通常有删除按钮。这data-request 属性应该是指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="wn-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() ?>

预览视图

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

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

将条件应用于字段

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

输入预设转换器

输入预设转换器定义为preset 表单域选项 并允许您将输入到元素中的文本转换为另一个输入元素中的 URL、slug 或文件名值。

在这个例子中,我们将自动填写url 用户在其中输入文本时的字段值title 场地。如果文字你好世界 为标题输入,URL 将跟随转换后的值/hello-world.只有当目标字段 (url) 是空的且未被触及。

title:
    label: Title

url:
    label: URL
    preset:
        field: title
        type: url

或者,preset value 也可以是引用的字符串field 只有type 然后选项将默认为slug.

slug:
    label: Slug
    preset: title

以下选项可用于preset 选项:

Option Description
field 定义其他字段名称以从中获取值。
type 指定转换类型。有关支持的值,请参见下文。
prefixInput 可选,使用 CSS 选择器在提供的输入元素中找到的值作为转换值的前缀。

以下是支持的类型:

Type Description
exact 复制确切的值
slug 将复制的值格式化为 slug
url 与 slug 相同,但以 / 为前缀
camel 使用 camelCase 格式化复制的值
file 将复制的值格式化为文件名,空格替换为破折号

触发事件

触发事件定义为trigger 表单域选项 并且是一个使用 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 定义指定了这些选项:

Option Description
action 定义满足条件时应用于此字段的操作。支持的值:show,hide,enable,disable,empty.
field 定义将触发操作的其他字段名称。通常字段名是指同级表单中的一个字段。例如,如果此字段位于转发器小部件, 只有相同的字段转发器小部件 将被检查。但是,如果字段名称前面有插入符号^ 喜欢:^parent_field,它将指一个转发器小部件 或形成比领域本身更高的层次。此外,如果有多个插入符^ 被使用,它会引用更高的级别:^^grand_parent_field,^^^grand_grand_parent_field, ETC。
condition 确定指定字段应满足的条件才能被视为“真”。支持的值:checked,unchecked,value[somevalue].要匹配多个值,可以使用以下语法:value[somevalue][othervalue].

字段依赖

表单字段可以通过定义声明对其他字段的依赖dependsOn 表单域选项 它提供了更强大的服务器端解决方案,用于在修改字段依赖项时更新字段。当声明为依赖项的字段发生变化时,定义字段将使用 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 模型内部的方法,在过滤表单域 部分。下面提供了一个示例:

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;
    }
}

在上面的例子中,两个provider1provider2 无论何时,字段都会自动刷新dnsprovider或者registrar 字段被修改。发生这种情况时,将处理完整的表单循环,这意味着定义在filterFields 方法将再次运行,允许您过滤动态显示的字段。

防止提交字段

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

address:
    label: Title
    type: text

_map:
    label: Point your address on the map
    type: mapviewer

扩展表单行为

有时您可能希望修改默认的表单行为,有几种方法可以做到这一点。

表单模型事件

可以在生命周期的不同点调用多个控制器方法FormController 为自定义逻辑提供注入点。见API文档 以获得它们是什么的完整参考。一般来说,API 文档中的任何方法都带有前缀form 可以在您的控制器中重写以更改默认行为或充当自定义逻辑的注入点。

NOTE: 可能更希望使用模型事件 而是实施您的逻辑,因为无论与模型的交互发生在何处,如果模型受到影响,这些逻辑总是在适用时运行。

覆盖控制器动作

您可以使用自己的逻辑create,update 或者preview 控制器中的 action 方法,然后可选地调用 Form 行为父方法。

public function update($recordId, $context = null)
{
    //
    // Do any custom code here
    //

    // Call the FormController behavior update() method
    return $this->asExtension('FormController')->update($recordId, $context);
}

覆盖控制器重定向

您可以通过覆盖formGetRedirectUrl 方法。此方法返回重定向到的位置,相对 URL 被视为后端 URL。

public function formGetRedirectUrl($context = null, $model = null)
{
    return 'https://example.com';
}

扩展模型查询

表单的查找查询数据库模型 可以通过重写来扩展formExtendQuery 控制器类中的方法。此示例将通过应用withTrashed 查询范围:

public function formExtendQuery($query)
{
    $query->withTrashed();
}

扩展表单域

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

class Categories extends \Backend\Classes\Controller
{
    /**
     * @var array List of behaviors implemented by this controller
     */
    public $implement = [
        \Backend\Behaviors\FormController::class,
    ];
}

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

Categories::extendFormFields(function($form, $model, $context)
{
    if (!$model instanceof MyModel) {
        return;
    }

    $form->addFields([
        'my_field' => [
            'label'   => 'My Field',
            'comment' => 'This is a custom field I have added.',
        ],
    ]);

});

您还可以通过覆盖formExtendFields 控制器类中的方法。这只会影响FormController 行为。

class Categories extends \Backend\Classes\Controller
{
    [...]

    public function formExtendFields($form)
    {
        $form->addFields([...]);
    }
}

$form 对象可以使用以下方法。

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

每个方法都采用类似于表单字段配置.

过滤表单域

您可以通过覆盖filterFields 使用的模型内部的方法。这允许您根据模型数据操纵可见性和其他字段属性。该方法有两个参数$fields 将代表已经定义的字段的对象现场配置$context 表示活动表单上下文。

public function filterFields($fields, $context = null)
{
    if ($this->source_type == 'http') {
        $fields->source_url->hidden = false;
        $fields->git_branch->hidden = true;
    }
    elseif ($this->source_type == 'git') {
        $fields->source_url->hidden = false;
        $fields->git_branch->hidden = false;
    }
    else {
        $fields->source_url->hidden = true;
        $fields->git_branch->hidden = true;
    }
}

上面的例子将设置hidden 通过检查 Model 属性的值来标记某些字段source_type.此逻辑将在表单首次加载时以及由定义的字段依赖.

验证表单域

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

豫ICP备18041297号-2