多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 关系行为 ## 关系行为 ### [](https://octobercms.com/docs/backend/relations#introduction)介绍 **关系行为**是控制器修改器,用于轻松管理页面上的复杂[模型](https://octobercms.com/docs/database/model)关系。不要与仅提供简单管理的[列表关系列](https://octobercms.com/docs/backend/lists#column-types)或[表单关系字段](https://octobercms.com/docs/backend/forms#widget-relation)混淆。 关系行为取决于[关系定义](https://octobercms.com/docs/backend/relations#relation-definitions)。为了使用关系行为,您应该将`Backend.Behaviors.RelationController`定义添加到`$implement`控制器类的字段中。另外,`$relationConfig`应该定义class属性,并且其值应引用用于[配置行为选项](https://octobercms.com/docs/backend/relations#configuring-relation)的YAML文件。 ~~~ namespace Acme\Projects\Controllers; class Projects extends Controller { public $implement = [ 'Backend.Behaviors.FormController', 'Backend.Behaviors.RelationController', ]; public $formConfig = 'config_form.yaml'; public $relationConfig = 'config_relation.yaml'; } ~~~ > **注意:**关系行为经常与[表单行为](https://octobercms.com/docs/backend/form)一起使用。 ### [](https://octobercms.com/docs/backend/relations#configuring-relation)配置关系行为 `$relationConfig`属性中引用的配置文件以YAML格式定义。该文件应放置在控制器的[views目录中](https://octobercms.com/docs/backend/controllers-ajax/#introduction)。所需的配置取决于目标模型和相关模型之间的[关系类型](https://octobercms.com/docs/backend/relations#relationship-types)。 关系配置文件中的第一级字段定义目标模型中的关系名称。例如: ~~~ class Invoice { public $hasMany = [ 'items' => ['Acme\Pay\Models\InvoiceItem'], ]; } ~~~ 具有关联关系的*Invoice*模型`items`应使用相同的关联名称定义第一级字段: ~~~ # =================================== # Relation Behavior Config # =================================== items: label: Invoice Line Item view: list: $/acme/pay/models/invoiceitem/columns.yaml toolbarButtons: create|delete manage: form: $/acme/pay/models/invoiceitem/fields.yaml recordsPerPage: 10 ~~~ 然后,以下选项用于每个关系名称定义: | 选项 | 描述 | | --- | --- | | **label** | 该关系的标签,以单数形式表示。 | | **view** | 特定于视图容器的配置,请参见下文。 | | **manage** | 特定于管理弹出窗口的配置,请参见下文。 | | **pivot** | 表单字段定义文件的引用,用于[与数据透视表数据建立关系](https://octobercms.com/docs/backend/relations#belongs-to-many-pivot)。 | | **emptyMessage** | 关系为空时显示的消息,可选。 | | **readOnly** | 禁用添加,更新,删除或创建关系的功能。默认值:false | | **deferredBinding** | [](https://octobercms.com/docs/database/model#deferred-binding)可用[会话密钥延迟所有绑定操作](https://octobercms.com/docs/database/model#deferred-binding)。默认值:false | 可以为**view**或**manage**选项指定这些配置值,适用于列表,表单或两者的呈现类型。 | 选项 | 类型 | 描述 | | --- | --- | --- | | **form** | Form | 表单域定义文件的参考,请参阅[后端表单域](https://octobercms.com/docs/backend/forms#form-fields)。 | | **list** | List | 对列表列定义文件的引用,请参阅[后端列表列](https://octobercms.com/docs/backend/lists#list-columns)。 | | **showSearch** | List | 显示用于搜索记录的输入。默认值:false | | **showSorting** | List | 在每一列上显示排序链接。默认值:true | | **defaultSort** | List | 未定义用户首选项时,设置默认的排序列和方向。支持带键`column`和的字符串或数组`direction`。 | | **recordsPerPage** | List | 每页显示的最大行数。 | | **noRecordsMessage** | List | 找不到记录时显示的消息,可以引用[本地化字符串](https://octobercms.com/docs/plugin/localization)。 | | **conditions** | List | 指定要应用于列表模型查询的原始where查询语句。 | | **scope** | List | 指定在**相关表单模型中**定义的[查询范围方法](https://octobercms.com/docs/database/model#query-scopes),以始终应用于列表查询。该关系将附加到的**模型**(即**父模型**)作为第二个参数(是第一个)传递给此范围方法。`$query` | | **filter** | List | 对过滤器作用域定义文件的引用,请参阅[后端列表过滤器](https://octobercms.com/docs/backend/lists#list-filters)。 | 只能为**视图**选项指定这些配置值。 | 选项 | 类型 | 描述 | | --- | --- | --- | | **showCheckboxes** | 清单 | 在每个记录旁边显示复选框。 | | **recordUrl** | 清单 | 将每个列表记录链接到另一个页面。例如:**users / update /:id**。该`:id`部分将替换为记录标识符。 | | **customViewPath** | 清单 | 指定一个自定义视图路径以覆盖列表使用的部分。 | | **recordOnClick** | 清单 | 单击记录时执行的自定义JavaScript代码。 | | **toolbarPartial** | 都 | 使用工具栏按钮对控制器部分文件的引用。例如:**\_relation\_toolbar.htm**。此选项将覆盖工具*栏按钮*选项。 | | **toolbarButtons** | 都 | 要显示的按钮集。可以将其格式化为数组或管道分隔的字符串,或设置为`false`不显示任何按钮。可用的选项有:`create`,`update`,`delete`,`add`,`remove`,`link`,和`unlink`。范例:`add\|remove`。 另外,您可以通过将此属性设置为关联数组来自定义这些按钮内的文本,其中键为按钮类型,值为该按钮的文本。范例:`create: 'Assign User'`。该值还支持翻译。 | 只能为**manage**选项指定这些配置值。 | 选项 | 类型 | 描述 | | --- | --- | --- | | **title** | 都 | 弹出标题,可以引用[本地化字符串](https://octobercms.com/docs/plugin/localization)。 此外,可以通过将每个模式的标题设置为关联数组来分别自定义每种模式的标题,其中键为模式,值为显示该模式时使用的标题。例如:`form: acme.blog::lang.subcategory.FormTitle`。 | | **context** | 形成 | 显示表单的上下文。可以是字符串或带有键的数组:创建,更新。 | ### [](https://octobercms.com/docs/backend/relations#relation-display)显示关系经理 在可以在任何页面上管理关系之前,必须首先通过调用`initRelation`方法在控制器中初始化目标模型。 ~~~ $post = Post::where('id', 7)->first(); $this->initRelation($post); ~~~ > **注:**该[表单行为](https://octobercms.com/docs/backend/forms)在其创建,更新和预览操作将自动初始化模型。 然后可以通过调用该`relationRender`方法为指定的关系定义显示关系管理器。例如,如果要在“[预览”](https://octobercms.com/docs/backend/forms#form-preview-view)页面上显示关系管理器,**preview.htm**视图的内容可能如下所示: ~~~ <?= $this->formRenderPreview() ?> <?= $this->relationRender('comments') ?> ~~~ 您可以通过将选项作为第二个参数传递来指示关系管理器以只读模式呈现: ~~~ <?= $this->relationRender('comments', ['readOnly' => true]) ?> ~~~