企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# 表单行为 ### [](https://octobercms.com/docs/backend/forms#extend-form-behavior)扩展表单行为 有时您可能希望修改默认的表单行为,并且有几种方法可以执行此操作。 ### [](https://octobercms.com/docs/backend/forms#overriding-action)覆盖控制器动作 您可以使用自己的逻辑`create`,`update`或`preview`操作方法在控制器中,然后任选调用表单行为父类的方法。 ~~~ public function update($recordId, $context = null) { // // Do any custom code here // // Call the FormController behavior update() method return $this->asExtension('FormController')->update($recordId, $context); } ~~~ ### [](https://octobercms.com/docs/backend/forms#overriding-redirect)覆盖控制器重定向 您可以通过覆盖`formGetRedirectUrl`方法指定保存模型后重定向到的URL。此方法返回将重定向到的位置,并将相对URL视为后端URL。 ~~~ public function formGetRedirectUrl($context = null, $model = null) { return 'https://octobercms.com'; } ~~~ ### [](https://octobercms.com/docs/backend/forms#extend-model-query)扩展模型查询 可以通过覆盖控制器类内部的方法来扩展针对表单[数据库模型](https://octobercms.com/docs/database/model)的查找查询`formExtendQuery`。通过将**withTrashed**范围应用于查询,此示例将确保仍然可以找到和更新软删除的记录: ~~~ public function formExtendQuery($query) { $query->withTrashed(); } ~~~ ### [](https://octobercms.com/docs/backend/forms#extend-form-fields)扩展表单字段 您可以通过`extendFormFields`在控制器类上调用static方法从外部扩展另一个控制器的字段。此方法可以使用三个参数,**$ form**将代表Form窗口小部件对象,**$ model**代表表单使用的模型,**$ context**是包含表单上下文的字符串。以这个控制器为例: ~~~ class Categories extends \Backend\Classes\Controller { public $implement = ['Backend.Behaviors.FormController']; public $formConfig = 'config_form.yaml'; } ~~~ 使用该`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对象上可以使用以下方法。 | 方法 | 描述 | | --- | --- | | **addFields** | 将新字段添加到外部区域 | | **addTabFields** | 将新字段添加到选项卡式区域 | | **addSecondaryTabFields** | 将新字段添加到辅助选项卡式区域 | | **removeField** | 从任何区域删除字段 | 每种方法都采用类似于[表单字段配置](https://octobercms.com/docs/backend/forms#form-fields)的字段数组。 ### [](https://octobercms.com/docs/backend/forms#filter-form-fields)过滤表单字段 您可以通过覆盖所`filterFields`用模型中的方法来过滤表单字段定义。这使您可以基于模型数据来操纵可见性和其他字段属性。该方法带有两个参数,**$fields**将表示[字段配置](https://octobercms.com/docs/backend/forms#form-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`。第一次加载表单时以及通过[定义的字段依赖项](https://octobercms.com/docs/backend/forms#field-dependencies)更新时,将应用此逻辑。