stevie-mayhew / hasoneedit
允许在 CMS 中直接编辑 has_one 对象的字段
Requires
- silverstripe/asset-admin: ~1.0 || ~2.0
- silverstripe/framework: ~4.0 || ~5.0
Replaces
README
此模块允许您直接编辑相关 has_one
对象的字段,而无需与 GridField
或 ModelAdmin
的链接纠缠。如果相关的 has_one
对象尚不存在,则此模块还会在第一次写入时为您创建对象并设置关系。
此模块已测试过在 GridFieldDetailForm
和 CMSMain
中的通用 Page
上编辑 has_one
。
要求
SilverStripe 4.x。
已在 4.0.x-dev 上进行基本测试。随着 SS4 越来越稳定,可能需要进行大量测试。
使用方法
要使用此模块,只需在您的 getCMSFields()
方法中为您对象的 CMS 字段添加一个字段。字段名称应为 HasOneName-_1_-FieldName
。
例如,假设您有一个名为 Show
的 has_one
,该 has_one
有一个名为 Title
的字段,您想编辑。您会添加字段 TextField::create('Show-_1_-Title', 'Show 标题')
。
如果您不需要输出的字段名称与您提供的值匹配,您也可以使用冒号作为分隔符而不是 -_1_-
。
使用 ProvidesHasOneInlineFields
特性生成字段
如果您只想显示相关对象的全部 CMS 字段,您可以将 ProvidesHasOneInlineFields
特性添加到对象中。这将添加一个方法,该方法调用您的 DataObject
上的 getCMSFields()
并返回该对象的 FormField
。这些 FormField
将通过添加关系名称和分隔符到它们的名称来转换为使用此模块。
在您想要显示字段的拥有对象中,调用 HasOneEdit::getInlineFields($this, 'my_has_one_name', ['db'])
。这将返回用于添加到 CMS 的 db
子集字段 - 例如,您可以通过调用 $fields->addFieldsToTab('Root.RelatedObject', HasOneEdit::getInlineFields($this, 'Relation', ['db']))
来显示相关对象的字段在其自己的标签页中。
这具有运行整个 getCMSFields()
调用树(例如,updateCMSFields
为任何通过扩展提供的功能)等优势,而无需在许多地方重复逻辑。
您还可以实现一个方法 public function provideHasOneInlineFields($relationName)
返回 FieldList|FormField[]
,以提供不同于 getCMSFields()
的自定义界面(例如,仅一小部分字段)。在这种情况下,所有字段名称都应采用以下形式 $relationName . HasOneEdit::FIELD_SEPARATOR . $dataObjectFieldName
。即使您的类不使用 ProvidesHasOneInlineFields
特性,此方法也将由 HasOneEdit::getInlineFields
调用。
与您的表单一起使用
要为您的表单添加支持,您需要将 SGN\HasOneEdit\UpdateFormExtension
扩展添加到控制器中,并在将表单返回到模板之前调用 $this->extend('updateEditForm', $form)
。否则,字段将不会用 has_one
的值填充,尽管保存将正常工作。